【问题标题】:Android app first start is very slow and systrace shows 30 seconds of bindApplicationAndroid 应用首次启动非常慢,systrace 显示 30 秒的 bindApplication
【发布时间】:2016-07-16 05:00:31
【问题描述】:

我目前正在开发一款 Android 应用并尝试改进启动时间。为此,我使用了Systrace 工具。

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

如您所见,有一个 30 秒的浅紫色标签,标题为 bindApplication

之后,我关闭了应用程序(从最近的活动中滑开)并重新打开它。这次bindApplication 标签只有 4 秒长:

  • 有人知道第一次运行需要这么长时间是否正常吗?
  • 我可以做些什么来改进它?

我的猜测是bindApplicationonCreate App 方法中的繁重工作有关,但我不知道这是怎么发生的。 以防万一:在我的onCreate 中,我初始化了以下库:Parse、Crashlytics、Timber、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;
  }
}

【问题讨论】:

  • 在您的应用的Launcher Activity onCreate 之前,执行子类-Application 类代码。您的 Application 类中是否有任何初始化或任何其他长时间运行的代码?可能这也是您可以寻找性能的 1 个领域...
  • @AADTechnical 我只是初始化了提到的库,没有长时间运行的代码。
  • 我想您需要在代码中显示您正在执行所有这些初始化的位置。如果不查看存在性能问题的代码,很难猜测...
  • @AADTechnical 你是对的,我刚刚添加了它。

标签: android performance systrace


【解决方案1】:

这是即时运行的问题。 我曾经遇到过这种问题,如果禁用即时运行,我会解决。 这是相同的问题,您可以在问题评论中找到答案。

First launch take long time (ClassLoader referenced unknown path)

【讨论】:

  • 哇,我现在非常讨厌 Instant run。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
相关资源
最近更新 更多