gpt4 book ai didi

android - Android 5.0动态加载DEX文件

转载 作者:可可西里 更新时间:2023-11-01 18:47:37 25 4
gpt4 key购买 nike

在 Android 5.0 之前,我能够使用 DexClassLoader 和调用 loadClass() 方法动态加载 DEX 文件,但在最新的 Android 版本中我得到一个 ClassNotFoundException

这是我正在做的:

  1. 生成 DEX 文件。

    ../android-sdk/android-sdk-linux_86/build-tools/21.1.1/dx --dex --output=bin/output.dex  bin/output.jar
  2. 创建一个 DexClassLoader。

    DexClassLoader cl = new DexClassLoader(
    dexFile.getAbsolutePath(),
    odexFile.getAbsolutePath(),
    null,
    mContext.getClassLoader());
  3. 调用cl.loadClass("myMethod");

我知道 ART 使用 dex2oat 生成一个由 ART 加载的 ELF 文件,但在第 2 步中我生成了一个 ODEX 文件,所以我不需要在 ART 中做些什么来在运行时加载 DEX 文件,谁能帮帮我?

最佳答案

更新

这适用于 Dalvik 和 ART:new DexClassLoader(jarredDex.getAbsolutePath(), context.getDir("outdex", Context.MODE_PRIVATE).getAbsolutePath(), null, context.getClassLoader()); 其中 jarredDex 是一个包含 classes.dex 的 jar 文件。可以通过运行 dx --dex --output=filename.jar your/classes/dir 获取 Jar。


原始答案

我从 this article 中获取了代码示例.但是 ART 使用 PathClassLoader 而不是 Dalvik 的 DexClassLoader。此代码在 Android 6 的模拟器和 Android 5.1 的小米上测试并且工作正常:

// Before the secondary dex file can be processed by the DexClassLoader,
// it has to be first copied from asset resource to a storage location.
File dexInternalStoragePath = new File(getDir("dex", Context.MODE_PRIVATE), SECONDARY_DEX_NAME);
try (BufferedInputStream bis = new BufferedInputStream(getAssets().open(SECONDARY_DEX_NAME));
OutputStream dexWriter = new BufferedOutputStream(new FileOutputStream(dexInternalStoragePath))) {

byte[] buf = new byte[BUF_SIZE];
int len;
while((len = bis.read(buf, 0, BUF_SIZE)) > 0) {
dexWriter.write(buf, 0, len);
}
} catch (IOException e) {
throw new RuntimeException(e);
}

try {
PathClassLoader loader = new PathClassLoader(dexInternalStoragePath.getAbsolutePath(), getClassLoader());
Class<?> toasterClass = loader.loadClass("my.package.ToasterImpl");
Toaster toaster = (Toaster) toasterClass.newInstance();
toaster.show(this, "Success!");
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}

关于android - Android 5.0动态加载DEX文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27349097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com