移動應(yīng)用產(chǎn)品更新非常快兰绣,需求變化頻繁搪柑,而想讓這些需求到用戶的手機(jī)上一般只能通過軟件發(fā)布/推送/更新的流程聋丝,這個過程非常緩慢而且轉(zhuǎn)換率不高。
動態(tài)更新應(yīng)用工碾,廣義上說是對開發(fā)和發(fā)布流程的解耦弱睦。
基礎(chǔ)知識:
1,JVM雙親委派模型和java.lang.ClassLoader加載機(jī)制
2渊额,dalvik.system.DexClassLoader 和 dalvik.system.PathClassLoader
3况木,apk打包過程
4,aapt如何編譯資源文件旬迹,如何命名資源文件的ID火惊?
問題① 如何在插件中引用宿主apk的資源?
使用-I參數(shù)對宿主的apk進(jìn)行引用奔垦。據(jù)此屹耐,插件的資源、xml布局中就可以使用宿主的資源和控件椿猎、布局類了惶岭。其實(shí)每個應(yīng)用在編譯時都會依賴android.jar。
問題② 如何為插件指定資源文件的ID犯眠?
使用--apk-module參數(shù)
問題③ 按灶??筐咧?
5鸯旁,代碼編譯時如何解決對宿主項(xiàng)目的依賴噪矛?
問題① 從宿主工程中導(dǎo)出base.jar給插件做依賴
6,使用AssertManager添加插件內(nèi)的資源文件铺罢?
7艇挨,接管插件內(nèi)組件的生命周期?
Instrumentation
實(shí)現(xiàn)概述
插件加載:使用加載器DexClassLoader來加載插件畏铆,利用反射機(jī)制來加載插件中的類雷袋,通過Method.invock()來調(diào)用
資源加載:通過AssertManager.addAssertPath來添加插件的資源文件路徑,重寫getAssets()和getResources()兩個函數(shù)返回添加了新資源文件路徑的AssertManager和Resources辞居。
插件中組件的生命周期:通過宿主組件的生命周期函數(shù)來調(diào)用代理組件的對應(yīng)函數(shù)或者用接口的方式(效率高)楷怒;多使用Fragment。這還是不能解決activity跳轉(zhuǎn)的問題瓦灶。
dalvik.system.DexClassLoader的使用
參考《Android中的類裝載器DexClassLoader》
DexClassLoader作用是動態(tài)加載class文件到dalvik來進(jìn)行執(zhí)行鸠删。
主要步驟:
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);
參考文章
《攜程Android App插件化和動態(tài)加載實(shí)踐》
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