【问题标题】:Where can I find a reference for Android java.lang.Process waitFor() exit codes?在哪里可以找到 Android java.lang.Process waitFor() 退出代码的参考?
【发布时间】:2013-08-25 06:04:15
【问题描述】:

我正在尝试以静默方式将 APK 安装到 Android 设备上,以尝试在我的应用中构建自动更新功能。该应用程序将下载最新的 apk 并静默安装。此应用程序不会在 Play 商店中分发,我专门为封闭用户组的一种设备构建它。我已经按照this SO 帖子中的说明实现了静默安装,但我遇到了问题。

我已使用从设备制造商处收到的证书对我的 apk 进行了签名,我正在尝试使用以下代码静默安装我新下载的 apk:

Process install = Runtime.getRuntime().exec("pm install -r " + path);
return install.waitFor();

waitFor() 方法返回退出值 9。我不知道这意味着什么,也找不到任何在线文档来解释每个代码的含义。我发现另一个SO post 解释了这些代码是任意的,并且取决于要定义的特定程序,并且我应该查阅该特定程序的文档/源代码以确定该代码的含义。我不确定如何执行此操作,我期待 waitFor() 方法的 Android 文档来解释每个代码。有谁知道我在哪里可以找到有关这些退出代码的信息?

非常感谢,

托尼

【问题讨论】:

  • 我认为您必须使用供应商密钥签署您的 APK 才能读取该信息。意味着将其放入系统应用程序或仅针对有根手机。可能是错的。
  • @Shark 我已经使用从供应商处收到的 .pem / .pk8 文件签署了我的 apk,因此我应该具有系统级访问权限。我拍摄了 LogCat 的快照,试图阐明我对 KennyTM 的回复所涉及的问题。 Click here to have a look.
  • 好的,如果你的 Android.mk 中有 LOCAL_CERTIFICATE:=platform 并且它可以构建,那可能没问题。我在想你需要在这里针对 NDK 进行构建 - 但我可能又错了。可能只是您的应用缺少从未知来源安装新应用的权限或其他类似的......

标签: java android process silent-installer


【解决方案1】:

退出值完全取决于您运行的进程,因此您不会找到任何解释,因为它完全取决于程序。尽管您始终可以假设非零退出值意味着失败。

在 Android 中,退出值可能是以下两种情况之一(请参阅 ):

  1. 如果程序正常结束,就是真正的退出值(使用System.exit(n)创建)
  2. 如果程序被信号杀死,则为该信号的编号。

您正在尝试执行pm。检查pm 的源代码表明,即使失败,它也总是返回 0。所以 9 可能只表示一个信号,这里是 SIGKILL。

这意味着你的处决已被杀死。


请注意,要执行带有参数的程序,最好使用带有数组的重载:

Runtime.getRuntime().exec(new String[]{"/system/bin/pm", "install", "-r", path});

还可以查看Install apps silently, with granted INSTALL_PACKAGES permission,了解如何以编程方式正确安装软件包。

【讨论】:

  • 感谢 KennyTM。我相信你说我的应用程序被信号杀死是正确的 - 我从 Play 商店安装了 aLogCat 应用程序以确定它是否会记录任何内容,事实上它确实做到了,I snapped a pic of it which can be viewed here。我不清楚这个异常是否是由于我获得的用于签署我的应用程序的供应商密钥的问题而引发的。是否有明确的方法来确定我的 apk 是否已获得系统级权限?
  • 很难确定您的 APK 是否真的具有系统/管理员级别的权限,通常通过使用已知需要这些权限的功能对其进行测试。那里有鸡和蛋的问题......
  • @tony:您是否已为您的 APK 分配了 android.permission.INSTALL_PACKAGES 权限?
  • @KennyTM 我确实有。我已经向固件团队发送了一个请求,以查看错误日志,希望在我被难住时从他们那里得到一些指导。唯一有意义的是供应商密钥是否不正确——我希望固件团队能从日志中找出来。我想我应该让这个设备绕过供应商密钥签名来验证我正在执行的命令是否正确 - 如果它有效,它将表明我收到的供应商密钥不正确。
  • @Shark 您建议我应该尝试哪些其他需要系统级权限的操作?看看我对 KennyTM 的回复 - 我希望在设备生根后静默安装实现能够正常工作,这对我来说表明供应商密钥不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
相关资源
最近更新 更多