安卓插件化开发实践笔记

关于如何实现插件化开发教程,网络上有很多,我转载的文章中,就有很多,如:

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();
}

漂亮,问题解决了。

猜你喜欢

转载自blog.csdn.net/n_fly/article/details/113865834