我已成功通过以下方式从dex文件动态加载类
enter code here
File file = getDir("dex", 0);
DexClassLoader dexClassLoader = new DexClassLoader("/data/data/com.example.callerapp/files/test.dex", file.getAbsolutePath(), null, getClassLoader());
try {
Class<Object> _class = (Class<Object>)
dexClassLoader.loadClass("com.example.calledapp.test");
Object object = _class.newInstance();
Method method = _class.getMethod("function");
method.invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
但是我想做的是从aar文件动态加载类,如android dev页面所示(DexClassLoader:一个类加载器,它从包含classes.dex条目的.jar和.apk文件中加载类。可以使用执行未作为应用程序一部分安装的代码。)
我在Android Studio中创建了一个库模块(“ testlibrary”),在该库模块中创建了Test.java(我想在调用方应用中动态加载的内容),并通过Gradle Project-> Excute Gradle Task创建了一个aar文件
如何通过dexclassloader在以这种一般方式创建的aar文件中动态加载类?我已通过提供商将aar文件从CalledApp移到CallerApp
还是创建aar文件的过程错误?在运行期间,出现错误消息
02-10 09:43:48.744 16487-16487/com.example.callerapp W/System.err: java.lang.ClassNotFoundException: Didn't find class "com.example.calledlibrary.Test" on path: DexPathList[[zip file "/data/data/com.example.callerapp/files/testlibrary.aar"],nativeLibraryDirectories=[/system/lib64, /vendor/lib64]]
02-10 09:43:48.744 16487-16487/com.example.callerapp W/System.err: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
02-10 09:43:48.744 16487-16487/com.example.callerapp W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
02-10 09:43:48.744 …Run Code Online (Sandbox Code Playgroud)