在对Android操作系统进行开发的过程中,经常需要使用到Android的隐藏API SystemProperties.set(String key, String value) 这个接口,写入一些属性值存放到系统共享内存,配合SystemProperties.get(String key) 这个接口可以很方便的实现某些功能。由于是android:sharedUserId=“android.uid.system” 的系统级应用,有权限操作类似的隐藏接口。我们可以自定义属性节点,以方便第三方应用开发者获取。
在Android5.0之前,系统级应用可以很方便的写入规范(比如属性key、value的长度有一定限制等)的属性,在这之后,Android系统引入了SELinux,所有的操作都有相应的权限组,任意写入一个属性也会抛出错误,即使是系统级应用。
报错如下:
W libc : Unable to set property "persist.test.meid" to "test value": error code: 0x18 12-06 14:22:19.255 2870 2887 E JavaBinder: *** Uncaught remote exception! (Exceptions are not yet supported across processes.) 12-06 14:22:19.255 2870 2887 E JavaBinder: java.lang.RuntimeException: failed to set system property 12-06 14:22:19.255 2870 2887 E JavaBinder: at android.os.SystemProperties.native_set(Native Method) 12-06 14:22:19.255 2870 2887 E JavaBinder: at android.os.SystemProperties.set(SystemProperties.java:155) 12-06 14:22:19.255 2870 2887 E JavaBinder: at com.action.tool.mdm.provider.ActionMdmProvider.tv(:251) 12-06 14:22:19.255 2870 2887 E JavaBinder: at com.action.tool.mdm.provider.ActionMdmProvider.call(:109) 12-06 14:22:19.255 2870 2887 E JavaBinder: at android.content.ContentProvider$Transport.call(ContentProvider.java:401) 12-06 14:22:19.255 2870 2887 E JavaBinder: at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:272) 12-06 14:22:19.255 2870 2887 E JavaBinder: at android.os.Binder.execTransact(Binder.java:697) 12-06 14:22:19.256 3882 3882 D AndroidRuntime: Shutting down VM
解决方法:
1、关闭selinux ,具体步骤
adb shell
setenforce 0
2、修改签名方式以及key的前缀,具体步骤
属性值以persist.sys.开头
AndroidManifest.xml 声明android:sharedUserId="android.uid.system"
平台签名apk
3.在property_contexts文件中添加权限声明即可(系统源码里)
- \system\sepolicy\public\property_contexts
persist.vendor. u:object_r:system_prop:s0