2016-07-16 17 views
4

現在、Androidアプリを開発中で、開始時間を改善しようとしています。これを行うには、Systraceツールを使用しています。Androidアプリの最初の起動は非常に遅く、systraceは30秒のbindApplicationを表示します

私は(右後にインストールされている)アプリケーションを実行する最初の時間は、それが起動する〜40秒かかり、そして私は、このトレースを取得:

First run

あなたが見ることができるように、30秒があります薄い紫色のタグ、タイトルはbindApplicationです。

この後、私はアプリを閉じて(最近のアクティビティからスワイプして)、再び開きます。今回はbindApplicationタグはわずか4秒の長さ:それはそう長く取るために最初の実行のために、通常のかどう

Second run

  • 誰もが知っていますか?
  • 改善のために何ができますか?ここ

私の推測では、bindApplicationonCreateのApp方法に重い仕事に何らかの形で関係していることですが、私はそれが起こる可能性がどのように表示されません。 それが役に立った場合:私のonCreateでは、Parse、Crashlytics、Timber、ParseFacebookUtils、Google Analyticsというライブラリを初期化します。

EDIT:

ここでは、Appサブクラスコードです:

public class MyApp extends Application { 

    private Tracker tracker; 

    @Override public void onCreate() { 
    super.onCreate(); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     Trace.beginSection("MyApp"); 
    } 
    Fabric.with(this, new Crashlytics()); 

    // Parse setup 
    Parse.enableLocalDatastore(this); 
    ParseObject.registerSubclass(...); 

    Parse.Configuration.Builder parseConfigBuilder = new Parse.Configuration.Builder(this).applicationId(
     getString(R.string.parse_application_id)) 
     .server(getString(R.string.parse_server_url)); 

    if (BuildConfig.DEBUG) { 
     // add logs 
     Timber.plant(new DebugTree()); 
     Parse.setLogLevel(Parse.LOG_LEVEL_VERBOSE); 
     parseConfigBuilder.addNetworkInterceptor(new ParseLogInterceptor()); 
    } 

    Parse.initialize(parseConfigBuilder.build()); 

    ParseFacebookUtils.initialize(this); 

    ParseInstallation.getCurrentInstallation().saveInBackground(); 

    AnalyticsManager.getInstance().init(this); 
    AnalyticsManager.getInstance().debugMode(BuildConfig.DEBUG); 

    if (BuildConfig.DEBUG) { 
     StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
      .detectAll() 
      .penaltyLog() 
      .build()); 
     StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder(). 
      detectAll() 
      .penaltyLog() 
      .build()); 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     Trace.endSection(); 
    } 
    } 

    /** 
    * Gets the default {@link Tracker} for this {@link Application}. 
    * @return tracker 
    */ 
    synchronized public Tracker getDefaultTracker() { 
    if (tracker == null) { 
     GoogleAnalytics analytics = GoogleAnalytics.getInstance(this); 
     // To enable debug logging use: adb shell setprop log.tag.GAv4 DEBUG 
     tracker = analytics.newTracker(R.xml.global_tracker); 
    } 
    return tracker; 
    } 
} 
+0

前に 'あなたのアプリケーションのランチャー活動のonCreate'は、サブクラス化-Applicationクラスのコードが実行されます。あなたは、あなたのアプリケーションクラスの中に初期化やその他の長期実行コードを持っていますか?また、あなたがパフォーマンスを探すことができる1つのエリアかもしれません... – AADProgramming

+0

@AADTechnical私はちょうど上記のライブラリを、長時間実行しているコードを初期化します。 – FlyingPumba

+0

私はあなたがこれらのすべての初期化を行っているコードを表示する必要があると思います。パフォーマンス問題があるコードを見ずに推測するのは難しいです... – AADProgramming

答えて

10

それはインスタント実行の問題です。 私はかつてこの種の問題を抱えていました。ここでは は同じ質問で、質問のコメントで回答を見つけることができます。

First launch take long time (ClassLoader referenced unknown path)

+0

うわー、私はすぐにインスタント実行が嫌いです。ありがとう! – FlyingPumba

+0

この回答をお寄せいただきありがとうございます。 –

関連する問題