外掛程式化與熱更新

2021-10-01 06:33:03 字數 2569 閱讀 5827

外掛程式化步驟:

主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,所以如果想修改埠,輸入以...