title: Android app first start is very slow and systrace shows 30 seconds of bindApplication
body: <p>I'm currently developing an Android app and trying to improve the start time. In order to do so, I'm using the <a href="https://developer.android.com/studio/profile/systrace.html" rel="noreferrer">Systrace</a> tool.</p>
  
  <p>The first time I run the app (right after installed), it takes ~40 seconds to start, and I get this trace:</p>
  
  <p><a href="https://i.stack.imgur.com/B4Nma.png" rel="noreferrer"><img src="https://i.stack.imgur.com/B4Nma.png" alt="First run"></a></p>
  
  <p>As you can see, there is a 30 seconds light purple tag with title <code>bindApplication</code>. </p>
  
  <p>After this, I close the app (swiped away from recent activities) and reopen it. This time the <code>bindApplication</code> tag is just 4 seconds long:</p>
  
  <p><a href="https://i.stack.imgur.com/P6pIT.png" rel="noreferrer"><img src="https://i.stack.imgur.com/P6pIT.png" alt="Second run"></a></p>
  
  <ul>
  <li>Does anybody know if it's normal for the first run to take so long ?</li>
  <li>What can I do to improve it ?</li>
  </ul>
  
  <p>My guess here is that <code>bindApplication</code> is related somehow to heavy work in the <code>onCreate</code> App method, but I don't see how that could happen.
  Just in case it helps: in my <code>onCreate</code> I initialize the following libraries: Parse, Crashlytics, Timber, ParseFacebookUtils and Google Analytics.</p>
  
  <p><strong>EDIT:</strong></p>
  
  <p>Here is the App subclass code:</p>
  
  <pre><code>public class MyApp extends Application {
  
    private Tracker tracker;
  
    @Override public void onCreate() {
      super.onCreate();
      if (Build.VERSION.SDK_INT &gt;= 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 &gt;= 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;
    }
  }
  </code></pre>