最近在业务需求开发的过程中顺便研究了一下动态加载,感觉还是挺有意思的,给大伙儿分享下:
文章会分为三部分去示例不同的动态加载:
- resource动态加载
- dex动态加载
- so动态加载
一. Resource动态加载
resource动态加载包括:assets动态加载;res文件动态加载。
主要代码如下:
private void test(File file) {
int API = Build.VERSION.SDK_INT;
if (API >= Build.VERSION_CODES.R) {
if (rl == null) {
rl = new ResourcesLoader();
}
try {
File f = new File(file, "***.jar");
ParcelFileDescriptor pfd = ParcelFileDescriptor.open(f, MODE_READ_WRITE);
ResourcesProvider provider = ResourcesProvider.loadFromApk(pfd);
rl.addProvider(provider);
getResources().addLoaders(rl);
// 通过资源名获取资源ID
int stringResourceId = resources.getIdentifier("your_string_resource_name", "string", getPackageName());
// 获取字符串资源
String stringValue = resources.getString(stringResourceId);
//查看assets中的资源是否成功动态加载,然后自行处理逻辑
String[] paths = getAssets().list("");
if (paths != null && paths.length > 0) {
for (String s : paths) {
Log.e(TAG, "getAssets: " + s);
}
} else {
Log.e(TAG, "paths is null ");
}
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "Exception:" + e.getMessage());
}
} else {
AssetManager assetManager = getAssets();
try {
String[] paths = assetManager.list("");
if (paths != null && paths.length > 0) {
for (String s : paths) {
Log.i(TAG, "s = " + s);
}
}
File[] files = file.listFiles();
if (files != null && files.length > 0) {
for (File file1 : files) {
String name = file1.getName();
Method addAssetPath = assetManager.getClass().getMethod