SystemProperties.set需要什么Linux权限才能工作? (机器人)

时间:2014-12-22 23:01:59

标签: android linux embedded-linux

SystemProperties.set需要什么Linux权限才能工作? (机器人)

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

它正在运行

  

机器人:sharedUserId =" android.uid.systemui"

Android.mk中的

  

LOCAL_CERTIFICATE:= platform

但是,我发现我无法创建,编写或设置属性。 在控制台中,我可以做一个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));
        }

logcat的:

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 = 

显然也许这是权限不足的问题 - 但是哪些呢?

3 个答案:

答案 0 :(得分:5)

我已经接受了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" >

答案 1 :(得分:1)

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

某些属性(例如ro.*persist.*ctl.*)具有其他限制或特殊行为。

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

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

答案 2 :(得分:0)

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信息库中,并且这些值和位置多年来都在更改。

棒棒糖

牛轧糖

奥利奥

注释

通常,您希望将系统属性设置为系统应用程序,但有一个例外。只有外壳UID应用程序可以在Pie之前写入log.tag.。自Pie以来,系统UID应用也可能会写log.tag.

seapp_contexts定义了应用程序的SELinux上下文。在Pie上,您不能运行具有外壳系统UID的应用程序。

有关更多信息,请参见https://source.android.com/security/selinux/images/SELinux_Treble.pdf