Android 个人也能搞的应用启动优化

一、启动流程的内部机制

1.点击app应用图标,通过binder发送到system_server进程

2.system_server调用Process.start() 收集 uid、gid 等参数信息,通过socket发送给Zygote进程请求创建新进程

3.Zygote进程收到请求后,调用 ZygoteInit.main() 方法进行 runSelectLoop() 循环体内,当有客户端连接时执行 ZygoteConnection.runOnce() 方法,再经过层层调用后 fork 出新的应用进程。


系统创建应用进程

4.开始启动应用,应用的启动流程主要分为三步:启动主线程,创建 Application,创建 MainActivity

5.ActivityThread调用main方法,进行初始化,创建主进程handler,开启looper信息轮训,通过bindApplication方法进行Application创建和初始化,执行Application的生命周期

6.通过主线程 Handler,在主线程中执行 Activity 的创建和启动,执行LifeCycle结束之后,执行到ViewRootImpl,开始页面的真正绘制。



系统创建应用进程后续阶段

二、确定应用冷启动的开始时间和结束时间

1.开始时间:定位Application的attachBaseContext,应用进程的第一个生命周期,最早的预加载时机。

2.结束时间:页面上的首帧加载完成的时间,即itemView回调perDrawCallback()的时间点作为结束时间。

三、启动时间分析工具

1.Displayed:日志Displayed关键字过滤

2.通过adb shell运行app,查看相应信息

3.reportFullyDrawn:在异步任务完成之后调用activity.reportFullyDrawn()打印系统日志

4.AOP编译插桩技术 埋点

四、具体实用分析工具

1.TraceView:通过在耗时代码前面分别调用Debug.startMethodTracing()与 Debug.stopMethodTracing(),运行应用后,在(SD卡) Android/data/包名/files  目录下找到dmtrace.trace文件,在as中点击分析。

2.CPU Profiler:

(1)在 Android Studio 工具中选择 Run > Edit Configurations 配置界面

(2)在 App 中选择 Profiling,勾选 Start this recording on startup 选项

(3)从菜单中选择 Java/Kotlin Methods Trace

(4)通过选择 Run > Profile,待应用运行起来

(5)在Profiler里面分析。

3.Perfetto技术。

五、可行的实战优化方案

1.视觉优化:在启动页主题中,通过windowBackground设置一个启动背景

2.异步任务优化:启动器

(1)对初始化任务代码 Task 化,启动任务抽象为 Task 类

(2)根据所有任务依赖关系排序生成有向无环图,也就是对所有任务进行有向无环图的拓扑排序算法排序,将并行效率最大化;

(3)多线程按照排序之后的优先级依次执行任务。

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

推荐阅读更多精彩内容