记录一下
- 第一步
启动 Application 后,在 attachBaseContext
中,判断是否主进程
如果是主进程,则创建一个文件,并启动一个进程
由于进程是单独的 JVM 启动的,在这个子进程中,会再次进入 attachBaseContext
- 执行
MultiDex.install()
此时 主进程 进入 while 循环,判断创建的文件是否存在
子进程进入 attachBaseContext
后,会调用 install()
方法
并启动Activity显示 转圈动画
加载完成后会删除主进程创建的文件
- 运行程序
主进程发现文件被删除后,即认为 MultiDex
加载完成,然后进入正常的执行流程
- 优点
为什么不用线程去执行 MultiDex.install()
如果使用线程,需要提前将 SplashActivity 中所引用到的类提前加载到 maindex ,
最主要的是,需要将 ContentProvider 中使用到的类提前加载到 maindex 中,如果项目中引入和许多第三方 sdk
编译时解析manifest,将ContentProvider写入maindex,要解析SplashActivity,再按照一定规则,将一些类写入maindex,要考虑的问题有很多,编译期去解析,风险大
而对比下,此方案:
不需要创建子线程去加载,流程简单明了
没有线程,不需要额外的操作,易维护,可以兼容第三方SDK