项目越做越大,代码越来越多,资源越来越庞大,开发的模块化不得不提上日程,领导要求
研究下android apk的插件化开发:用户只需要安装基本的apk包,如果需要添加功能就下载一个
插件包来扩展,不需要一次就下载整个包,一次升级就升级10几M。
google一些文章来研究,学到了很多以前不知道的东西,Library project ,android 的一种区别
于application project的项目,不能单独发布运行,可以把共用的代码放在library project里面,但是
发布的时候还是一个apk。适用的场景是在共同框架下面 替换一下不同的东西,和我们需要的功能
不太符合,简单看了下,飘过。
还看了更换皮肤的原理:下载一个皮肤包,用皮肤包里面的资源替换原来的资源,通过createPackageContext
来创建一个Context,通过这个Context来获取包里的resource id,从而拿到图片资源。
这个实现貌似和我们的需求相关,尝试了下,写了个demo。
一个base工程,一个add工程。
base的MainActivity里
Context c = createPackageContext("com.example.add", Context.CONTEXT_INCLUDE_CODE);
Class clazz = c.getClassLoader().loadClass("com.example.add.MainActivity");
Object owner = clazz.newInstance();
String getStr =(String) (clazz.getMethod("getString",Context.class).invoke(owner,c));
add的MainActivity里
public String getString(Context c) {
return c.getResources().getString(R.string.test);
}
ok 可行。
貌似我们的工程也可以这样做,报部分代码和资源包在一个add包里,在主项目里
通过demo的方式来加载,只是要try catch下,exception就是没装add包。
PS:
Context.CONTEXT_IGNORE_SECURITY 这个flag如果加上可以不加shareUsrID。
奇怪,那shareUsrID不就是摆设了?费解!
ClassLoader一定得用create出来的Context对象获取,用本地的不行。
在调用扩展包的方法时候如果要用的Context还是得把本地Create出来的传进去。
可以直接通过上述方法new 一个定制的View,这样拿来直接addView 应该比较容易。