【发布时间】:2013-02-13 22:44:52
【问题描述】:
我被要求为基于 Android 的产品编写一个简单的小应用程序。该设备带有两个具有不同功能的 Android 系统映像。我正在编写的应用程序只是一个概念验证,当您单击一个按钮时,它会使用恢复系统将当前操作系统替换为其中一个图像。
设备已root,应用程序作为系统应用程序运行。
我用
RecoverySystem.installPackage(context, packageFile);
(see here for reference) 用其中一个图像替换操作系统。这应该重新启动系统并初始化恢复系统以安装映像。
我遇到的问题是此调用失败,因为 RecoverySystem.installPackage 方法似乎无法访问 /cache/recovery/command 文件。我猜它试图为恢复系统编写一些命令,以便在重新启动时执行,但失败了。这是我得到的例外:
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): java.io.FileNotFoundException: /cache/recovery/command: open failed: EACCES (Permission denied)
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): at libcore.io.IoBridge.open(IoBridge.java:416)
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): at java.io.FileWriter.<init>(FileWriter.java:42)
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): at android.os.RecoverySystem.bootCommand(RecoverySystem.java:381)
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): at android.os.RecoverySystem.installPackage(RecoverySystem.java:330)
所以,我假设我没有访问此文件的适当权限。虽然这是我在清单中设置的权限:
<uses-permission android:name="android.permission.REBOOT" />
<uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" />
<uses-permission android:name="android.permission.DELETE_CACHE_FILES" />
我知道我需要RecoverySystem 的 REBOOT 权限。但是,我不知道其他两个是否相关。我什至不知道我是否需要其他权限来创建/写入 /cache 分区中的文件。
有人知道我可能会错过什么吗?
更新:
嗯,看来我想通了。毕竟权限是对的。一切正常。
当我通过将 apk 文件移动到 /system/app 来将应用程序设置为系统应用程序时,我还没有放入所有权限。当我在我的设备上运行最新代码时,它会将其安装在 /data/app 中,并将其识别为系统应用程序的更新。因此,只能识别原始系统应用的权限。
在我重新设置我的最新代码以直接从 /system/app 运行后,它工作了。
现在我唯一遇到的问题是,当它重新启动时,它没有安装映像,我最终得到一个带有感叹号的死绿色机器人。我会继续调查的。
我希望这篇文章对遇到同样问题的人有所帮助。我也很乐意回答任何问题。
【问题讨论】:
-
我也做了同样的事情,我能够运行 FOTA 升级。但我的问题是,我制作的应用程序标签为platform_app,而谷歌用于升级的应用程序属于untrusted_app。有什么方法可以使我的应用程序成为具有上述缓存权限的 untrusted_app 完整的,因为这些权限仅授予我猜的系统应用程序
-
@PankajKushwaha 嗨 pankaj 我也在尝试以编程方式在我的 aap 中实现 FOTA。 link 我找到了一些溶胶,但我不明白如何进一步处理。
-
我会告诉你我遵循的基本程序 - 1) 运行 make otapackage。让我们将其命名为 update.zip 2) 将 zip 文件复制到 /cache/recovery/update.zip 3) 在 /cache/recovery/command 中写入以下命令“--update_package=/cache/update.zip” 4) 重启设备在恢复模式。 5) 设备将自动升级。您可以在 /frameworks/base/core/java/android/os/RecoverySystem.java 中找到示例代码 我使用的应用程序是系统应用程序(使用平台密钥签名)
标签: android