Activity的插件化需要解决3方面的技术问题:
- 宿主App可以加载插件App中的类
- 宿主App可以加载插件中的App资源
- 宿主App可以加载插件中的Activity
启动没有在AndroidManifest中声明的插件Activity
在5.4节介绍了启动没有在AndroidManifest 中声明的 Activity,借助宿主App中的StubActivity ,在 AMN 中欺骗,在ActivityThread 中欺骗。这种方式的代码如下:
1 | //代码可以参见: https://github.com/BaoBaoJianqiang/ActivityHook1 |
基于动态替换的Activity插件化解决方案
这章节好混乱,压根就没说这里解决的是什么问题
加载插件中类的方案2: 合并多个dex
对LaunchMode的支持
前面介绍的 Activity 插件化技术,对于LaunchMode 都是standard的情况是完全适用的。对于 SingleTop、SingleTask 和 SingleInstance 需要重新考虑。
解决LaunchMode 的问题,适用的还是 占位Activity 的思想,即实现为这3种 LaunchMode 创建很多StubActivity,如下图所示:
我们可以从服务端下载一个Json,指定插件中的Activity 对应哪种 StubActivity ,写Demo的时候,可以直接在本地 Mock 这些数据,保存在 MyApplication 中,然后再 Mock1Class 接货 startActivity 的时候,如果发现要启动的Activity 在 MyApplication 的 pluginActivities 集合中,那就使用这个插件 Activity 对应的占位 StubActivity,代码如下:
1 | //代码参见: https://github.com/BaoBaoJianqiang/ZeusStudy1.3 |
接下来可以测试下。这里有个小bug,无论singleTop还是singleTask,再回到这个Activity时,并不会触发它的onCreate,而是会触发它的onNewIntent(其实这里说的bug我并没有明白,等测试后再说)。为此,我们需要在MockClass2 中,拦截onNewIntent方法,把占位 StubActivity 替换回插件Activity,代码如下:
1 | //代码可以参考上面的链接 |
加载插件中类的方案3:修改App原生的ClassLoader
..