android添加系统属性有两种,一种是System.Setting类的属性,这种属性其实是存在SettingProvider数据库中的,也就是framework/base/packages/settingprovider/src/com/android/providers/settings/DatabaseHelper.java所load的那些,添加这种类型的系统属性下篇再写。现在先写下如何添加另外一种,也就是SystemProperty属性,SystemProperty属性是被系统严格限制的,首先是它的命名,必须以system/core/init/Property_services.c中定义的
/* White list of permissions for setting property services. */
struct {
const char *prefix;
unsigned int uid;
unsigned int gid;
} property_perms[] = {
{ "net.rmnet0.", AID_RADIO, 0 },
{ "net.gprs.", AID_RADIO, 0 },
{ "net.ppp", AID_RADIO, 0 },
{ "net.qmi", AID_RADIO, 0 },
{ "net.lte", AID_RADIO, 0 },
{ "net.cdma", AID_RADIO, 0 },
{ "ril.", AID_RADIO, 0 },
{ "mux.", AID_RADIO, 0 },
{ "gsm.", AID_RADIO, 0 },
{ "persist.radio", AID_RADIO, 0 },
{ "net.dns", AID_RADIO, 0 },
{ "sys.usb.config", AID_RADIO, 0 },
{ "net.", AID_SYSTEM, 0 },
{ "dev.", AID_SYSTEM, 0 },
{ "runtime.", AID_SYSTEM, 0 },
{ "hw.", AID_SYSTEM, 0 },
{ "sys.", AID_SYSTEM, 0 },
{ "service.", AID_SYSTEM, 0 },
{ "wlan.", AID_SYSTEM, 0 },
{ "dhcp.", AID_SYSTEM, 0 },
{ "dhcp.", AID_DHCP, 0 },
{ "debug.", AID_SHELL, 0 },
{ "log.", AID_SHELL, 0 },
{ "service.adb.root", AID_SHELL, 0 },
{ "service.adb.tcp.port", AID_SHELL, 0 },
{ "persist.sys.", AID_SYSTEM, 0 },
{ "persist.service.", AID_SYSTEM, 0 },
{ "persist.security.", AID_SYSTEM, 0 },
{ "mediatek.", AID_RADIO, 0 },
{ "gps.", AID_GPS, AID_SYSTEM },
{ "cdma.", AID_RADIO, 0 },
{ "af.", AID_MEDIA, 0 },
{ "a2dp.", AID_MEDIA, 0 },
{ "streamin.", AID_MEDIA, 0 },
{ "streamout.", AID_MEDIA, 0 },
{ NULL, 0, 0 }
};其中ro开头表示只读属性,presist开头的表示可存储,也就是以文件的形式保存的,开关机不会失效的。其中AID_SYSTEM,AID_MEDIA,AID_RADIO等代表的权限,也就是程序签名以及所在的进程ID,比如系统的Settings所拥有的权限android:sharedUserId="android.uid.system“以及Android.mk中的平台签名LOCAL_CERTIFICATE := platform使得Settings具有system权限,对应的AID_SYSTEM类型。
添加一个自定义的属性按照上面的规则,system.prop文件中添加,也就是编译在手机中的build.prop中看到的那些属性。比如