【发布时间】:2018-02-10 18:10:15
【问题描述】:
您好,我正在使用基于 jscheme 的 Android 应用(Scheme Droid),但如果您不熟悉它,也许您熟悉 Clojure。在任何情况下,它们都提供对虚拟机的访问(jvm、dalvik)。在计算机(任何拱门或操作系统)上,我可以动态加载我自己编译的类。但是当我尝试使用 android(加载 dex'ed jar)时,我遇到了无法修复的问题:
> (define inner-url-array (array java.net.URL.class (java.net.URL. "file:///sdcard/Test.jar")))
# (file:///sdcard/Test.jar)
> (define systemClassLoader (ClassLoader.getSystemClassLoader))
dalvik.system.PathClassLoader[DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib, /vendor/lib, /system/lib, /vendor/lib]]]
> (define arrlist (array java.lang.Class.class java.net.URL.class))
# (class java.net.URL)
> (define classLoaderClass java.net.URLClassLoader.class)
class java.net.URLClassLoader
> (define method (.getDeclaredMethod class LoaderClass "addURL" arrlist))
protected void java.net.URLClassLoader.addURL(java.net.URL)
> (.setAccessible method #t)
#null
> (.invoke method systemClassLoader inner-url-array)
Expected receiver of type java.net.URLClassLoader, but got dalvik.system.PathClassLoader
因此问题出在ClassLoader.getSystemClassLoader,即使我尝试转换为URLClassLoader 类,它也会拒绝。然后我尝试改用dalvik.system.DexClassLoader
> (import "dalvik.system.*")
# t
> (define classloader (DexClassLoader. "/sdcard/Test.jar" "/sdcard" #null (.getParent (ClassLoader.getSystemClassLoader))))
我现在收到此错误!:
优化后的数据目录 /sdcard 不属于当前用户。共享存储无法保护您的应用免受代码注入攻击。
为什么会拒绝写入 sdcard?是否有另一种解决方案来加载这样的 jar 文件,或者至少扩展应用程序的类路径?
【问题讨论】:
标签: java android classloader dalvik dex