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.懒加载 用到的时候再初始化,如网络,数据库操作

推荐阅读更多精彩内容

  • app启动流程简介 app的启动流程,即从安卓系统启动,到我们手指点击应用图标,再到app的第一帧显示到手机屏幕,...
    腊鸡程序员阅读 39评论 0 0
  • 官方文档地址:https://developer.android.google.cn/topic/performa...
    htkeepmoving阅读 100评论 0 1
  • 现在微信小程序火爆异常,各种demo层出不穷,笔者也不免俗,一直有关注,虽然不是微信的死忠,但是不得不佩服微信的野...
    山野纸鹤阅读 600评论 0 16
  • 你一定遇到过这种情况:点击App图标,先出现一个白屏或者黑屏页面,然后过一会才进入主界面。这时候你会懵逼,这是什么...
    皮球二二阅读 1,738评论 5 13
  • 中国明朝的军队在十六世纪时代肯定是一流的,所有的对外战争从无败绩,大明海军更是所向披靡,有一种找不到对手的孤...
    麓蜂阅读 287评论 8 1