适配了Android4-9,要彻底搞清楚代码,需要提前掌握的知识点如下:
- 如何确保我们启动的未注册的Activity,有正常的Activity的生命周期?
源码探索系列29---插件化基础之启动插件的Activity
-
从整体宏观的角度看,我们到底做了什么?
-
对PackageManager的hook,为什么要hook两个地方
@Override
public PackageManager getPackageManager() {
if (mPackageManager != null) {
return mPackageManager;
}
IPackageManager pm = ActivityThread.getPackageManager();
if (pm != null) {
return (mPackageManager = new ApplicationPackageManager(this, pm));
}
return null;
}
由于系统的执行肯定在我们代码之前,所以系统先生成了一个pm,这个是原生的pm然后保存在ApplicationPackageManager中, 使得以后使用ContextImp.getPackageManager()都返回这个IPackageManager 对象。 就算我们后来替换了ActivityThread.getPackageManager(),但是也不影响mPackageManager 里面之前包装好的。 所以我们还需要改变mPackageManager 里面的原来的pm对象。