android插件化研究

使用
android:sharedUserId="com.wallj.skin"
1、总共三个工程,包名分别为com.wallj.main/com.wallj.spring/com.wallj.summer
其中com.wallj.main为主工程,其他两个为插件工程,均只为主工程提供资源。
三个工程需要使用同一个  android:sharedUserId="
com.wallj.skin"以达到资源共享的目的。
设置了该属性后,三个工程之间的ClassLoader可以相互之间访问资源。(有时候为了给app以root权限,也会使用到这个属性,来共用系统的uid,但是需要系统支持)

2、在com.wallj.main工程中通过 DexClassLoader加载插件的dex,判断其sharedUserId是否与主工程一致。或者是做为单独app安装过的插件的话,也可以通过其他packageManager先从已安装列表中拿到该应用的包信息,之后判断sharedUserId是否与主工程一致。

3、判断一致后,应该是已经拿到了包名等等应用信息,然后就可以通过反射加载出来其中的R.java,根据R.java拿到其中的资源文件id,通过包名等信息拿到该应用的context信息,使用context以及资源id便可以查找到该资源文件(例如:图片资源),拿到资源文件之后就可以随心所欲了。

如果并不是想使用其中的资源文件,而是想调用其中的类,启动其中的Activity的话,应该就是只能在第二步的时候,去加载想要使用到的类文件,但是Activity是不能new出来的的,这是个问题。

具体细节还没有实践过,这里只做记录
JVM以及Dalvik对类唯一的识别是ClassLoader id + PackageName + ClassName,所以一个运行中的程序是有可能存在两个包名和类名完全一致的类的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值