App启动优化
一、android系统初始化流程
1. 系统的启动
(1)打开电源 引导芯片代码加载引导程序Boot Loader到RAM中去执行
(2)BootLoader把操作系统拉起来
(3)Linux 内核启动开始系统设置,找到一个init.rc文件启动初始化进程
(4)init进程初始化和启动属性服务,之后开启Zygote进程
(5)Zygote开始创建JVM并注册JNI方法,开启SystemServer
(6)启动Binder线程池和SystemServiceManager,并启动各种服务
(7)AMS启动Launcher
2. Launcher启动
(1)通过adb shell dumpsys activity activities查看当前的activity名
(2)查看进程adb shell ps
(3)application
(3.1)当我们用手点击一个图标时,就到了这个类public final class Launcher extends Activity
执行onClick(View view)方法,会把这个应用的相关信息传入
先获取一个intent--->startActivitySafely(v, intent, tag)--》startActivity(v, intent, tag);-->startActivity(intent);
(3.2)startActivity(intent)会开一个APP进程
image.png
(3.3)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();
3.黑白屏问题
(1)样式主题文件
(1.1)
白屏 <style name="AppTheme" parent="Theme.AppCompat.Light">
黑屏 <style name="AppTheme">(在以前的老版本上有效,现在的版本默认使用透明处理了)
(1.2)找到一个父类name="Platform.AppCompat.Light"中定义了
<item name="android:windowBackground">用来控制黑白屏
(1.3)解决方法:
解决办法:
1.在自己的<style name="AppTheme" parent="Theme.AppCompat.Light">中加入windowsbackground
2.设置windowbackground为透明的 <item name="android:windowIsTranslucent">true</item>
但这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还是使用以前的样式,这样做就只有启动时才使用自己的样式
4.QQ中的用法
<item name="android:windowDisablePreview">true</item>
<item name="android:windowBackground">@null</item>
4.Trace工具分析代码执行时间
(1)
Debug.startMethodTracing(filePath);
中间为需要统计执行时间的代码
Debug.stopMethodTracing();
(2)adb pull /storage/emulated/0/app1.trace把文件拉出来分析
把pull到电脑上的文件拖到AS中就可以分析了
(3)优化方案:
1.开线程 没建handler 没操作UI 对异步要求不高
2.懒加载 用到的时候再初始化,如网络,数据库操作