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 (将#修改为@)