SystemProperties.set需要什么Linux权限才能工作? (机器人)
我正在编写一个在Android设备上的系统/应用程序中运行的应用程序。
它正在运行
Android.mk中的机器人:sharedUserId =" android.uid.systemui"
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 =
显然也许这是权限不足的问题 - 但是哪些呢?
答案 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。如果不是system
或shell
,则无法设置系统属性。
答案 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