system.prop添加自己的字段 SystemProperties.get权限问题

要添加的字段的文件device/mediateksample/g1860ph_v2_c_yg_q6203_o/system.prop

先说adb查看  adb shell getprop |grep coolpad  查看自己就添加的字段

在使用SystemProperties.get的时候提示get不了,权限问题

 

1、在AndroidManifest.xml中,在manifest加入android:sharedUserId="android.uid.system"。

2、在Android.mk中,將LOCAL_CERTIFICATE := XXX修改成LOCAL_CERTIFICATE :=platform。

3,也是最重要一步在alps/device/sepolicy/private/property_contexts

添加 自己的字段

persist.vendor.overlay.  u:object_r:overlay_prop:s0
#HXY032 ADD
persist.coolpad.        u:object_r:system_prop:s0
#HXY032 END
ro.boot.vendor.overlay.  u:object_r:overlay_prop:s0

 

 

�6�9 在对Android操作系统进行开发的过程中,经常需要使用到Android的隐藏API SystemProperties.set(String key, String value) 这个接口,写入一些属性值存放到系统共享内存,配合SystemProperties.get(String key) 这个接口可以很方便的实现某些功能。由于是android:sharedUserId=“android.uid.system” 的系统级应用,有权限操作类似的隐藏接口。比如可以定义一个persist.test.meid 的属性来保存系统的MEID号,以方便第三方应用开发者获取。

�6�9 在Android5.0之前,系统级应用可以很方便的写入规范(比如属性key、value的长度有一定限制等)的属性,在这之后,Android系统引入了SELinux,所有的操作都有相应的权限组,任意写入一个属性也会抛出错误,即使是系统级应用。

�6�9 关于Android SystemProperty 的分析文章,网上一搜一大堆,推荐一篇分析的很全的博客https://blog.csdn.net/yangwen123/article/details/8936555 ,这里我只分析SystemProperties.set(String key, String value) 失败的原因以及解决办法。

错误信息

就以persist.test.meid 这个属性做实验,在android:sharedUserId=“android.uid.system” 的进程中调用接口

import android.os.SystemProperties;

SystemProperties.set("persist.test.meid", "test value");

运行程序,写入属性失败,查看log发现抛出如下异常

12-06 14:22:19.254  2870  2887 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

原因分析

错误日志中提示Uncaught remote exception! (Exceptions are not yet supported across processes.),这是一个常见的跨进程通讯失败信息,没什么卵用。后来发现系统中工厂测试这个系统级应用能写persist.sys.xxx这样的属性,于是在我的应用中也写了这条属性,发现是能成功的,而persist.test.meid 还是写入失败。
那么这两条属性有什么区别呢?唯一的却别就是persist.sys.xxx这样的属性是系统里预先定义好的,而persist.test.meid 是自己随手定义的,那么persist.sys.xxx肯定是在系统某个地方做了某些设定。
有了这个推测后就是查找了,使用grep “persist.sys.” -rn . 搜索整个代码,最后定位到SELinux
property_contexts文件中的代码片段

persist.netd.stable_secret      u:object_r:netd_stable_secret_prop:s0
persist.sys.            u:object_r:system_prop:s0
persist.sys.safemode    u:object_r:safemode_prop:s0

解决方案

只需要在property_contexts文件中添加权限声明即可

persist.test.       u:object_r:system_prop:s0

由于我们应用进程是属于 system uid的系统级应用,所有声明的属性所属域为system_prop
当然也可以自定义一个域,然后将persist.test.定义到这个新的域中,最后自己的应用程序就不能是android:sharedUserId=“android.uid.system” 了,而是要定义成自己的所属域。

 

原文地址:http://cache.baiducontent.com/c?m=9d78d513d99b12eb0bfa950e1a16a0711824de306082c7140fc3933f84652b01003af4ba57644b5b84d27d1756e5180ba8b66d2f6b1421c78cc9fb5dddcac67b74d67062671cf7074fc419de8a1163d620e11ba2ee5fb0e5e732e2ec928e9d03138c18113dc0ae84004652882ee71542febbc916480a07ba9a6124a9056029e87f17f05abdbb73355adda8860f11de7990274ac6f162ad6845f340ff415a394ea646bb0b512731&p=882a9644d78a16fc57efdf6f540095&newp=8c6dd515d9c040ae1881cc2d0214a5231610db2151d7d7176b82c825d7331b001c3bbfb423261101d0c7786c01aa435fe9f43d70310825a3dda5c91d9fb4c57479c84b6c&user=baidu&fm=sc&query=java%2Elang%2ERuntimeException%3A+failed+to+set+system+property&qid=ba8e06b800010f2f&p1=1

你可能感兴趣的:(system.prop添加自己的字段 SystemProperties.get权限问题)