Android应用程序首次启动非常慢,systrace显示30秒的bindApplication

Fly*_*mba 5 performance android systrace

我目前正在开发Android应用并试图改善开始时间.为了做到这一点,我正在使用Systrace工具.

我第一次运行应用程序(安装后),启动需要大约40秒,我得到了这个跟踪:

第一次运行

如您所见,标题为30秒浅紫色标签bindApplication.

在此之后,我关闭应用程序(从最近的活动中删除)并重新打开它.这次bindApplication标签只有4秒钟:

第二次运行

  • 有人知道第一次运行这么长时间是否正常?
  • 我该怎么做才能改善它?

我的猜测是,这bindApplication与onCreateApp方法中的繁重工作有关,但我不知道如何发生这种情况.万一它onCreate有所帮助:在我初始化以下库:Parse,Crashlytics,T​​imber,ParseFacebookUtils和Google Analytics.

编辑:

这是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;
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 10

这是即时运行的问题.我有过这种问题,如果通过禁用即时运行我解决.这里是同一个问题,您可以在问题评论中找到答案.

首次启动需要很长时间(ClassLoader引用未知路径)