我知道可以通过以下方式在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"
不同,但功能必须相同。我不知道我要做什么,谷歌不想帮我解决这个问题。
任何帮助将不胜感激!
答案 0 :(得分:3)
我认为@ Delyan的回答达到了重点,但我想补充一些不适合评论的细节。
关于做这类事情的官方文件是Controlling the Embedded VM(in 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()
开头,所以你不能在不弄乱合子的情况下实际更改这些参数。 (我正在简化,但我很确定我是对的)