使用
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,所以一个运行中的程序是有可能存在两个包名和类名完全一致的类的。
版权声明:本文为博主原创文章,未经博主允许不得转载。