如何通过.apk传递dalvik命令行参数?

我知道有可能以这种方式在Android中启动java程序:

adb push "hello_world.zip" $REMOTE_PATH/ adb shell mkdir $REMOTE_PATH/dalvik-cache adb shell dalvikvm -cp "$REMOTE_PATH/hello_world.zip" -Xint:portable -Xdexopt:none -Xverify:none hello_world 

这很好!

但现在我想创建Android .apk文件。 我希望这个应用程序能够使用相同的命令行参数"-Xint:portable -Xdexopt:none -Xverify:none"自动启动。

我假设参数名称可能与此"-Xint:portable -Xdexopt:none -Xverify:none" ,但function必须相同。 我不知道我要做什么,谷歌不想帮我解决这个问题。 任何帮助将非常感激!

我有理由相信你做不到。 您可以使用setprop dalvik.vm.execution-mode int:portable更改系统范围的解释器模式,但您需要root。 我不知道有什么办法只为你的进程禁用dexopt (这会带来安全风险!)。 你肯定无法触及bootclasspath(这是你的app最初运行的类路径)。

我相信你可以为你的过程禁用jnicheck但这就是它。

设备上的应用程序通过app_processapp_process运行,您可以将它们视为Dalvik周围的限制包装器。 除了最初的dalvikvm之外,没有dalvikvm调用 – 每个未来的进程都以fork()开头,所以你不能在不弄乱zygote的情况下实际更改这些参数。 (我正在简化,但我很确定我是对的)

我认为@ Delyan的答案达到了重点,但我想补充一些不符合评论的细节。

执行此类操作的官方文档是控制嵌入式VM ( 在源代码树中 )。 execution-mode属性会影响所有应用程序,因为VM仅启动一次 – 作为“zygote” – 并且所有应用程序都是通过分叉该进程启动的。

可能会在VM启动后更改VM的模式,可能是通过引入新的VMRuntime API调用,但我认为没有人尝试过,我不确定它是如何与JIT编译器进行交互的。

大多数DEX优化和validation是在应用程序启动之前由dexopt执行的,结果存储在/data/dalvik-cache中的.odex文件中,因此在应用程序启动时调整-Xdexopt-Xverify可能不会做太多(请参阅dexopt docs ; source )。