Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过.apk传递dalvik命令行参数?_Java_Android - Fatal编程技术网

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

Java 如何通过.apk传递dalvik命令行参数?,java,android,Java,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文件。我希望这个

我知道在安卓系统中启动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-xdexpt:none-Xverify:none”

我假设参数名称可能不同于此
“-Xint:portable-xdexpt:none-Xverify:none”
,但功能必须相同。我不知道我要做什么,谷歌也不想帮我解决这个问题。
任何帮助都将不胜感激

我有理由肯定你不能。您可以使用
setprop dalvik.vm.execution-mode int:portable
更改系统范围内的解释器模式,但需要root用户。我不知道有什么方法可以仅为您的进程禁用
dexopt
(这会带来安全风险!)。你肯定不能触摸bootclasspath(你的应用程序最初运行的类路径)

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


设备上的应用程序通过
app_进程
和合子运行,您可以将它们视为Dalvik周围的受限包装。除了最初的合子调用之外,没有任何
dalvikvm
调用-未来的每个进程都以
fork()
开始,因此您无法在不影响合子的情况下实际更改这些参数。(我在简化,但我很确定我是对的)

我认为@Delyan的回答抓住了要点,但我想补充一些不适合评论的细节

做这类事情的官方文件是()。
执行模式
属性影响所有应用程序,因为VM只启动一次(作为“合子”),并且所有应用程序都是通过分叉该进程启动的

一旦VM启动,就可以改变它的模式,也许可以引入一个新的
VMRuntime
API调用,但我认为没有人尝试过,我也不确定它将如何与JIT编译器交互


大多数DEX优化和验证都是在应用程序启动之前由dexopt执行的,结果存储在
/data/dalvik cache
中的.odex文件中,因此在应用程序启动时调整
-xdexpt
-Xverify
可能没什么作用(请参阅;).

您可能必须使用普通的应用程序代码为您的特殊代码启动一个独特的dvm,如您的示例中所示,但要意识到这不仅效率低下,而且可能难以与平台交互。根据控制嵌入式虚拟机的说法:“如果启用了评测或连接了调试器,虚拟机将切换到“调试”“翻译。当评测结束或调试器断开连接时,原始解释器将恢复。“因此,可以切换不同的模式。此外,可以使用-Xint:portable标志运行控制台应用程序,而其他应用程序则以快速模式运行。更改执行模式设置不会立即影响以前执行的线程,并且VM在决定如何运行时会查看其他内容(如评测状态)。当VM启动时,设置全局解释器模式是有记录的,并且预期可以工作;在执行过程中更改它可能不会完全达到预期效果。dvmStartup文件中的Dalvik初始值设定项会设置所有必要的标志。根据我的研究,每次应用程序启动时都会调用它。在这里,我将gDvm.executionMode默认值更改为可移植,一切正常,但所有aAndroid进程都处于可移植模式。我想,如果有可能在这个函数中检查是否有必要更改执行模式,我的概念就会起作用。但在这一点上,我无法访问Dex文件。还没有人读过。据我所知,此时调用了Application Manager,然后它以某种神奇的方式为我的应用程序派生了另一个进程。fadden:最近我读到dalvik执行进程基于linux进程(毫不奇怪!:)。有趣的是,linux进程是由写时拷贝控制的。所以,如果我们不更改子进程的某些部分,它的一部分将不会物理地映射到它。Dalvik进程内部包含必要的标准类,它在android系统加载期间加载这些类。这意味着,如果我理解正确,如果它派生新进程,这个新进程将直接从父进程调用库。也许这就是重点?