关于如何实现插件化开发教程,网络上有很多,我转载的文章中,就有很多,如:
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();
}
漂亮,问题解决了。