App启动优化
1.操作系统启动流程和Launcher点击事件流程
2.启动⽅式以及⾸次启动
3.⿊⽩屏优化
4.启动时间内代码优化
操作系统启动
1.打开电源 引导芯⽚代码加载引导程序Boot Loader到RAM中去执⾏。
2.BootLoader把操作系统拉起来。
3.Linux 内核启动开始系统设置,到⼀个⽂件启动初始化进程。
4.init进程初始化和启动属性服务,之后开启Zygote进程。
5.Zygote开始创建JVM并注册JNI⽅法,开启SystemServer。
6.启动Binder线程沲和SystemServiceManager,并启动各种服务。
7.AMS启动Launcher即android桌⾯。
BootLoader是在操作系统内核运⾏之前运⾏。可以初始化硬件设备、建⽴内存空间映射图,从⽽将系统的软硬件环境带到⼀个合适状态,以便为最终调⽤操作系统内核准备好正确的环境。在嵌⼊式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌⼊式CPU也会内嵌⼀段短⼩的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
Launcher桌⾯图标点击事件
E:\tools\android-src\android-6.0.1_r1\packages\apps\Launcher2\src\com\android\launcher2\Launcher.java
public final class Launcher extends Activity
执⾏onClick(View view)⽅法,会把这个应⽤的相关信息传⼊
先获取⼀个intent--->startActivitySafely(v, intent, tag)--->startActivity(v, intent, tag);
-->startActivity(intent);
startActivity(intent)会开⼀个APP进程(fork zogyte进程),通过systemserver--->调⽤
ActivityThread.main()。
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);---> Create();--->加载xml
冷启动(Cold start)
冷启动是指APP在⼿机启动后第⼀次运⾏,或者APP进程被kill掉后在再次启动。
可见冷启动的必要条件是该APP进程不存在,这就意味着系统需要创建进程,通过ActivityThread.main()⼊⼝启动进程和主线程,创建activity 和application并初始化。在这三种启动⽅式中,冷启动耗时最长。
1. Loading and launching the app.
2. Displaying a blank starting window for the app immediately after launch.
3. Creating the app process.
在创建APP进程之后
1. Creating the app object.
2. Launching the main thread.
3. Creating the main activity.
4. Inflating views.
5. Laying out the screen.
6. Performing the initial draw.
当app进程完成第⼀次绘制,系统进程会⽤mainActivity替换当前的背景窗⼝,这时⽤户才能使⽤app。
温启动(Warm start)
场景就类似打开淘宝逛了⼀圈然后切到去聊天去了,过了很久淘宝的进程存在,但是Activity可能被回收。
App进程存在,当时Activity可能因为内存不⾜被回收。这时候启动App不需要重新创建进程,但是Activity的onCreate还是需要重新执⾏的。可以从savedInstanceState获取。
DisplayedTime和reportFullyDrawn()区分,DisplayedTime是在onPostResume之后官图这点是错的
reportFullyDrawn使⽤
TraceView分析
Debug.startMethodTracing(filePath);
中间为需要统计执⾏时间的代码
Debug.stopMethodTracing();
adb pull /storage/emulated/ace把⽂件拉出来分析
怎么设置主题背景把pull到电脑上的⽂件拖到AS中就可以分析了
Android vitals
分析需要 Google Play Console,可以参照官⽅⽂档
Inspect CPU activity with CPU Profiler.
可以参照官⽅⽂档,就是Androidstudio的Profiler的CPU模块,可以记录⼀段时间内代码执⾏过程和执⾏时间,个⼈建议使⽤也可以参考本⼈的⽂章
Overview of system tracing.
可以参照官⽅⽂档,短时间内记录设备活动称为 system tracing,System Tracing app是⼀个android⼯具,可以将设备活动保存到跟踪⽂件中。在运⾏android 10(api级别29)或更⾼版本的设备上,跟踪⽂件以perfetto格式保存。在运⾏早期版本android的设备上,跟踪⽂件以systrace格式保存。Systrace和Perfetto不会收集应⽤程序进程中有关代码执⾏的详细信息。有关应⽤程序正在执⾏哪些⽅法以及使⽤了多少CPU资源的详细信息。本⼈⽂章
优化⽅案:
1. 开⼦线程,做初始化,⽐如第三⽅SDK
适合不定义handler,不操作UI ,对异步要求不⾼(主线调⽤的⽅法,在⼦>线程中的初始化完成后才能调⽤),⽐如glide和greenDAO的初始化
2. 懒加载,⽤到的时候再初始化
如:⽹络OKHttp,数据库操作,这⾥的⽹络和数据库初始化⽐较快,如果像数据库升级这种⽐较耗时的就不要放在这⾥了;全局静态对象,建议使⽤singleton模式或者dagger;ContentProvider中在Static Block中初始化⼀些UriMatcher。
3. 启动页(Spalsh Screen)或者启动页+⼴告页倒计时页,启动页尽量和背景图⽚⼀样,多图通过<layer-list>处理
发布评论