【问题标题】:How to pass dalvik command line parameters through .apk?如何通过.apk传递dalvik命令行参数?
【发布时间】:2013-10-21 23:58:49
【问题描述】:

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

【问题讨论】:

  • 您可能必须使用普通的应用程序代码为您的特殊代码启动一个唯一的 dvm,如您的示例所示,但要意识到这既低效又可能难以与平台交互。

标签: java android


【解决方案1】:

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

做这种事情的官方文档是Controlling the Embedded VM (in source tree)。 execution-mode 属性影响所有应用程序,因为虚拟机只启动一次——作为“zygote”——并且所有应用程序都是通过分叉该进程启动的。

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

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

【讨论】:

  • 根据控制嵌入式 VM:“如果启用分析或附加调试器,VM 将切换到“调试”解释器。当分析结束或调试器断开连接时,恢复原始解释器。 "因此,可以切换不同的模式。此外,可以使用 -Xint:portable 标志运行控制台应用程序,而其他应用程序以快速模式运行。
  • VM 可以选择在特定时间切换模式。更改执行模式设置不会立即影响先前执行的线程,并且 VM 在决定如何运行时还会查看其他内容(例如分析状态)。在 VM 启动时设置全局解释器模式已记录并预计可以工作;在执行过程中更改它可能不会完全符合您的预期。
  • 文件 dvmStartup 中的 Dalvik 初始化程序设置了所有必要的标志。根据我的研究,每次应用程序启动时都会调用它。在这里,我将 gDvm.executionMode 默认更改为可移植,一切正常,但所有 aAndroid 进程都处于可移植模式。我想,如果可以在这个函数中检查是否有必要改变执行模式,我的想法会奏效。但此时我无权访问 Dex 文件。它还没有被阅读。据我了解,此时应用程序管理器被调用,然后它以某种神奇的方式为我的应用程序分叉另一个进程。
  • fadden:最近读到dalvik执行过程是基于linux进程的(不足为奇!:))。有趣的是 - linux 进程由 Copy-on-Write 统治。因此,如果我们不更改子进程的某些部分,它的部分将不会物理映射到它。 Dalvik 进程内部包含必要的标准类,它在 android 系统加载期间加载。这意味着,如果我理解正确,如果它派生新进程,这个新进程将直接从父进程调用库。可能是重点?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2017-04-14
    • 2017-09-11
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多