APP启动优化

APP启动流程

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,application的启动

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);


1562568607944.png

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,黑白屏问题

白屏 <style name="AppTheme" parent="Theme.AppCompat.Light">
黑屏 <style name="AppTheme">(在以前的老版本上有效,现在的版本默认使用透明处理了)

找到一个父类name="Platform.AppCompat.Light"中定义了
<item name="android:windowBackground">用来控制黑白屏

解决办法:
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,启动时间的查看

4.4以前 adb shell am start -W com.lqr.wechat/com.lqr.wechat.activity.SplashActivity

4.4版本以后Logcat 输入Display筛选系统日志 不过滤信息No Filters

5,Trace工具分析代码执行时间

Debug.startMethodTracing(filePath);
​ 中间为需要统计执行时间的代码
Debug.stopMethodTracing();

adb pull /storage/emulated/0/app1.trace把文件拉出来分析
把pull到电脑上的文件拖到AS中就可以分析了

优化方案:
1.开线程 没建handler 没操作UI 对异步要求不高
2.懒加载 用到的时候再初始化,如网络,数据库操作

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.操作系统启动流程和Launcher点击事件流程2.启动方式以及首次启动3.黑白屏优化4.启动时间内代码优化 操...
    ArcherZang阅读 1,260评论 1 11
  • 系统启动 1、打开电源 引导芯片代码加载引导程序BootLoader到RAM中执行2、BootLoader把操作系...
    放肆滴微笑阅读 120评论 0 0
  • 一触即发 App启动优化最佳实践 文中的很多图都是Google性能优化指南第六季中的一些截图 Google给出的优...
    eclipse_xu阅读 5,131评论 7 95
  • 大家都遇到过自己 app 启动时间有些长,屏幕白屏的问题吧。一个正常的商业 app 在启动时时会加载一大票组件的初...
    前行的乌龟阅读 3,474评论 0 14
  • 1. 什么是 CSS hack? 由于不同厂商的浏览器,比如Internet Explorer,Safari,Mo...
    抚年华轻过阅读 450评论 0 4