【发布时间】:2015-01-15 17:29:39
【问题描述】:
应用访问文件 /cache/recovery/last_log 需要什么权限?
我的应用使用平台密钥签名,因此我可以提供系统权限。该应用程序将预先内置到设备中,并且该设备将是非 root 的。
【问题讨论】:
标签: android android-permissions
应用访问文件 /cache/recovery/last_log 需要什么权限?
我的应用使用平台密钥签名,因此我可以提供系统权限。该应用程序将预先内置到设备中,并且该设备将是非 root 的。
【问题讨论】:
标签: android android-permissions
您只能访问您应用的缓存目录
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"
“恢复”是什么意思?
【讨论】:
我前段时间找到了解决方案,只是在这里发布以帮助其他人遇到同样的问题。
阻碍我的是 SELinux。我正在发布原始问题的解决方案,但请注意,自那以后,Android 上的一些事情发生了变化,包括创建 A/B system,其中恢复和缓存分区从 Android 中删除。
我学到了一个艰难的方法,即必须处理 SELinux 才能在 Android 源代码上工作。重要的一点是:
在设备定义上(device 目录下的 makefiles)将引用 SELinux 策略。在我使用的其中一台设备中,我有一个 makefile,它具有:
BOARD_SEPOLICY_DIRS += path/to/sepolicy/dir
并且目录上所有以“.te”结尾的文件都将用作 SEPolicy。我建议为您的自定义策略添加一个新目录,您可以在其中使用自己的 git 存储库。
现在您需要知道要编写哪些策略。我建议阅读 Google 的文档 here。
就我个人而言,我首先在一个userdebug 版本上测试应用程序,该版本使用 SELinux 以许可模式(仅记录)。通过这种方式,SELinux 只会记录违反策略的操作,这使得开发变得更加容易。只有在我知道应用程序在 SELinux 关闭的情况下运行后,我才开始收集日志并设置“强制”模式。
收集不符合我使用的策略的操作的 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
修复 SELinux 政策对于某些设备可能还不够。您可能需要让应用程序与系统用户一起运行。
您必须避免使用这些方法,因为该用户可以访问一些非常敏感的设备文件。如果你真的需要,你可以这样做:
<manifest package="my.app.name"
xmlns:android="http://schemas.android.com/apk/res/android"
android:sharedUserId="android.uid.system">
....
</manifest>
用于诊断引导和 ota 问题的其他相关文件记录在 here。
【讨论】: