【问题标题】:Permission to read /cache/recovery/last_log读取 /cache/recovery/last_log 的权限
【发布时间】:2015-01-15 17:29:39
【问题描述】:

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

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

【问题讨论】:

    标签: android android-permissions


    【解决方案1】:

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

    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"
    

    “恢复”是什么意思?

    【讨论】:

    • 我正在编写更新 Android 操作系统的软件。它是在您转到设置/关于/系统更新时运行的软件。它从 Web 服务器下载 android 映像,对其进行验证并要求 Android 由其更新。之后,操作系统将重新启动进入恢复模式并应用补丁。例如,将 4.4 的 android 变成 5。恢复分区写入 /cache/recovery 目录,所以我别无选择,我需要从那里读取日志。
    【解决方案2】:

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

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

    SELinux

    我学到了一个艰难的方法,即必须处理 SELinux 才能在 Android 源代码上工作。重要的一点是:

    1. 在设备定义上(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
    

    系统 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

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2013-02-13
      • 2012-06-08
      • 2014-06-10
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 2014-10-07
      • 2018-09-21
      相关资源
      最近更新 更多