要优化App的启动优化,
首先我们需要知道安卓系统的启动流程:(下面流程都是C++代码)
当我们按下手机的电源键时,会触发手机的引导芯片,引导芯片会把BootLoader程序(写入到硬件的引导代码)加载到RAM(存储器)中去执行。
↓
BootLoader把操作系统拉起
↓
Linux系统init初始化设置,启动init进行和属性服务,开启一个zegote进程
↓
zegote会创建JVM(虚拟机)并注册jni方法;开启systemservice
↓
系统服务会启动binder线程池和systemservicemanage,通过system和systemservicemanager会启动各种服务例如activitymanageservice,windmanageservice..;
↓
activitymanageservice会去启动一个launcher(系统桌面启动器,手机启动看到界面就是launcher)
↓
当我们点击launcher的应用图标是,launcher会把应用的信息保存到intent里面,最终调用startactivity(intent),通知activitymanageservice ;
↓
activitymanageservice会在JVM里面开辟一块内存:堆,栈,方法区;同时通知zygote
↓
zygote会fork一个systemservice
↓
systemservice会创建一个activitythread进程(App进程)
↓ ↓
activitythread作为App的入口会先实例化application,再实例化 activity,(注意application的生命周期方法比activity的生命周期方法先执行) 再通过attach 把activity和application绑定(目的activity获取application的content)
//由于上面都是系统执行,不能直接优化
//application oncreate>> -------这中间Java代码可以优化---------- >>activity oncreate
1》启动时黑白屏的优化
黑白屏的产生:因为app启动时需要时间初始化,系统解析manifest的AppTheme主题的windbackground属性设置preview window背景颜色 ,SDK不同版本的windowbackground 颜色默认为黑色 或者 白色,导致黑白屏问题。
<!--方案1 京东 利用预加载 设置广告图片 不推荐-->
<!--<item name="android:windowBackground">@mipmap/t</item> //黑白屏优化 ,增加GPU渲染-->
<!--方案2 设置不预加载每个activity不设置背景颜色默认为黑色 不能复用背景颜色增加GPU渲染 -->
<!--<item name="android:windowBackground">@null</item> //优化GPU过度渲染问题-->
<!--<item name="android:windowDisablePreview">true</item> //设置不预览 优化黑白屏问题-->
<!--方案3 直接设置背景颜色透明 解决黑白屏问题
<item name="android:windowBackground">@android:color/transparent</item> //优化GPU过度渲染问题
<item name="android:windowIsTranslucent">true</item> //黑白屏优化(单独设置 小米8.0版本手机有异常
)
2》Application 的代码优化
App启动优化核心 尽量减少在application oncreate 到 activity oncreate之间的代码 特别是耗时代码
可以在application 使用系统工具测试那些代码耗时,做对应的处理
//总结:App的启动优化大概分两方面
1优化入口activity的黑白屏问题,(可以利用黑白屏做广告页面;或者设置为透明色)
2优化 在Application初始化的代码 使用代码耗分析工具 分析那些代码耗时,能不放在application初始化的代码就尽量不要放
---------------------------------------------------------安卓分析代码执行时间工具-------------------------------
File file = new File(Environment.getExternalStorageDirectory(), "app1.trace");
Log.i("zdh", "onCreate: " + file.getAbsolutePath());
//把分析结果存在一个文件
Debug.startMethodTracing(file.getAbsolutePath());
// ------中间执行的代码--------
Toast.makeText(this, "测试", Toast.LENGTH_SHORT).show();
Debug.stopMethodTracing();
权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在需要保存下载后的分析报告文件 输入cmd 执行命令adb pull /storage/emulated/0/app1.trace
把文件拉出来分析把pull到电脑上的文件拖到AS中就可以分析了
主要分析Thread time时间 ,Top Down类型的,看那些方法耗时多