我正在开发一个android应用程序,并试图改进启动时间。为此,我使用Systrace工具。
我第一次运行应用程序(在安装之后),需要大约40秒才能启动,我得到以下跟踪:
如您所见,有一个30秒浅紫色标签,标题bindApplication
。
之后,我关闭应用程序(从最近的活动中删除)并重新打开它。这次bindApplication
标签只有4秒长:
有人知道第一次跑这么长时间是否正常吗?
我能做些什么来改进它?
我的猜测是bindApplication
与onCreate
应用程序方法中的繁重工作有某种关系,但我不知道这是怎么发生的。
以防万一:在我的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;
}
}
最佳答案
这是即时运行的问题。
我曾经遇到过这样的问题,我通过禁用instant run来解决。
这是同一个问题,你可以在问题的评论中找到答案。
First launch take long time (ClassLoader referenced unknown path)