Android 启动优化

说到App优化,首先考虑到的就是App启动的优化,要想加速启动首先要先了解App启动的过程。接下来我们首先简要分析一下App冷启动是怎样一个流程。

应用进程不存在的情况下,从点击桌面应用图标,到应用启动(冷启动),大概会经历以下流程:
1.Launcher startActivity
2.AMS startActivity
3.Zygote fork 进程
4.ActivityThread main()
 4.1. ActivityThread attach
 4.2. handleBindApplicatio
 4.3. attachBaseContext
 4.4. installContentProviders
 4.5. Application onCreate

  1. ActivityThread 进入loop循环
  2. Activity生命周期回调,onCreate、onStart、onResume...

其中App能够干预到的只有 4.3,4.5,6这三个步骤,其它的对App来说是黑盒的,App是不能控制的(除非设备Root,你可以干预其它流程,或者在设备启动后直接后台初始化自己的进程), 我们的优化也是主要针对这三个步骤进行优化。

1. attachBaseContext优化

首先我们来看 attachBaseContext(),此方法我们一般会用作对多MultiDex做处理,我们知道Android5.0以前是不支持MultiDex的,需要在此方法中进行
MultiDex.install(this) 安装多dex,这个过程中会对我们的Apk进行解压缩找到dex文件列表,然后通过反射把dex文件放进虚拟机ClassLoader中的dex数组中,这个过程因为有解压缩apk以及反射操作是比较耗时的。

既然这里是耗时的我们是否可以去开启子线程去执行MultiDex.install(),答案是否定的,假设一个场景,我们开线程异步加载,主线程继续执行后面的初始化ContentProviders或者 Application的onCreate()方法中如果有需要用到非主dex文件的Class而这时候子线程的MultiDex.install()还没有完成安装就会造成 NoClassDeFound异常,所以此方法是行不通的。具体优化方案见:https://www.cnblogs.com/renhui/p/11716975.html

总结:MulitiDex.install主要针对5.0以下的设备(不包含5.0),目前市面上的设备基本上已经没有5.0以下的设备了,所以这部分优化能涵盖的设备已经很少了,5.0以上是默认支持MulitdDex的,这个方法什么都不用做,直接返回。

image.png

2. Application onCreate()优化

终于到了我们喜闻乐见的onCreate了,这一步也是我们优化的主要战场,通常在这一步中我们会做一些三方sdk以及自有业务的一些初始化,这些初始化工作其实并不是一开始就需要的,我们完全可以做一些懒加载处理或者异步加载。那怎样判断Application onCreate()方法的执行耗时呢?
最Low的办法就是在onCreate的方法入口 和 方法出口各自加时间戳判断,但是这只能判断整个方法的执行时间,但假如我们的onCreate的方法中有很多个sdk要初始化呢,只能是每个sdk初始化前后各需要加时间戳判断,这样写起来就太费劲了。还好Android给我们提供了很多性能测试的方法。接下来我们介绍一下 Debug.startMethodTracing()与Debug.stopMethodTracing(),把这个方法加入Application的onCreate方法开始和结束处会默认生成每个方法的堆栈信息及调用时间文件保存到sd卡中,然后再通过AS的 profile工具来查看详细信息。
代码如下:

    @Override
    public void onCreate() {
        super.onCreate();
        Debug.startMethodTracing("im_ana");
        initIm();// 初始化Im SDK
        Debug.stopMethodTracing();
    }

startMethodTracing()的参数是生成堆栈信息的文件名,扩展名为.trace,生的文件会保存在 sdcard/Android/data/{$packageName}/file/ 目录下。(注意:这里因为要对sd卡读写需要先授权,还有另外一个问题,堆栈文件信息默认大小为10M,如果中间需要监控的方法太多会导致信息收集不全,这时候可以在startMethodTracing()方法中配置堆栈文件的bufferSize处理)。把生成的文件导出来直接拖到AndroidStudio中即可以显示可视化的方法堆栈信息。见下图:

image.png

这里可以看到方法的调用堆栈以及每个方法的调用时间,有了这些信息,我们就可以轻松判断到底是哪些方法执行时间过长了。就可以选择哪些需要开启线程异步加载或者懒加载执行了,目前Application的onCreate()优化方法介绍完成了,如果有哪里写的不对还请看到的大神指出来,感激不尽!

3. 首屏Activity优化

3.1 首屏主题优化

一般我们冷启动App时,首屏Activity首先会弹出来然后黑屏或白屏一段时间这段时间其实是在执行上面说到的启动流程。系统默认给我们设置的主题样式,既然是主题样式我们就可以替换首屏Activity的主题来替换黑白屏,自定义主题样式如下:

 <style name="AppTheme.Loading" parent="AppTheme.NoActionBar">
        <item name="android:windowBackground">@drawable/loading_fix</item>
        <item name="android:windowFullscreen">true</item>
    </style>

在windowBackground中设置drawable可以是我们自己的图片,这样就可以启动时显示我们配置的图片信息,防止黑白屏的尴尬。

这里并没有提高我们App的启动时间,只是在体验是做了优化。

3.2 布局文件加载优化

  1. 布局文件加载要尽量减少层级,能用FrameLayout或者LinearLayout完成的就不要用RelativeLayout或者ConstraintLayout,因为RelativeLayout会执行两次measure测量。还要合理运用include,merge,ViewStub 来进行层级缩减或懒加载来提高页面渲染速度。

  2. 我们知道Android布局文件是能过读取xml资源文件,然后通过反射生成Android的View这中间有两个步骤是耗时操作,一个是读取xml进行的IO操作,一个是反射生成View的操作,这两个步骤都是在运行时同步的操作,这两个流程都有可能造成性能方面的问题。针对此问题目前有三方解决方案 X2C ,其原理是通过apt工具在编译期把xml布局文件生成 Java类。X2C开源库地址:https://github.com/iReaderAndroid/X2C

3.剩下的问题就是不要在生命周期方法中执行耗时操作,这样会导致UI掉帧及ANR的问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 应用启动类型 冷启动 冷启动指的是:用户在 Launcher 程序里点击应用图标时,会通知ActivityMana...
    JunL_Dev阅读 1,882评论 4 5
  • 随着项目版本的迭代,App的性能问题会逐渐暴露出来,启动慢,启动白屏黑屏,包越来越大,App耗电量高,而好的用户体...
    努力的小王同学阅读 1,135评论 1 1
  • Android启动主要优化点 1、Application初始化的一些动作挪到IntentService;2、SP存...
    游侠_6fb7阅读 683评论 0 0
  • 日更第七天。 今天下楼买药,走到一楼半时,迎面上来一邻居,我发现自己没带口罩,重返七楼。 口罩还是要带的,虽然现在...
    这回行了吧阅读 148评论 0 1
  • 从前,我以为看书电影音乐体育全都关注,才会培养我的艺术细胞,然而我却一直无法文艺起来。 从前,我以为不断的学习新知...
    孙黎黎阅读 395评论 0 5