在java层设置系统属性要注意几点:

1 需要有系统权限。可以在AndroidManifest.xml添加android:sharedUserId="android.uid.system",并且通过系统签名来获取系统权限。

2 需要注意有几点,key的开头必须要符合property_perms中的定义规范,如下面的定义:一定要符合prefix,uid,gid也必须要符合。如果不符合,会报错。

init: sys_prop: permission denied uid

3 需要注意  属性的name 跟 value的长度,定义的   PROP_NAME_MAX = 32 PROP_VALUE_MAX=92,但是name不能超过31,因为后面接了一位字符串结束符。

所以name不能大于31,value不能大于91。下面的代码会进行判断。否则会报错如下:

E/AndroidRuntime(15375): FATAL EXCEPTION: main
E/AndroidRuntime(15375): java.lang.IllegalArgumentException: key.length > 31
E/AndroidRuntime(15375): at android.os.SystemProperties.get(SystemProperties.java:52)

if(strlen(key) >= PROP_NAME_MAX) return -1;

if(strlen(value) >= PROP_VALUE_MAX) return -1;

4 主要sys开头的属性,重启后就没有了,persist开头的不会丢失,但是要注意name 必须以persist.sys等如下 prefix前缀打头。

5 因为SystemProperties.get/set是hide接口,所以必须要反射来调用api,或者在系统环境,或者 引用系统的class.jar包。

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 },
    { "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 },
    { "bluetooth.",       AID_BLUETOOTH,   0 },
    { "dhcp.",            AID_SYSTEM,   0 },
    { "dhcp.",            AID_DHCP,     0 },
    { "debug.",           AID_SYSTEM,   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 },
    { "persist.service.bdroid.", AID_BLUETOOTH,   0 },
    { "selinux."         , AID_SYSTEM,   0 },
    { NULL, 0, 0 }
};

贴一下反射的代码。

static Method systemProperties_get = null;
static Method systemProperties_set = null;

static int sys_set(String key, String value){
int ret = -1;
if (systemProperties_set == null) {
try {
systemProperties_set = Class.forName("android.os.SystemProperties")
.getMethod("set", String.class,String.class);
} catch (Exception e) {
Log.e("TEST", "get method android.os.SystemProperties.set() error:" + e);
return -1;
}
}
if(systemProperties_set != null){
try {
Log.i("TEST", "systemProperties_set = " + systemProperties_set);
systemProperties_set.invoke(null, key,value);
} catch (Exception e) {
Log.e("TEST", "invoke method android.os.SystemProperties.set() error:" + e);
return ret;
}
}
return 0;
}

static String sys_get(String key){
String ret;
if (systemProperties_get == null) {
try {
systemProperties_get = Class.forName("android.os.SystemProperties")
.getMethod("get", String.class);
} catch (Exception e) {
Log.e("TEST", "get method android.os.SystemProperties.get() error:" + e);
return null;
}
}

try {
if ((ret = (String) systemProperties_get.invoke(null, key)) != null)
return ret;
} catch (Exception e) {
Log.e("TEST", "invoke method android.os.SystemProperties.get() error:" + e);
return null;
}
return "";
}

SystemProperties.get/set property_get/set的更多相关文章

  1. Android SystemProperties设置/取得系统属性的用法总结

    通过调查得知,Android系统中取得/设置系统属性的用法参考以下3篇文章就足够了. 1.Android SystemProperties简介 介绍了设置属性需要的权限,已经设置权限的方法. Syst ...

  2. Android 系统属性-SystemProperties详解***

    创建与修改android属性用Systemproperties.set(name, value),获取android属性用Systemproperties.get(name),需要注意的是androi ...

  3. MTK Android Framework用SystemProperties通过JNI调用访问系统属性

    1.导包 import android.os.SystemProperties; 2. Android SystemProperties设置/读取 #设置 Systemproperties.set(n ...

  4. 修改Android系统属性SystemProperties.set("sys.powerctl", "shutdown")关机分析

    简介: 从之前的博文中我们提到过,关机流程中最后是通过修改Android属性进行关机操作(SystemProperties.java通过JNI调用访问系统属性),当然我们也可以通过adb命令修改And ...

  5. Android的系统属性SystemProperties

    创建与修改android属性用Systemproperties.set(name, value) 获取android属性用Systemproperties.get(name) 注意:android属性 ...

  6. [Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)

    温馨提示      建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续本节内容.   ...

  7. jboss:在standalone.xml中设置系统属性(system-properties)

    就象在.net的web应用中,可以在web.config中设置appSettings一样,jboss的standalone.xml中也可以由开发人员自行添加系统属性,用法如下: </extens ...

  8. 【转】Android属性之build.prop,及property_get/property_set

    简要分析一下build.prop是如何生成的.Android的build.prop文件是在Android编译时收集的各种property(LCD density/语言/编译时间, etc.),编译完成 ...

  9. 变化Android系统属性SystemProperties.set(&quot;sys.powerctl&quot;, &quot;shutdown&quot;)关机分析

    基本介绍: 从以前的博客中提到,我们,最后,通过关机过程变化Android关机属性(SystemProperties.java由JNI呼叫接入系统属性),当然,我们也能adb命令变化Android系统 ...

随机推荐

  1. poj 3279 Fliptile(二进制)

    http://poj.org/problem?id=3279 在n*N的矩阵上,0代表白色,1代表黑色,每次选取一个点可以其颜色换过来,即白色变成黑色,黑色变成白色,而且其上下左右的点颜色也要交换,求 ...

  2. iOS.Info.plist

    1. Custom message when asking for Address Book Permissions http://kevinyavno.com/blog/?p=176

  3. UI设计教程分享:PS故障风海报制作教程

    1.首先找一张看起来很酷的图(也可以选择自己喜欢的图片):   2. 复制图层,点击添加图层样式,选择混合选项,在高级混合里面的通道选项,有R.G.B三个通道选项,默认是全部勾选的状态,选择其中一个勾 ...

  4. PHP 获取当前所在的类名、方法名等

    PHP获取当前类名.方法名  __CLASS__ 获取当前类名  __FUNCTION__ 当前函数名(confirm)  __METHOD__ 当前方法名 (bankcard::confirm) _ ...

  5. Python之socket编程进阶版

    1.socket之简单的ssh功能 2.socket之简单的ftp服务器 3.socketserver的用法 4.socketserver的多并发的实现 1.socket实现ssh服务 1.1我们现在 ...

  6. Python之路(第六篇)Python全局变量与局部变量、函数多层嵌套、函数递归

    一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序. 全局变量没有任何缩进,在任何位置都可 ...

  7. PHP ini 配置无效的坑给自己记录

    装redis 扩展时,发现装成功之后扩展一直加载不上, 于是phpinfo 发现Configuration File (php.ini) Path:none Loaded Configuration ...

  8. RecyclerView错误

    1. java.lang.NoClassDefFoundError: android.support.v7.widget.RecyclerView 这个错误真TM见鬼,明明jar包里面就有这个类,工程 ...

  9. 【UI测试】--易用性

  10. json(原生态)

    什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * JSO ...