App启动流程分析及处理办法
- 系统层次
- launcher
- 黑白屏问题
- 1.修改位置(主题)
- 2.解决办法
- 3.qq中使用的方法
- 4.查看启动时间
- 5.Trace工具分析代码执行时间
系统层次
我们由手机开机开始来一步步走一下app启动的流程
1.开机 手机会有一个BootLoader到RAM中执行
2.BootLoader 拉起系统
3.Linux内核会启动 Kennel会加载init.c文件
4.init初始化和启动系统属性服务,开启Zygote(孵化器)进程
5.Zygote开启创建JVM注册JNI方法,开启SystemService
6.启动Binder线程池和SystemServiceManager开启各种服务
7.Ams启动launcher
大至的图形就是这样的
launcher
1.源码查看
查看源码 android-8.0.0_r1\packages\apps\Launcher2\src\com\android\launcher2
intent—>startActivitySafely(v, intent, tag)–》startActivity(v, intent, tag);–>startActivity(intent);
会开一个进程
ActivityThread.java做为入口
用attach开启app
再加载application和activity
thread.attach(false);---》mgr.attachApplication(mAppThread)会通过远端进程去
回调private void handleBindApplication(AppBindData data)
Application app = data.info.makeApplication(创建Application对象
mInstrumentation.callApplicationOnCreate(app);----》 app.onCreate();
2.优化位置
对我应用层的安卓开发工程师,我们没有办法修改系统和launcher的代码进行优化,所谓我们能下手的地方只有在Application 的oncreat()到Activity的oncreat之间进行优化
黑白屏问题
1.修改位置(主题)
白屏 <style name="AppTheme" parent="Theme.AppCompat.Light">
黑屏 <style name="AppTheme">(在以前的老版本上有效,现在的版本默认使用透明处理了)
找到一个父类name="Platform.AppCompat.Light"中定义了
<item name="android:windowBackground">用来控制黑白屏
2.解决办法
解决办法:
1.在自己的<style name="AppTheme" parent="Theme.AppCompat.Light">中加入windowsbackground
2.设置windowbackground为透明的 true
但这2种方法会有个问题,所有的activity启动都会显示
3.单独做成一个主题(假优化,用广告图代替黑白屏)
<style name="AppTheme.Launcher">
<item name="android:windowBackground">@drawable/bg</item>
</style>
<style name="AppTheme.Launcher1">
<item name="android:windowBackground">@drawable/bg</item>
</style>
<style name="AppTheme.Launcher2">
<item name="android:windowBackground">@drawable/bg</item>
</style>
再在功能清单中的单独activity下设置
<activity
android:theme="@style/AppTheme.Launcher"
然后在程序中使用setTheme(R.style.AppTheme);
让APP中所有的activity还是使用以前的样式,这样做就只有启动时才使用自己的样式
3.qq中使用的方法
<item name="android:windowDisablePreview">true</item>
<item name="android:windowBackground">@null</item>
4.查看启动时间
安卓版本4.4以前需要打开cmd用adb进行查看
4.4以前 adb shell am start -W 包名/activity全名
其中主要内容:
ThisTime:最后一个启动的Activity的启动耗时;
TotalTime:自己的所有Activity的启动耗时;
WaitTime: ActivityManagerService启动App的Activity时的总时间(包括当前Activity的onPause()和自己Activity的启动)。
这其中的日志是AM.进行打印的(对比安卓源码安卓4.4和8.0 差别很大)
android\frameworks\base\cmds\am\src\com\android\commands\am
result = mAm.startActivityAndWait(null, null, intent, mimeType,
null, null, 0, mStartFlags, mProfileFile, fd, null, mUserId);
在这里进行初始化开始计算时间
\frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java文件中计算
reportLaunchTimeLocked(SystemClock.uptimeMillis())中完成时间的统计;
4.4版本以后Logcat 输入Display筛选系统日志 不过滤信息No Filters
5.Trace工具分析代码执行时间
Debug.startMethodTracing(filePath);
... 中间为需要统计执行时间的代码
Debug.stopMethodTracing();
拿到.trace 文件拖到AS中进行分析
优化方案:
1.开线程 没建handler 没操作UI 对异步要求不高
2.懒加载 用到的时候再初始化,如网络,数据库操作
3.kotlin 携程实现初始化