通过DexClassLoader加载未安装的apk,提供资源供宿主app使用。因为apk是未安装的,不可能通过createPackageContext(…)方法来构建出一个context,所以这时只有在Resource上下功夫,来获取插件apk的Resource对象。
综述
关于动态加载未安装的apk
- 获取插件apk存放在哪个目录下,然后分别得到插件apk的信息(名称、包名等),然后显示可用的插件,最后动态加载apk获得资源。
实验步骤
1.先准备一个测试工程
2.在工程的mipmap目录下放入one.png
3.打包工程build apk,改名为test.apk
4.adb push test.apk的文件路径 /sdcard/
5.准备动态加载工程
6.获取test.apk的包信息
|
|
7.利用反射得到目标Resources对象
|
|
8.动态加载apk
|
|
注意
此处需要注意DexClassLoader的四个参数:
- dexPath:待加载的dex文件路径,如果是外存路径,一定要加上读外存文件的权限(
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>6.0应注意动态申请权限 )。- optimizedDirectory:解压后的dex存放位置,此位置一定要是可读写且仅该应用可读写(安全性考虑),所以只能放在data/data下。本文getDir(“dex1”, 0)会在/data/data/**package/下创建一个名叫”app_dex1“的文件夹,其内存放的文件是自动生成output.dex。
- libraryPath:指向包含本地库(so)的文件夹路径,可以设为null。
- parent:父级类加载器,一般可以通过Context.getClassLoader获取到,也可以通过ClassLoader.getSystemClassLoader()取到。