阅读权限 /cache/recovery/last_log

Permission to read /cache/recovery/last_log

应用访问文件需要什么权限/cache/recovery/last_log?

我的应用程序使用平台密钥签名,因此我可以提供系统权限。该应用程序将预先内置到设备中,并且该设备将是非 Root 的。

您只能访问您应用的缓存目录

getApplicationContext().getCacheDir()

显然,您不需要任何权限即可从缓存读取。但是如果你想在缓存目录中写东西,你需要权限。

来自 http://developer.android.com/reference/android/Manifest.permission.html#READ_LOGS 的日志文档:

Allows an application to read the low-level system log files.
Not for use by third-party applications, because Log entries can contain the user's private information.
Constant Value: "android.permission.READ_LOGS"

'recovery' 是什么意思?

我前段时间找到了解决方案,如果其他人遇到同样的问题,我只是在这里发帖帮助。

阻碍我的是 SELinux。我发布了原始问题的解决方案,但请注意自那以后 Android 发生了一些变化,包括 A/B system 的创建,其中恢复和缓存分区从 [=84] 中删除=].

SELinux

我学到了必须处理 SELinux 才能处理 Android 源代码的艰难方法。重要的部分是:

  1. 设备定义(device目录下的makefiles)会引用SELinux策略。在我使用的其中一个设备中,我有一个 makefile,其中包含:

    BOARD_SEPOLICY_DIRS += path/to/sepolicy/dir

并且目录中所有以“.te”结尾的文件都将用作SEPolicy。我建议为您的自定义策略添加一个新目录,您可以在其中使用自己的 git 存储库。

现在你需要知道要写什么政策。我建议阅读 Google 的文档 here

就我个人而言,我首先在 userdebug 上使用 SELinux 以宽容模式(仅限日志)构建来测试应用程序。这些方式 SELinux 只会记录违反策略的操作,这大大简化了开发。只有在我知道关闭 SELinux 的应用程序 运行s 后,我才开始收集日志并设置 "enforced" 模式。

收集不符合我使用的策略的操作的 SELinux 日志:

adb logcat | grep "avc: denied"

有一个名为 audit2allow 的工具可以读取 logcat 输出和设备策略并输出缺少的策略:

adb pull /sys/fs/selinux/policy
adb logcat -b all -d | python2 audit2allow -p policy

文件的输出是可以添加到 .te 文件的策略。

我在 Android 8.1.

中使用的这种特殊方法

使用平台密钥签署应用程序

我还必须使用平台密钥对应用程序进行签名。为此,我编辑了 Android.mk 以添加:

LOCAL_CERTIFICATE := platform

系统 UID

修复 SELinux 策略对于某些设备可能还不够。您可能需要使用系统用户制作应用程序 运行。

您必须避免使用这些方法,因为该用户可以访问一些非常敏感的设备文件。如果您确实需要,可以通过以下方式进行:

  1. 使用平台密钥签署应用程序;
  2. 在将读取恢复的应用程序上,您必须确保 AndroidManifest.xml 将 android:sharedUserID 设置为 "android.uid.system"。
<manifest package="my.app.name"
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:sharedUserId="android.uid.system">
....
</manifest>

其他有用的文件

记录了诊断引导和 ota 问题的其他相关文件 here