【问题标题】:What linux permissions are needed for SystemProperties.set to work? (android)SystemProperties.set 需要哪些 linux 权限才能工作? (安卓)
【发布时间】:2015-02-21 02:04:32
【问题描述】:

SystemProperties.set 需要哪些 linux 权限才能工作? (安卓)

我正在编写一个在 Android 设备上的 system/app 中运行的应用程序。

它正在运行

android:sharedUserId="android.uid.systemui"

在 Android.mk 中

LOCAL_CERTIFICATE := 平台

但是,我发现我无法创建、写入或设置属性。 在控制台中,我可以做一个getprop、setprop。 但是,我的程序无法创建它。

ls -l /data/property/

显示它不存在。

        Slog.d(TAG, "key is not set, will set APPLE");
        SystemProperties.set(keyName, favorite);
        if(SystemProperties.get(keyName).equals(favorite)) {
            Slog.d(TAG, keyName + " = " + SystemProperties.get(keyName));
        } else {
            Slog.e(TAG, "setting SystemProperties failed. value written = " + SystemProperties.get(keyName));
        }

日志猫:

Line 1365: D/MyTag( 2593): keyName: persist.fruit.user.favorite
Line 1373: D/MyTag( 2593): keyName has value []
Line 1377: D/MyTag( 2593): key is not set, will set APPLE
Line 1381: E/MyTag( 2593): setting SystemProperties failed. value written = 

显然,这可能是权限不足的问题 - 但哪些权限不足?

【问题讨论】:

    标签: android linux embedded-linux


    【解决方案1】:

    我已经接受了fadden的答案,但经过更多探索,发现它是不正确的,尽管它对得出正确答案非常有帮助。

    第 1 步: 查看https://android.googlesource.com/platform/system/core/+/kitkat-release/init/property_service.c中的数组

    { "persist.sys.",     AID_SYSTEM,   0 },
    

    您的属性名称应以数组中相同的键字符串开头。 因此我不得不将我的属性名称更改为“persist.sys.fruit.user.favorite”

    第 2 步: 在您的 android 清单文件中,以上面数组中提到的用户 ID 运行。

    <manifest android:sharedUserId="android.uid.system" >
    

    【讨论】:

      【解决方案2】:

      这取决于。在 4.4 "KitKat" 版本中,该列表包含在 init 的 property_service.c 中(查看第 65 行)。例如,您可以看到名为debug.* 的属性可以由“系统”或“外壳”用户更新。 (系统识别的用户ID到数值的映射可以在android_filesystem_config.h中找到。)

      某些属性,例如ro.*persist.*ctl.*,有额外的限制或特殊行为。

      在 Android 5.0 “Lollipop”中,列表移动了,但行为相同。

      使用adb shell ps 查看您的应用在哪个用户 ID 下运行。如果不是systemshell,则无法设置系统属性。

      【讨论】:

      • 感谢您的回复。我的权限persist.fruit.user.favorite 不在property_service.c 的列表中如果我理解正确,您是说我必须编辑文件并添加我的persist.fruit.user.favorite
      • 我使用的是 4.4 Kitkat
      • 系统属性机制复杂,可能会发生变化。我认为您应该认真考虑不要将系统属性用于您正在尝试做的任何事情。
      • 我找到了让它工作的正确方法 - 请参阅下面的答案
      • "在 Android 5.0 "Lollipop" 中,列表已移动" - 出于兴趣,它移到了哪里?
      【解决方案3】:

      TL;DR: Android 5+ 的规则与 Android 4.4 的规则大致相同。从接受的答案中检查白名单并使用系统应用程序编写 sysprops。


      由于 Android 5 对系统属性的访问仅由 SELinux 策略控制。根据源安全上下文(您从哪里调用),您将可以访问不同的系统属性,这些属性位于指定的目标安全上下文中。 系统服务器中运行的系统服务比使用共享系统 UID 运行的应用程序(系统应用程序)具有更多访问权限。

      规则由几个文件组成:

      • property_contexts - 将系统属性前缀映射到 SELinux 上下文
      • shell.te - 指定(除其他外)哪些属性可由 ADB shell(或具有 shell UID 的应用程序)设置
      • system_app.te - 指定系统应用(具有系统 UID 的应用)可以设置哪些属性
      • system_server.te - 指定系统服务器可以访问哪些属性

      上下文文件在设备上的可用位置随系统版本而异。 *.te 文件被编译成二进制文件。

      默认值存储在 AOSP 存储库中,多年来,值和位置都发生了变化。

      棒棒糖

      牛轧糖

      奥利奥

      注意事项

      通常,您希望将系统属性设置为系统应用,但有一个例外。只有 shell UID 应用程序可以写入 log.tag. 直到 Pie。系统 UID 应用程序也可以写 log.tag.,因为 Pie。

      seapp_contexts 为应用定义 SELinux 上下文。在 Pie 上,您不能运行带有 shell 系统 UID 的应用程序。

      欲了解更多信息,请参阅https://source.android.com/security/selinux/images/SELinux_Treble.pdf

      【讨论】:

        猜你喜欢
        • 2015-11-04
        • 2022-10-06
        • 1970-01-01
        • 1970-01-01
        • 2016-05-29
        • 2021-03-25
        • 2011-02-06
        • 1970-01-01
        • 2014-08-28
        相关资源
        最近更新 更多