Android的启动过程

144 阅读2分钟

1.如今创建Application?
makeApplicaiton

2.跟PMS如何交互?
LoadApk

3.如何创建进程? AMS#startProcessLock 进程的入口是ActivityThread#main ApplicationThread是其内部类,在attach中跟AMS绑定,用于双方通信。

4.Application实例化时机?

thread#bindApplication->### ActivityThread#handleBindApplication

发现它先创建 mInstrumentation 对象,调用 data#info#makeApplication 来创建 Application 对象,其对象 data#infoLoadedApk 的一个实例,查看 LoadedApk#makeApplication 中代码可以发现,其调用了 Instrumentation#newApplication 方法,内部靠 Class#newInstance() 完成对 Application 实例化,然后调用 Application#attach(context) 来绑定 Context

5.activity 何时绑定window, token作用?
ActivityThread#performLaunchActivity ->Instrumentation#newActivity 是通过 Class.newInstance() 来实例化 Activity,实例化结束后回到 ActivityThread#performLaunchActivity 中来让 activity 依附到 window 中,然后callActivityOnCreateActivityonCreate 生命周期

冷启优化的思路: 启动优化应该按经验来看分两个阶段去做就行,第一阶段做通配方案,第二阶段做适配方案(就是针对不同性能的手机,设置不同的启动路径/容灾保用路径)一、通配方案关键点在于任务排布、懒加载和delay。
难点在于任务排布,一般情况下3个子线程加上一个AcitivityThread就够了,想办法给这3个子线程与AcitivityThread分配耗时相当子任务。至于具体实现,如果启动任务依赖路径长度小于5个不建议用启动器,逻辑不够清晰,也不利于帮你去梳理业务流程,自己手动countDown就行了。
懒加载核心就是按需加载,啥时候用啥时候初始化;delay稍微讲究一点,一般用在首屏数据刷新到UI上之后往MainLooper插个IdleHandler去执行delayTask
二、适配方案
它解决的核心问题就是应用的高可用性,如何保证低配手机用户也能很好的打开你的应用。关键点在于你的用户画像,比如低性能,常用哪些功能,不用哪些功能。后端收到相关上报统计后,就可以给符合某些画像的用户下发最佳的启动路径,比如启动的时候不初始化某些模块,或者delay初始化某些模块,或者增加对热点模块的预热

目标Activity进程中的 mAppToken 是一个 Binder 代理对象,其Binder服务端是 AMS 的 ActivityRecord 中的 Token 对象(IApplicationToken.Stub)。
作者:Blankj
链接:juejin.cn/post/684490… 来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。