低版本的Android系统 InMemoryDexClassLoader没有传librarySearchPath的构造函数能否自定义一个DexClassLoader内部持有一个InMemoryDexClassLoader弥补不能读so的缺陷
是的,可以自定义一个DexClassLoader类,在其内部持有一个InMemoryDexClassLoader对象,以弥补不能读取so的缺陷。
示例代码如下:
public class CustomDexClassLoader extends DexClassLoader {
private InMemoryDexClassLoader inMemoryDexClassLoader;
public CustomDexClassLoader(String dexPath, String optimizedDirectory, String librarySearchPath, ClassLoader parent) {
super(dexPath, optimizedDirectory, librarySearchPath, parent);
inMemoryDexClassLoader = new InMemoryDexClassLoader(dexPath, parent);
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
return super.findClass(name);
} catch (ClassNotFoundException e) {
return inMemoryDexClassLoader.findClass(name);
}
}
@Override
public URL getResource(String name) {
URL resource = super.getResource(name);
if (resource == null) {
resource = inMemoryDexClassLoader.getResource(name);
}
return resource;
}
}
在自定义的CustomDexClassLoader类中,构造函数中传入了dexPath、optimizedDirectory、librarySearchPath和parent参数,其中librarySearchPath用于加载so库。
在findClass()方法中,先调用父类的findClass()方法尝试从dex文件中加载类,如果找不到,则调用内部持有的InMemoryDexClassLoader的findClass()方法从内存中加载类。
在getResource()方法中,先调用父类的getResource()方法尝试从dex文件中加载资源,如果找不到,则调用内部持有的InMemoryDexClassLoader的getResource()方法从内存中加载资源。
通过自定义的CustomDexClassLoader类,可以在低版本的Android系统中使用InMemoryDexClassLoader来加载dex文件中的类和资源,从而弥补不能读取so的缺陷
原文地址: https://www.cveoy.top/t/topic/itQm 著作权归作者所有。请勿转载和采集!