2

我知道可以通过以下方式在 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"自动启动此应用程序。

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

4

2 回答 2

3

我认为@Delyan 的回答很重要,但我想添加一些不适合评论的细节。

做这种事情的官方文档是控制嵌入式虚拟机在源代码树中)。该execution-mode属性影响所有应用程序,因为虚拟机只启动一次——作为“zygote”——并且所有应用程序都是通过分叉该进程启动的。

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

大多数 DEX 优化和验证都是在应用程序启动之前由 dexopt 执行的,结果存储在 .odex 文件中/data/dalvik-cache,因此调整-Xdexopt-Xverify在应用程序启动时可能不会做太多(参见dexopt 文档源代码)。

于 2013-10-21T15:58:49.700 回答
2

我有理由确定你不能。您可以更改系统范围的解释器模式,setprop dalvik.vm.execution-mode int:portable但您需要 root。我不知道有什么方法可以dexopt只为您的进程禁用(这将是一个安全风险!)。你肯定不能触及引导类路径(这是你的应用程序最初运行的类路径)。

我相信您可以禁用jnicheck您的流程,但仅此而已。

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

于 2013-09-24T10:35:15.527 回答