简介:我正在尝试从classes.dex
classes.jar 中的运行时加载代码。我已经做了很多研究,也花了很多时间在这上面,所以我真的需要帮助。
问题:当我的 jar 包含一个简单的类时,它会成功加载。但是,在完全相同的情况下,当我的 jar 包含相同的类时,现在该类实现了一个 interface,加载此类失败并出现错误:
“在路径上找不到类“com.xyzwPatch”:DexPathList[[zip 文件“/data/user/0/xyz/app_dex/classes_dexed.jar”],nativeLibraryDirectories=[/vendor/lib64, /system/lib64] ]"
我也得到:
I/dalvikvm:解析 Lcom/x/y/TestClassImpl 失败;接口 4 'Lcom/x/y/TestClassInterface;'
环境: - 用于尝试加载类的函数:
(DexClassLoader 实例).loadClass & (DexFile 实例).loadClass。
具体来说:
方法一:
DexFile dx = DexFile.loadDex(jarInternalPath, File.createTempFile("opt", "dex",
context.getCacheDir()).getPath(), 0);
Class<?> targetClass = dx.loadClass(className,
ClassLoader.getSystemClassLoader()); // Error
方法二:
DexClassLoader dexClassLoader = new DexClassLoader(jarInternalPath,
dexOutPath.getAbsolutePath(), null, ClassLoader.getSystemClassLoader());
Class<?> targetClass = dexClassLoader.loadClass(className); // Error
- IDE:Android Studio 2.1.2
- 测试设备:Emulator Nexus 4(带有 API 16、19 和 23),以及带有 Android 6.0.1 的物理 Nexus 5 设备
- 最令人惊讶的事情:当我打印 dex 文件的类时,我看到了正确的类路径。我使用 DexFile 加载 dex 内容并打印其类路径。此方法识别正确的内容!这让我觉得这与 Android 权限或 Linux 权限有关。我不知道..
这是我的打印方法:
try {
DexFile dx = DexFile.loadDex(jarInternalPath, File.createTempFile("opt", "dex",
context.getCacheDir()).getPath(), 0);
// Print all classes in the DexFile
for (Enumeration<String> classNames = dx.entries(); classNames.hasMoreElements();) {
String className = classNames.nextElement();
Log.d(TAG, "Analyzing dex content, fonud class: " + className);
}
} catch (IOException e) {
Log.d(TAG, "Error opening " + jarInternalPath, e);
}
- PS 似乎无关紧要,但也许不是:我的主机应用程序、通用界面和新内容的实现都位于同一项目的 3 个不同模块中。该应用程序的包名称为 xyz,接口的 pkgName 为 xyzinterface,实现的 pkgName 为 xyzimpl。
我尝试将所有 3 个模块放在同一个项目中的第二个项目,1 个模块无法以相同的方式工作。
请帮忙!