安卓插件化开发实践笔记

本文记录了作者在Android插件化开发过程中遇到的问题,包括`PackageArchiveInfo`为null和类找不到异常。在研究了Android9.0之后的存储访问变化后,作者采用了`getExternalFilesDir()`来替代直接访问外部存储,成功解决了问题。实践证明,使用`getExternalFilesDir()`的方法有效避免了类找不到的异常,确保了插件的正常加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

https://blog.youkuaiyun.com/n_fly/article/details/113785317

https://blog.youkuaiyun.com/n_fly/article/details/113865757

https://blog.youkuaiyun.com/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.youkuaiyun.com/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();
}

漂亮,问题解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值