14

我被要求为基于 Android 的产品编写一个简单的小应用程序。该设备带有两个具有不同功能的 Android 系统映像。我正在编写的应用程序只是一个概念证明,当您单击一个按钮时,它会使用恢复系统将当前操作系统替换为其中一个图像。

设备已植根,应用程序作为系统应用程序运行。

我用

RecoverySystem.installPackage(context, packageFile);

请参阅此处以供参考)用其中一个图像替换操作系统。这应该重新启动系统并初始化恢复系统以安装映像。

我遇到的问题是此调用失败,因为该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. 但是,我不知道其他两个是否相关。我什至不知道我是否需要其他权限来创建/写入 /cache 分区中的文件。

有人知道我可能会错过什么吗?


更新:

嗯,看来我想通了。毕竟权限是对的。一切都是正确的。

当我通过将 apk 文件移动到 /system/app 来将应用程序设置为系统应用程序时,我还没有放入所有权限。当我在我的设备上运行最新代码时,它会将其安装在 /data/app 中,并将其识别为系统应用程序的更新。因此,只能识别原始系统应用程序的权限。

在我重新设置我的最新代码以直接从 /system/app 运行后,它工作了。

现在我唯一的问题是,当它重新启动时,它没有安装映像,我最终得到一个带有感叹号的死绿色机器人。我会继续调查。

我希望这篇文章可以帮助任何有同样问题的人。我也很乐意回答任何问题。

4

5 回答 5

2

在我的应用程序安装在 /system/app 之前,我遇到了以下错误:

07-20 10:52:46.512      933-951/? W/RecoverySystem﹕ !!! REBOOTING TO INSTALL /storage/emulated/legacy/Download/Update.zip !!!
07-20 10:52:46.512      933-951/? W/System.err﹕ java.io.FileNotFoundException: /cache/recovery/command: open failed: EACCES (Permission denied)
07-20 10:52:46.512      933-951/? W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:409)
07-20 10:52:46.512      933-951/? W/System.err﹕ at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
07-20 10:52:46.512      933-951/? W/System.err﹕ at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
07-20 10:52:46.512      933-951/? W/System.err﹕ at java.io.FileWriter.<init>(FileWriter.java:42)
07-20 10:52:46.512      933-951/? W/System.err﹕ at android.os.RecoverySystem.bootCommand(RecoverySystem.java:389)
07-20 10:52:46.522      933-951/? W/System.err﹕ at android.os.RecoverySystem.installPackage(RecoverySystem.java:337)

我已经尝试了所有需要的权限,但我无法继续。

因此,由于我使用的是 4.2 以上的 API,因此我尝试将我的应用程序放入/system/priv-app其中,并且它对我有用。

于 2015-07-20T01:34:29.330 回答
1

系统应用(共享用户 ID 设置为 的应用android.uid.system)无法在 Android 5 及更高版本上安装系统更新 - SELinux 政策禁止这样做。/cache系统应用程序禁止具体写入。换句话说:

  • /cachesystem用户所有,因此您在systemUID 下运行的应用程序可以对其进行写入。但仅当 SELinux 被禁用/允许时。
  • 如果您有android.permission.ACCESS_CACHE_FILESYSTEM平台签名权限,您可以写入/cache.

您需要删除共享用户 ID。您仍然需要使用平台签名对应用进行签名,并确保您拥有以下权限:

  • android.permission.REBOOT
  • android.permission.ACCESS_CACHE_FILESYSTEM- 写信给/cache
  • android.permission.RECOVERY- API 21 需要重启才能恢复

这将适用于 Kitkat 和 Lollipop+。

于 2019-04-18T15:07:01.420 回答
0

在android 5.0.2中创建自定义 OtaUpdate 应用程序时,我遇到了同样的问题,我已经解决了。我将通过以下2个步骤与您分享:

  1. 在 AndroidManifest.xml 中添加 android:sharedUserId="com.google.uid.shared"
  2. 将您的 apk 推送到 system/app 或 system/priv-app

对于安卓 4.1.2

  1. 在 AndroidManifest.xml 中添加 android:sharedUserId="android.uid.system"
  2. 将您的 apk 推送到系统/应用程序
于 2015-02-25T04:14:01.540 回答
0

我在 android 8 中遇到了同样的问题。
如果你添加android:sharedUserId="android.uid.system"AndroidManifest.xml它应该可以工作。

于 2019-03-28T06:29:46.403 回答
0

安卓 5.1.0

  1. 添加android:sharedUserId="android.uid.system"AndroidManifest.xml
  2. 将您的 apk 推送到system/priv-app
  3. 接着

    adb root
    adb shell setenforce 0
    
于 2017-05-24T01:39:50.450 回答