移动应用产品更新非常快,需求变化频繁,而想让这些需求到用户的手机上一般只能通过软件发布/推送/更新的流程,这个过程非常缓慢而且转换率不高。
动态更新应用,广义上说是对开发和发布流程的解耦。
基础知识:
1,JVM双亲委派模型和java.lang.ClassLoader加载机制
2,dalvik.system.DexClassLoader 和 dalvik.system.PathClassLoader
3,apk打包过程
4,aapt如何编译资源文件,如何命名资源文件的ID?
问题① 如何在插件中引用宿主apk的资源?
使用-I参数对宿主的apk进行引用。据此,插件的资源、xml布局中就可以使用宿主的资源和控件、布局类了。其实每个应用在编译时都会依赖android.jar。
问题② 如何为插件指定资源文件的ID?
使用--apk-module参数
问题③ ???
5,代码编译时如何解决对宿主项目的依赖?
问题① 从宿主工程中导出base.jar给插件做依赖
6,使用AssertManager添加插件内的资源文件?
7,接管插件内组件的生命周期?
Instrumentation
实现概述
插件加载:使用加载器DexClassLoader来加载插件,利用反射机制来加载插件中的类,通过Method.invock()来调用
资源加载:通过AssertManager.addAssertPath来添加插件的资源文件路径,重写getAssets()和getResources()两个函数返回添加了新资源文件路径的AssertManager和Resources。
插件中组件的生命周期:通过宿主组件的生命周期函数来调用代理组件的对应函数或者用接口的方式(效率高);多使用Fragment。这还是不能解决activity跳转的问题。
dalvik.system.DexClassLoader的使用
参考《Android中的类装载器DexClassLoader》
DexClassLoader作用是动态加载class文件到dalvik来进行执行。
主要步骤:
DexClassLoader classLoader =
new DexClassLoader(apk_file_path, xxx, xxx, <ClassLoader_Object>);
Class<?> loadedClass = classLoader.loadClass(target_pakcage_name+target_class_name);
Instance instance = loadedClass.newInstance();
Method method = loadedClass.getMethod("target_method_name", Class[]_parameter_type);
Result_class result = (Result_Class)method.invoke(instance, parm_1, parm_2);
参考文章
http://blog.csdn.net/singwhatiwanna/article/details/39937639
https://github.com/limpoxe/Android-Plugin-Framework
http://www.trinea.cn/android/android-plugin/
http://mogu.io/117-117
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1130/3732.html
http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html