![]() |
VOOZH | about |
我們通過使用DexClassLoader能夠將classes.dex中的類動態的加載進入當前進程。當然,也就可以預先定一些代理的接口完成四大組件的功能。
整體功能如下圖所示:
當然,對於一個Android的應用程式而言,只是動態的加載類與聲明四大組件是不夠的。如下圖所示,使我們常見到的一個APK文件解壓縮後的文件內容。
有過Android項目開發的同學看到此目錄應該不會特別的陌生,因為與我們開發Android應用程式時候的開發環境極為相似。但是,解壓出來的文件畢竟不是源碼,我們是無法直接閱讀和修改的。對於其中的每個文件夾與文件,說明如下:
- assets 聲音、字體、網頁...資源, - org 帶三方庫,如org.apache.http庫 - com 帶三方庫,不解釋 - lib 應用中使用到的native庫 - armeabi .so文件,c/c++代碼庫文件 - META-INF APK的簽名文件【***.RSA、***.SF、***.MF三個文件 】 - res 應用中使用到的資源目錄 -
AndroidManifest.xml 應用的屬性定義文件 - classes.dex Java源碼編譯後的代碼文件 - resources.arsc 編譯後的資源文件
這個對於我們的插件安裝也是一樣的,從目錄中我們能夠看出,如果我們需要做一個插件框架。除了使用ClassDexLoader解析加載classes.dex之外,從一個正常的APK安裝流程中
插件簽名校驗
安裝native library,即完成Java Class與C/C++的調用
處理AndroidManifest.xml,動態聲明不同的組件/權限/廣播/服務/Theme
存儲ShreadPreference/SQLite/cache等文件
插件卸載
宿主調用插件的功能、插件回調宿主的代碼
多個插件間功能的相互調用
只有完成了上述的幾個問題,我們才能將此框架認為是一個較為合理的插件框架,不然也只能算是一個動態啟動Activity的過程。
/*