Android插件化基础(4),动态启动插件中的Activity
Author:郑海波-莫川
简介
如何动态启动插件中的Activity呢?我们首先分析,启动插件中的Activity需要做那些准备?
- 1.插件中Activity类的加载
也就是ClassLoader的问题。由第一节课中的MultiDex可以知道,我们可以动态的加载apk,然后将插件中的class加载到当前的ClassLoader当中。这样,插件中的class和宿主中的class同属一个ClassLoader,它们之间的相互调用问题也就解决了。 - 2.插件中Activity在AndroidManifest.xml中的注册问题
由于插件apk有自己的AndroidManifest文件,为了能够在运行时,动态启动插件中的Activity,需要在打包时,将插件apk的Activity注册移动到宿主apk的AndroidManifest文件中。 - 3.插件中Activity的资源加载问题
处理插件中的资源加载问题,是插件化最难的问题之一!我们需要考虑很多问题:
1.插件Activity运行时如何实时获取Resources对象,并且能够根据插件包名对应下的R文件的id,查找到Resources中的资源。
2.插件apk中的资源文件与其他插件及宿主之间的资源名称冲突如何解决?
3.宿主及各插件的资源如何统一并且方便的管理?
问题的解决:
1.类的加载
我们使用之前我们改造的AssetsMultiDexLoader,来加载assets目录下的apk。由于之前的博客已经说明了问题,再次不在赘述。
2.插件中的Activity在宿主AndroidManifest中注册
这件事情需要在打包时处理,也就是说,我们需要改造我们的打包工具,在打包时,将各个插件的AndroidManifest文件合并到宿主AndroidManifest文件中。
3.插件资源的加载问题
我们需要在编译过程和运行过程分别做处理:
3.1 编译过程
我们首先回顾一下Android打包的过程:
1.生成R.java文件
比如:
aapt package -f -m -J ./gen -S res -M AndroidManifest.xml -I D:\android_sdk_for_studio\platforms\android-22\android.jar
2.清空bin目录
清空上次生成的文件
3.编译java文件和jar包
javac -encoding GBK -target 1.5 -bootclasspath D:\android_sdk_for_studio\platforms\android-22\android.jar -d bin src\net\mobctrl\normal\apk\*.java gen\net\mobctrl\normal\apk\R.java -classpath libs\*.jar
4.使用dx工具打包成classes.dex
dx --dex --output=C:\Users\mochuan.zhb\newworkspace\BundleApk5\bin\classes.dex C:\Users\mochuan.zhb\newworkspace\BundleApk5\bin\
5.编译成资源文件
aapt package -f -M AndroidManifest.xml -S res -I D:\android_sdk_for_studio\platforms\android-22\android.jar -F bin\resources.ap_ --non-constant-id
6.使用sdklib.jar工具生成未签名的apk
java -cp D:\android_sdk_for_studio\tools\lib\sdklib.jar com.android.sdklib.build.ApkBuilderMain bin\MyCommond.apk -v -u -z bin\resources.ap_