如何解决DexClassLoader 返回 ClassNotFound 异常
我知道这可能是一个重复的问题,但我看到的大多数答案都没有回答我的问题, 所以我正在开发一个应用程序,我需要从 Apk 运行代码,我对该 apk 没有权力,所以我无法编辑代码或 apk,我有 apk 并将其保存到本地目录并尝试使用 DexClassLoader 访问它,但我总是得到这个异常
`2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: java.lang.ClassNotFoundException: Didn't find class "com.ashomok.tesseractsample.MainActivity" on path: DexPathList[[zip file "/storage/emulated/0/Movies/base.apk"],nativeLibraryDirectories=[/system/lib64,/product/lib64]]
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:230)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at com.sablab.fuzzyressoserverside.MainActivity$Thread2.run(MainActivity.java:175)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at java.lang.Thread.run(Thread.java:919)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: Suppressed: java.io.IOException: No original dex files found for dex location /storage/emulated/0/Movies/base.apk
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at dalvik.system.DexFile.openDexFileNative(Native Method)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at dalvik.system.DexFile.openDexFile(DexFile.java:369)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at dalvik.system.DexFile.<init>(DexFile.java:107)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at dalvik.system.DexFile.<init>(DexFile.java:80)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at dalvik.system.DexPathList.loadDexFile(DexPathList.java:457)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at dalvik.system.DexPathList.makeDexElements(DexPathList.java:403)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at dalvik.system.DexPathList.<init>(DexPathList.java:164)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:126)
2021-01-11 01:26:16.353 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:84)
2021-01-11 01:26:16.354 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at dalvik.system.DexClassLoader.<init>(DexClassLoader.java:55)
2021-01-11 01:26:16.354 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at com.sablab.fuzzyressoserverside.ApkRunner.getDexClassLoader(ApkRunner.java:19)
2021-01-11 01:26:16.354 11561-11626/com.sablab.fuzzyressoserverside W/System.err: at com.sablab.fuzzyressoserverside.MainActivity$Thread2.run(MainActivity.java:174)
2021-01-11 01:26:16.354 11561-11626/com.sablab.fuzzyressoserverside W/System.err: ... 1 more`
我如何使用 DexLoader
final String APk_LOCATION = "/storage/emulated/0/Movies/base.apk" ;
{DexClassLoader dexClassLoader = new DexClassLoader(APk_LOCATION,context.getCodeCacheDir().getAbsolutePath(),null,ClassLoader.getSystemClassLoader().getParent()
);
final Class<?> tessTwoClass = dexClassLoader.loadClass("com.ashomok.tesseractsample.MainActivity");
Method extractText = tessTwoClass.getDeclaredMethod("extractText",Bitmap.class);
Object defaultObject = tessTwoClass.newInstance();
final String ocrResult = (String) extractText.invoke(defaultObject,bitmap) ;}
现在是我想要做的事情实际上是可能的,还是我必须编辑我尝试访问的 APK,我可以使用此方法访问任何 Apk(如果不安全) 注意:该应用具有 readExternalStoragePermission
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。