Android App 启动优化全记录

  • 时间:
  • 浏览:6
  • 来源:万人红黑大战棋牌APP_万人红黑大战棋牌APP官网

Linux 底层文件系统中 VFS 上次 App 线程池池之间,处于一层 pagecache,pagecache 由内存中的物理 page 组成,其内容对应磁盘上的 block。Pagecache 的大小是动态变化的,都才能扩大,也都才能在内存不足英文时缩小。Cache 缓存的存储设备被称为后备存储(backing store),1个 page 通常含高多个 block,那些 block 不一定是连续的

这里涉及到具体的业务,每个 App 总要一样,日后 所要做的事情总要一样的,下面是邵文在高手课底下提到的:

使用合理的启动架构

应用启动的日后 ,肯能主线程池池的工作太多,也会造成主线程池池过于繁忙,下面多少系统调度相关的点都才能注意:

这里我建议亲戚亲戚朋友学习历时1年,上百万行代码!首次揭秘手淘全链路性能优化(上)中提到的测量最好的妙招:自动化、稳定、持续集成

另外我还加进去去了部分系统厂商所做的启动相关的优化,不过只写了有些我知道的,还有有些厂商有黑科技,就沒有这里的讨论范围了。知道厂商做的事情,肯能也会帮助到你,比如联系厂商做白名单、接入厂商 SDK 等

亲戚亲戚朋友都才能参考淘宝的全链路优化的案例:历时1年,上百万行代码!首次揭秘手淘全链路性能优化(上))

启动过程中繁忙的 SystemServer

当然保活还有每根路但是我走跟厂商的媒体企业合作,优化后台内存、加进去重复拉起、加进去流氓逻辑、积极响应低内存警告,做好那些话后都才能跟系统厂商联系,谈中放查杀白名单和自启动白名单的可行性

应用的启动,从桌面点击应用图标到主界面用户可操作,大致遵循下面的流程:

系统也会对有些应用进行特殊外理,以提升用户体验:包括但不限于 线程池池线程池池优先级调整、查杀白名单、用户常用应用记录等,进行适当的后台保活,下次启动的日后 但是我热启动了

流程梳理,延后执行;实际上,有些 步对项目启动加速最有效果。通过流程梳理发现部分流程调用时机偏失等, 相似

StartingWindow 会在用户点击 App 后立即创建并显示(前提是 App 没法禁止 StartingWindow),在 AppWindow 创建好日后 ,StartingWindow 消失,AppWindow 显示

线程池池优化主但是我减少 CPU 调度带来的波动,让启动时间更稳定。肯能启动过程含高太多的线程池池一块儿启动,会给 CPU 带来非常大的压力,尤其是比较低端的机器。太多的线程池池一块儿跑会让主线程池池的 Sleep 和 Runnable 请况变多, 增加了应用的启动速率,优化的过程中要注意:

从 Spark 的 DAGScheduler 中领悟到它的核心思想,面向阶段调度(Stage-Oriented Scheduler):把应用划分成1个个的阶段(Stage),再把任务(Task)安排到各个阶段中去,任务的编排则是通过构建 有向无环图(DAG),把任务依赖通过图的最好的妙招梳理得 井井有条。肯能它分阶段执行,先集中资源把阶段一搞懂,再齐心协力去执行阶段二,另1个即能控制拥塞,又能保证时序,还能并发执行,让设备性能尽肯能得到发挥

App 启动的日后 ,系统会对要启动的应用做绝对的资源倾斜,比如 CPU、IO、GPU 等,有些 点亲戚亲戚朋友抓个 Systrace 看一下即可,不管是频率还是调度算法,正在启动的 App 绝对是当时的系统 VIP 客户



(https://www.androidperformance.com/images/15740896485396.jpg)

这里还都才能引入冷启动和热启动的概念,这也是亲戚亲戚朋友经常会碰到的1个概念

启动过程中负载比较高,有有些系统 IO 总要此时处于,这日后 IO 的性能下降会比较快,此时 App 中的 IO 操作会比平时放慢有些,尤其是在性能比较差的机器上。

启动的日后 ,对启动过程中的 Message 进行重新排列

都才能参考下面这篇文章 支付宝客户端架构解析:Android 客户端启动速率优化之「垃圾回收」)

当然对于应用开发者来说,底下说的都太多理想化了,日后 目前的手机厂商也会很暴力,应用到了后台就会外理掉,不过这毕竟是1个方向,Google 也在规范应用后台行为和规范厂商外理应用这两方面总要做努力,Android 系统的生态,还是都才能应用开发者和 Android 厂商一块儿取改善。

都才能在 systrace 生成的文件中看完 verifyClass 过程,肯能都才能校验最好的妙招的每1个指令,有些是1个比较耗时的操作。

Activity 打开日后 就预加载数据,在 Activity 的 UI 布局初始化完成后显示预加载的数据,大大缩短启动时间。 都才能参考 :https://github.com/luckybilly/PreLoader/blob/master/README-zh-CN.md

都才能看完应用启动过程中,最重要的1个线程池池但是我 SystemServer 和 App Process . 其职责划分如下:

应用主界面布局优化是老生常谈了,综合起来无非但是我下面两点,有些 都才能结合具体的界面布局去做优化,网上总要比较多的资料都才能查阅

厂商的策略各不相同,这里但是我简单的提一下思路

具体的业务会有具体的优化场景,亲戚亲戚朋友都才能参考这篇文章中的优化流程和优化项(https://www.jianshu.com/p/f5514b1a826c)

启动过程中减少 GC 的次数

IO 分网络 IO 和磁盘 IO ,启动过程中不建议进行网络 IO ,对于磁盘 IO 则要细扣,邵文在高手课底下有讲到:

嘴笨 对用户来说,第两种启动流程是最好的,只涉及到一次窗口的切换;日后 部分 App 肯能广告页的需求,会使用第二种流程 ;日后 尽量何必 使用第两种和第两种启动流程,体验非常不好

作者:Gracker

原文链接:https://www.androidperformance.com/2019/11/18/Android-App-Lunch-Optimize/

本文参考了目前大部分 Android 应用启动优化的方案,将亲戚亲戚朋友的方案做1个汇总,肯能你有这方面的需求,只都才能对照这篇文章,看看自己的方案,查漏补缺。有些方案是要根据具体的业务去做优化的,有些这里也没法对每两种方案进行完整的介绍,要用到哪1个方案的日后 ,都才能具体去网上查找对应方案的具体实现最好的妙招,这里但是我做1个汇总

IdleHandler:当 Handler 空闲的日后 才会被调用,肯能返回 true, 则会经常执行,肯能返回 false,执行完一次后就会被移除消息队列。比如,亲戚亲戚朋友都才能将从服务器获取推送 Token 的任务中放延迟 IdleHandler 中执行,肯能把有些不重要的 View 的加载中放 IdleHandler 中执行

部分厂家会对启动过程 App 的主线程池池和渲染线程池池做特殊对待,比如让亲戚亲戚朋友直接跑到大核上,将有些不重要的线程池池移到小核

保活,是各个应用开发者的噩梦,也是 Android 厂商关注和打击的重点。不过从启动的深度来看,肯能应用线程池池不被杀,没法启动自然就快了,有些保活对应用启动速率也是有极大的帮助。

日后 按需进行加载优化

Android 系统更新也会对应用启动速率进行优化,比如底下提到的 Pre-Fork,又比如这里的错综复杂 doFrame 个数

部分场景会针对用户的使用习惯进行学习,比如在那些时间、那些场合、那些交通工具打开手机,系统会预测我我想要 启动的 App,并在后台进行启动,另1个你点击有些 App 的日后 ,就肯能是热启动了

除了 App 自身的优化之外,Android 框架对应用启动也是非常关注的,做了比较多的优化,下面简单说一下思路,各个厂商的实现但是我太一样,日后 基本上总要有,有些是硬核代码优化,总要利用系统策略做优化。

Android Q 加入了 PreFork 机制,会先 fork 多少空线程池池,当 App 启动的日后 ,都才能直接复用这多少空线程池池,而不必重新去 fork

部分厂商会在监测到有些 大内存 App 启动的日后 ,提前做内存的回收操作,另1个在启动的日后 ,总要了足够的内存给有些 App 使用

类重排的实现通过 ReDex 的 Interdex 调整类在 Dex 中的排列顺序。Interdex 优化都才能了去分析类引用,它只都才能调整 Dex 中类的顺序,把启动时都才能加载的类按顺序中放主 dex 里,有些 工作亲戚亲戚朋友完整都才能在编译过程中实现,日后 有些 优化都才能提升启动速率,优化效果从 facebook 回应的数据来看也比较可观,性价比高。具体实现都才能参考 Redex 初探与 Interdex:Andorid 冷启动优化

App 瘦身包括代码瘦身和资源瘦身,通常的做法如下:

下面图中都才能看完低内存的日后 ,启动应用主线程池池有较多的 IO 等待(UI Thread 有些 栏,橘红色代表 IO 等待 )

当然这里说的保活,并总要建议亲戚亲戚朋友用各种黑科技、相互唤醒、通知轰炸有些 保活手段,但是我提供真正的功能,能让用户嘴笨 你在后台是合理的、都才能接收的。比如在后台的日后 ,资源能释放的都释放掉,何必 经常在后台做耗电操作,该停的服务停掉,该关的动画关掉。

启动窗口,也叫启动页、SplashWindow、StartingWindow 等,指的是应用启动日后 的预览窗口。iOS App 强制有1个启动页,用户点击桌面 App 图标日后 ,系统会立即显示有些 启动窗口,等 App 主页加载好日后 再显示主页面。Android 总要相似的机制 (启动窗口有些 是 Android 系统提供的),日后 也提供了1个接口,让应用开发者设置是是不是显示有些 启动窗口(默认是显示),部分开发者会把有些 系统提供的启动窗口禁掉,启动自己的窗口。

部分厂商也提供了资源调度的 SDK ,应用都才能接入那些 SDK,在都才能资源的日后 直接调用 SDK 获取

都才能把具体的业务分为下面1个维度(此处图文来自https://juejin.im/post/5c21ea325188254eaa5c45b1#heading-5)

各家应该总要自己的方案,关键在于怎么定义启动日后开始的点,有些 也是经常困扰我的1个地方,有的应用很好定义,有的应用则肯能比较错综复杂,无法直接衡量启动速率。像 adb 有些 最好的妙招自己玩玩都才能,生产环境没啥用;录屏两种总要性能损耗..

启动过程中繁忙的 cpu

日后 启动自己的窗口都才能的时间要比直接显示系统的启动窗口所花的时间要长,这就会愿因用户在使用的日后 ,点击图标启动 App 的日后 ,有一定的延迟,表现在点击图标过了一段时间才进行窗口动画进入 App,亲戚亲戚朋友要尽量外理有些 请况

利用文件重布局结合Pagecache 机制都才能减少启动过程中的真正 IO 的次数,简单的说,通过文件重布局的目的,但是我将启动阶段都才能用到的文件在 APK 文件中排布在一块儿,尽肯能的利用 pagecache 机制,用共要的磁盘 IO 次数,读取尽肯能多的启动阶段都才能的文件,减少 IO 开销,从而达到提升启动性能的目的

推荐阅读:2019最新整理阿里Android面试失败大全之源码篇

2019最新整理BATJAndroid 高级面试题及答案转自“写给全国移动互联网工作者的一封公开信”

通过OCR提取图片中的文字信息作为关键社会形态。该算法的优势:1. 在于应用页面上基本总要有文字的, OCR也都才能识别到图片上的文字, 文字经常出現则图片加载完成, 和用户体感是一致的;2. 文字作为社会形态,过滤掉了有些图片社会形态肯能带来的噪声, 减少了算法调试的工作量;另外阿里集团内有非常心智心智成熟是什么是什么是什么期的句子的句子期 和优秀的OCR服务——读光,文档识别率超过99.7%, 使用水滴平台封装的OCR服务,都才能快速接入和使用。最终的识别方案但是我基于OCR识别来进行的

系统会对有些应用进行特殊外理,比如有些 App 比较重要日后 都才能了杀掉,没法有的厂商会在有些 应用退到后台日后 ,进行无感重启:比如说某个应用内存超标肯能持续 Crash ,后台重启都才能很好地外理有些 难题报告 ,另1个重启后的 App 是用户点击启动的日后 但是我热启动

利用 Linux 的 IO 读取策略,PageCache 和 ReadAhead 机制,按照读取顺序重新排列,减少磁盘 IO 次数 。具体操作都才能参考支付宝 App 构建优化解析:通过安装包重排布优化 Android 端启动性能 这篇文章

部分应用启动的日后 ,都才能大量的内存,比如现在的相机启动,这日后 肯能没法足够的内存,没法系统都才能要通过杀掉有些应用、释放 Cache 等操作来给有些 App 让路,有些 过程会使得那些大内存的 App 在启动的日后 频繁进行内存操作,愿因启动速率放慢

启动优化整个流程的梳理,流程的梳理,亲戚亲戚朋友这里引入了1个有向无环图的概念,亲戚亲戚朋友会把整个的概念梳理成有向无环图的社会形态,然总要去挨个加载。右边的部分,都才能看完亲戚亲戚朋友嘴笨 在启动的日后 ,首先会去加载有些必要的启动项,必要的启动项是左边流程,会用1个线程池池池的最好的妙招加载,以来有向无环图进行控制,比如说我是在非都才能的日后 启动加载我我想要 中放底下再去加载。当然在整个有向无环图的顺序加载,嘴笨 还是会做有些线程池池的判断,要判断有些项目是总要要在主线程池池里加载,有些要在初始线程池池底下加载