【问题标题】:load jar/dex dynamically from an android app从 Android 应用程序动态加载 jar/dex
【发布时间】: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


    【解决方案1】:

    为什么会拒绝写入 sdcard?

    错误消息是针对读操作,而不是写操作。

    至于为什么,错误消息是不言自明的。 Google 不希望应用从不受信任的来源(例如 external storage)加载代码。

    还有其他解决方案可以加载类似的 jar 文件或至少扩展应用程序的类路径吗?

    让托管应用程序将 DEX 下载到应用程序的 internal storage,验证 DEX 没有被篡改(例如,将 DEX 打包在您随后验证的签名 JAR 中),然后从那里加载 DEX .

    请注意,这样的动态代码加载可能会违反您选择的应用分发渠道的服务条款,如果您计划基于此分发任何内容。

    【讨论】:

    • “让托管应用程序将 DEX 下载到应用程序的内部存储中”。如何做到这一点?当然,内部存储对于任何其他应用程序都是不可行的,因此复制/粘贴将不起作用。托管应用不下载东西
    • @francogrex:“托管应用程序不下载东西”——然后与托管应用程序的开发人员交谈,并要求他们添加一些内容以允许您做您想做的事情.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    相关资源
    最近更新 更多