天天看點

安卓插件化開發實踐筆記

關于如何實作插件化開發教程,網絡上有很多,我轉載的文章中,就有很多,如:

https://blog.csdn.net/n_fly/article/details/113785317

https://blog.csdn.net/n_fly/article/details/113865757

https://blog.csdn.net/n_fly/article/details/113865650

已經足夠詳細。本文旨在對我在插件化開發實踐中遇到了哪些問題,以及最終是怎麼解決的,做個簡單的記錄,如果能順便幫助網友,那是莫大的榮幸。

問題一、在dexPath檢查無誤的情況下,pluginPackageArchiveInfo對象為null值

PackageManager packageManager = getPackageManager();
PackageInfo pluginPackageArchiveInfo = packageManager.getPackageArchiveInfo(dexPath, PackageManager.GET_ACTIVITIES);
           

問題二、在dexPath确實是插件apk所在路徑,dexOutPath路徑存在,且"com.kk.pluginproject.Student"類路徑拼寫無誤,确實存在于插件app内的基礎上,報類找不到異常

DexClassLoader pluginDexClassLoader = new DexClassLoader(dexPath, dexOutPath, null, getClassLoader());
Class<?> clz = pluginDexClassLoader.loadClass("com.kk.pluginproject.Student");
           

帶着上述問題,我求助了百度、Google,看網友是否和我遇到同樣的問題,無意中看到這篇文章,被我順便轉載在我的部落格下:

https://blog.csdn.net/n_fly/article/details/113865424

看到如下内容:在Android9.0 之後就廢棄了(為了提高使用者隐私,不建議直接通路共享/外部儲存設備),并且不再傳回可通路的檔案。

那怎麼寫了,官方推薦使用:

context.getExternalFilesDir(String type)
           

我有一種感覺,這個能解決我的問題,實踐是檢驗真理的唯一方法,話不多說,立馬幹!

File downloadsDir = getExternalFilesDir(DIRECTORY_DOWNLOADS);
String downloadsPath = downloadsDir.getAbsolutePath();
String dexPath = downloadsPath+"/PluginProject.apk";

File dexOutFile = getDir("dex", MODE_PRIVATE);
String dexOutPath = dexOutFile.getAbsolutePath();

try {
    // 擷取包名
    PackageManager packageManager = getPackageManager();
    PackageInfo pluginPackageArchiveInfo = packageManager.getPackageArchiveInfo(dexPath, 
            PackageManager.GET_ACTIVITIES);

    // ....
    DexClassLoader pluginDexClassLoader = new DexClassLoader(dexPath, dexOutPath, null, 
            getClassLoader());
    Class<?> clz = pluginDexClassLoader.loadClass("com.kk.pluginproject.Student");
    // ...
} catch (Exception e) {
    e.printStackTrace();
}
           

漂亮,問題解決了。