- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想使用 dex 类加载器将代码动态加载到我的 Android 应用程序中。我遵循了本教程:http://www.marioalmeida.eu/2015/01/27/how-to-easy-way-load-apk-classes-using-dexclassloader/ .但是我得到以下错误堆栈跟踪:
01-08 12:25:38.007 15147-15147/com.ph.dexloader W/System.err: java.lang.ClassNotFoundException: Didn't find class "com.ph.injection.Injection" on path: DexPathList[[zip file "/storage/emulated/0/testjars/injector.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at com.ph.dexloader.MainActivity.test3(MainActivity.java:153)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at com.ph.dexloader.MainActivity$1.onClick(MainActivity.java:34)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at android.view.View.performClick(View.java:5198)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at android.view.View$PerformClick.run(View.java:21147)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at android.os.Looper.loop(Looper.java:148)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5417)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at java.lang.reflect.Method.invoke(Native Method)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: Suppressed: java.io.IOException: No original dex files found for dex location /storage/emulated/0/testjars/injector.apk
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at dalvik.system.DexFile.openDexFileNative(Native Method)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at dalvik.system.DexFile.openDexFile(DexFile.java:295)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at dalvik.system.DexFile.<init>(DexFile.java:111)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at dalvik.system.DexFile.loadDex(DexFile.java:151)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at dalvik.system.DexPathList.loadDexFile(DexPathList.java:282)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at dalvik.system.DexPathList.makePathElements(DexPathList.java:248)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at dalvik.system.DexPathList.<init>(DexPathList.java:120)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:48)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at dalvik.system.DexClassLoader.<init>(DexClassLoader.java:57)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at com.ph.dexloader.MainActivity.test3(MainActivity.java:146)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: ... 10 more
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: Suppressed: java.lang.ClassNotFoundException: Didn't find class "com.ph.injection.Injection" on path: DexPathList[[zip file "/data/app/com.ph.dexloader-2/base.apk"],nativeLibraryDirectories=[/data/app/com.ph.dexloader-2/lib/x86, /vendor/lib, /system/lib]]
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: ... 12 more
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: Suppressed: java.lang.ClassNotFoundException: Didn't find class "com.ph.injection.Injection" on path: DexPathList[[dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-support-annotations-24.1.0_ae5436f3e75e322599cc28c891c7bbfb3749511e-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-slice_2-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-slice_1-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-slice_0-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-internal_impl-24.1.0_3cdb966acce2459aa95bcd6df4240d298e8a6aa0-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-com.android.support-support-vector-drawable-24.1.0_68483e445bfd7fe2615d6637e23aa54f7eca71ad-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-com.android.support-support-v4-24.1.0_0b01882602c790d27bb53e6d99c19f41bfa0f42f-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-com.android.support-appcompat-v7-24.1.0_ffbd2666f53be3072a55297d806cbb863283a31e-classes.dex", dex file "/data/data/com.ph.dexloader/files/instant-run/dex/slice-com.android.support-animated-vector-drawable-24.1.0_fa7ca9f78df22fc1c453fed6517df1a2457fbf73-classes.dex"],nativeLibraryDirectories=[/data/app/com.ph.dexloader-2/lib/x86, /vendor/lib, /system/lib]]
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoader.findClass(IncrementalClassLoader.java:90)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at com.android.tools.fd.runtime.IncrementalClassLoader.findClass(IncrementalClassLoader.java:62)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: ... 13 more
01-08 12:25:38.008 15147-15147/com.ph.dexloader W/System.err: Suppressed: java.lang.ClassNotFoundException: com.ph.injection.Injection
01-08 12:25:38.009 15147-15147/com.ph.dexloader W/System.err: at java.lang.Class.classForName(Native Method)
01-08 12:25:38.009 15147-15147/com.ph.dexloader W/System.err: at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
01-08 12:25:38.009 15147-15147/com.ph.dexloader W/System.err: at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
01-08 12:25:38.009 15147-15147/com.ph.dexloader W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
01-08 12:25:38.009 15147-15147/com.ph.dexloader W/System.err: ... 14 more
01-08 12:25:38.009 15147-15147/com.ph.dexloader W/System.err: Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
我创建了一个没有 Activity 的 Android 项目和我要加载的以下类:
package com.ph.injection;
import android.util.Log;
public class Injection {
public void inject() {
/* this code is getting injected */
Log.d("INJECTED", "This is injected code!");
}
}
我使用 gradle assemble 生成了 APK 文件,并将其放入模拟器上的/storage/emulated/0/testjars/injector.apk 中。
这是我用来加载 DEX 文件的代码:
String dexFile = "/testjars/injector.apk";
// Get the path to the SD card
File f = new File(Environment.getExternalStorageDirectory().toString() + dexFile);
final File optimizedDexOutputPath = getDir("outdex", 0);
DexClassLoader classLoader = new DexClassLoader(f.getAbsolutePath(), optimizedDexOutputPath.getAbsolutePath(),null, getClassLoader());
// The classpath is created for the new class
String completeClassName = "com.ph.injection.Injection";
String methodToInvoke = "inject";
try {
Class<?> myClass = classLoader.loadClass(completeClassName);
Object obj = (Object) myClass.newInstance();
Method m = myClass.getMethod(methodToInvoke);
m.invoke(obj);
}
catch (Exception e) {
e.printStackTrace();
}
我不知道为什么没有正确加载 DEX 文件/找不到类。有人可以帮助我吗?如果重要的话,我会使用 Genymotion Android 6.0.0 模拟器。
谢谢!
最佳答案
假设您没有遇到与 DexClassLoader 无关的问题,例如没有读取和写入外部存储的权限,问题很可能是您没有将您的应用配置为启用 multidex。在 gradle 中,您可以这样配置您的应用:
defaultConfig {
…
multiDexEnabled true
}
如果您的目标应用程序低于 api 26,那么您还必须添加对 mulitdex 支持库的依赖。对于 api 26 及更高版本,这不是必需的,因为它已经嵌入到 android 中。
如果您考虑一下,如果您尝试加载外部代码,该代码存在于另一个 dex 文件中,因此您需要为您的应用程序启用 multidex 才能使其正常工作。大多数人只有在达到单个 dex 应用程序的 65K 方法限制时,才会将他们的应用程序配置为启用 multidex。在运行时访问外部代码只是让您的应用程序启用多索引的另一个原因。注意:您引入的外部代码不必构建为启用 multidex。
如果您的应用程序已经启用了 multidex,那么您会收到无法找到您的类的消息的另一个原因(假设您指定了包含所需类和正确类名的 jar)是您要加载的类,需要一个找不到的类。追踪起来可能有点棘手。您收到的错误消息是您找不到您的类,而实际上问题是它找不到从属类。
根据我的经验,“关闭实例运行”和“禁用 dex 优化”之类的解决方案通常偏离正轨,通常只与某些特定的旧版本相关,可能是测试版,并且已经得到纠正。它们被称为阿司匹林解决方案,因为在某些情况下它们确实有效,但潜在的问题仍然是个谜。
关于Android dex 类加载器 - 找不到类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41535711/
Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files defi
我试图在 avd 中运行我的应用程序,但是当我选择运行 gradle 时出现异常: Error:Error converting bytecode to dex: Cause: com.android
当我提取一个文件 aab 时出现这个错误: Invalid dex file indices, expecting file 'classes٢.dex' but found 'classes2.de
我有一个 ionic 项目。它已成功构建并在我的 android 手机中运行。突然有一天,当我运行命令“ionic cordova run android”时,我得到如下构建错误: Dex: Erro
这个问题在这里已经有了答案: Unable to execute dex: Multiple dex files define (31 个回答) 4年前关闭。 我更新了 android studio
从过去 3 天开始,我遇到了这个错误,并且已经尽了我所能。任何人都可以帮我纠正它。我正在使用 Android 3.0,我的 sdk 和 Google Play 服务已更新,并且我已将 multiDex
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.nnroh.debtmanager, PI
好的,现在我真的被困在这里了。我不知道该做什么,去哪里或任何事情! 我一直在尝试卸载、重新安装 SDK 和 Eclipse 版本,尝试用谷歌搜索出来,但是 nu-uh... 什么都没有!!! 我可以在
怎么了?为什么我有这个问题? Unable to execute dex: Multiple dex files define Lcom/nineoldandroids/animation/Anima
我尝试运行我的 android 应用程序,但出现此错误。 [2014-03-11 11:21:34 - Dex Loader] Unable to execute dex: Multiple dex
我希望指定包中的所有类都驻留在主 dex 文件中。 那里有使用通配符的选项吗? 最佳答案 很遗憾,不支持通配符。 但是,您可以使用 this script 生成 main-dex-list 文件。 .
我目前有一个来自霍尼韦尔的 DEX BLE-1 适配器,用于从自动售货机检索 dex 数据。我有一个 swift 3 iOS 应用程序,它使用 CoreBluetooth 进行扫描并与外围设备配对。该
我正在使用 IntelliJ IDEA 12.1.4,在我的项目中我使用了几个库/项目: ActionBarSherlock ViewPagerIndicator Volley ProgressShe
我在尝试运行我的项目时遇到了这个问题 - com.android.builder.dexing.DexArchiveBuilderException: Failed to process .gradl
我一直在四处寻找,有很多帖子与这个问题有关,但似乎没有确定的解决方案(例如 Error when building apk - "Multiple dex files define Lcom/goog
我正在对 Jan Berkel 的 SBT Android 插件进行一些黑客攻击,我在想是否有一种方法可以将多个 .dex 文件合并到一个 .dex 文件中包含所有这些。 例如,如果我有这个: cla
我在尝试运行我的应用程序时遇到了这些问题,但不知道如何解决... 谁能帮帮我 这是错误: [2014-04-18 18:47:35 - Dex Loader] Unable to execute de
这个问题在这里已经有了答案: Android support multidex library implementation (4 个回答) 4年前关闭。 生成签名的apk时,有这个错误,但构建项目是
我有一个 Android 应用程序,(理论上)它可以变成一个库并放入外部应用程序中。然后外部应用程序可以创建一个包含我的应用程序的选项卡。库应用程序的设置方式与 google-play-service
我正在开发一个 android 应用程序并且 gradle 构建工作正常但是现在当我构建我的 android 项目时,gradle 构建失败并显示以下错误 Error converting bytec
我是一名优秀的程序员,十分优秀!