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

时间:2013-09-24 06:59:03

标签: java android

我知道可以通过以下方式在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"不同,但功能必须相同。我不知道我要做什么,谷歌不想帮我解决这个问题。 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

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

关于做这类事情的官方文件是Controlling the Embedded VMin source tree)。 execution-mode属性会影响所有应用,因为VM只启动一次 - 作为“zygote” - 并且所有应用都是通过分叉该过程启动的。

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

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

答案 1 :(得分:2)

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

我相信您可以为您的流程停用jnicheck,但这就是它。

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