外掛程式化步驟:
主apk分析:
dex靠pathclassloader載入
以及xml資源靠resource載入
**實現:
建立dexclassloader載入外掛程式**
建立resource載入資源檔案
管理外掛程式activity生命週期
外掛程式化基礎:反射
總結一句話:反射可以讓程式設計師拋開**的限制,任意使用各種方法。
try catch (illegalacces***ception e) catch (instantiationexception e) catch (nosuchmethodexception e) catch (invocationtargetexception e) catch (classnotfoundexception e)
外掛程式化原理:動態載入
通過自定義 classloader 來載入新的 dex 檔案,從而讓程式設計師原本沒有的類可以被使用,這就是外掛程式化的原理。
file dexfile = new file(getcachedir() + "/plugin.dex");
if (!dexfile.exists()) catch (exception e)
}try catch (classnotfoundexception e) catch (illegalacces***ception e) catch (instantiationexception e) catch (nosuchmethodexception e) catch (invocationtargetexception e)
}
dexclassloader構造方法引數說明:
dexpath:apk/dex/jar檔案路徑
optimizeddirectory:檔案解壓路徑(這個路徑下儲存的是.dex檔案不是.class)
librarypath:載入時用到的so庫(可能理解有問題)
parent:父載入器(這個比較重要與android載入class的機制有關)
public dexclassloader(string dexpath, string optimizeddirectory,
string librarypath, classloader parent)
解決方式二:重寫 gradle 打包過程,合併 androimanifest.xml
public class proxyactivity extends activity catch (illegalacces***ception e) catch (instantiationexception e) catch (nosuchmethodexception e) catch (invocationtargetexception e)
return super.getassets();
}@override
public resources getresources()
}
外掛程式化在**中有固定的入口,而熱更新則可能改變任何⼀個位置的**
對於具體的⼀個 classloader:
先從自己的快取中取
自己沒有快取,就找父classloader 要(parent.loadclass())
父classloader也沒有,就自己載入(findclass())basedexclassloader 或者它的⼦類(dexclassloader、 pathclassloader 等)的findclass():通過 pathlist.findclass(),它的 pathlist.loadclass() 通過 dexpathlist 的 dexelements 的 findclass()。
public class> loadclass(string name) throws classnotfoundexception
//
protected class> loadclass(string name, boolean resolve)
throws classnotfoundexception
else
} catch (classnotfoundexception e)
if (c == null)
}return c;
}
所以熱更新的關鍵在於,把補丁 dex 檔案載入放進⼀個 element,並且插入到 dexelements 這個陣列的前面(插入到後面的話會被忽略掉)
具體的**:
自己用補丁建立⼀個 pathclassloader
try
for (int i = 0; i < oldlength; i++)
dexelementsfield.set(pathlistobject, concatdexelementsobject);
} catch (nosuchfieldexception e) catch (illegalacces***ception e)
熱修復和外掛程式化
某個特定的類載入器在接到載入類的請求時,首先將載入任務委託給父類載入器,依次遞迴,如果父類載入器可以完成類載入任務,就成功返回 只有父類載入器無法完成此載入任務時,才自己去載入。保證了只載入一次 乙個classloader可以包含多個dex檔案,每個dex檔案是乙個element,多個dex檔案排列...
安卓外掛程式化與熱修復的選型
參考文章 安卓外掛程式化的過去現在和未來 張濤 安卓外掛程式化從入門到放棄 包建強 安卓熱補丁動態框架小結 鴻洋 專訪羅迪 高二android大牛的成長之路 droidplugin的原理 安卓從三年前第乙個外掛程式化實現,到現在已經有很多種實現方法,主要目的為了減小模組耦合,方便在專案體量變大之後實...
本地伺服器熱更新 外掛程式 live server
本地伺服器熱更新 外掛程式 live server 超級好用 強烈種草一波 無需安裝到專案中 使用方法如下 1.先全域性安裝live server 2.在需要熱更新或本地伺服器的專案終端,輸入live server 然後回車 live server 3.因為預設埠是8080,所以如果想修改埠,輸入以...