Android插件化基础(4),动态启动插件中的Activity

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_
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值