插件化开发之资源访问
插件可以是一个安装的apk或未安装的apk,
这里为了简便以安装的apk为例,如果要使用未安装的apk只需要将类加载器更换下基本就可以了
但首先明确下,2个进程间的数据是不能共享的,所以跨进程访问数据行不通
所以我们需要将我们的2个apk运行到同一进程中
android里面的方法是在manifest文件中的manifest标签属性中配置相同的shareUserId即可
ok,接下来可以正式实现我们的插件了
第一步:既然要访问插件,我们肯定得找到相应的插件包,android中对所有包进行管理的肯定是pm
通过pm遍历所有的包信息
过滤条件为:ShareUserId相等但包名不等
第二步:找到插件包中我们需要的资源,我们知道资源应该都是在R文件中有一个id的
我们平时使用资源的时候如图片资源这样访问即可Context.getResources().getDrawable(R.drawable.xxx)
所以我们要做的事有两件1.获得到插件中的Context2.获取到R文件中资源对应的id
1.获取插件中的Context
plugContext = mContext.createPackageContext(packagename, CONTEXT_IGNORE_SECURITY | CONTEXT_INCLUDE_CODE);
通过咱们的这个Context去调用创造一个包名对应的插件Context,其中包名为插件包名,权限设置为忽略警告和可写代码
2.获取R文件资源中对应的id
首先需要获取到R文件中要使用的那个资源类,这些资源类都以R的内部类形式存在,然后用类加载器加载下这个类就可以
应该是PathClassLoader(因为咱们加载的是安装过的apk,如果没有安装使用DexClassLoader )
类的话无非包名.R$drawable(以图片资源为例,其他资源将drawable换为其他类就ok了)
然后用反射遍历这个类中的属性,找到符合约定的那个名字,然后得到它的值就可以了
第三步:使用获取到的插件Context去访问获取到的资源对应id,然后就可以拿到值了
ok,插件化也不是非常麻烦的,技术中只要有步骤可依,找到这些步骤,一一解决就可以,所以现在看来还是比较简单的。