0%

今日头条MultiDex启动优化

记录一下

  1. 第一步

启动 Application 后,在 attachBaseContext 中,判断是否主进程

img

如果是主进程,则创建一个文件,并启动一个进程

由于进程是单独的 JVM 启动的,在这个子进程中,会再次进入 attachBaseContext

  1. 执行MultiDex.install()

此时 主进程 进入 while 循环,判断创建的文件是否存在

子进程进入 attachBaseContext 后,会调用 install() 方法

并启动Activity显示 转圈动画

加载完成后会删除主进程创建的文件

  1. 运行程序

主进程发现文件被删除后,即认为 MultiDex 加载完成,然后进入正常的执行流程

  1. 优点

为什么不用线程去执行 MultiDex.install()

如果使用线程,需要提前将 SplashActivity 中所引用到的类提前加载到 maindex ,
最主要的是,需要将 ContentProvider 中使用到的类提前加载到 maindex 中,如果项目中引入和许多第三方 sdk
编译时解析manifest,将ContentProvider写入maindex,要解析SplashActivity,再按照一定规则,将一些类写入maindex,要考虑的问题有很多,编译期去解析,风险大

而对比下,此方案:
不需要创建子线程去加载,流程简单明了

没有线程,不需要额外的操作,易维护,可以兼容第三方SDK