属性系统是android的一个重要特性。它作为一个服务运行,管理系统配置和状态。所有这些配置和状态都是属性。每个属性是一个键值对(key/value pair),其类型都是字符串。
首先:在android中设置这一属性,目的是定义一些属性供其它应用或库读取使用。
如何读取/设置属性
Android上有三种主要途径来get/set属性。
1、 native code
当编写本地应用程序时,可以使用property_get和property_set 这两个API来读取/设置属性。要使用它们,我们需要include cutils/properties.h,并链接libcutils库。
(未尝试,这个可能不需要源码并编译吧??)
2、 java code
在Java包(java.lang.System)中提供有System.getProperty和System.setProperty方法。但值得注意的是,尽管这两个API在语义上等同native函数,但其将数据存储于完全不同的位置。实际上,dalvik VM使用一个哈希表来存储这些属性。所以,用这两个API存储的属性是独立的,不能存取native属性,反之亦然。
然而Android有一个内部隐藏类(@hide,对SDK不可见)android.os.SystemProperties来操纵native属性。其通过jni来存取native属性库。
(这直接说明,在没有整个工程源码并进行编译的情况下,是不可能使用该方式了。)
3、 shell脚本
Android提供getprop和setprop命令行工具来获取和更新属性。其依赖libcutils实现。
(未尝试)
以上翻译自http://rxwen.blogspot.com/2010/01/android-property-system.html,有修正。
例子:在java code中读取设置SystemProperties
创建与修改android属性用Systemproperties.set(name,value),获取android属性用Systemproperties.get(name),需要注意的是android属性的名称是有一定的格式要求的,如下: 前缀必须用system\core\init\property_service.c中定义的前缀 ,进行系统属性设置的程序也必须有相应的进程权限,
如何将android程序的权限提升到system权限?方法是这样的:
1、在AndroidManifest.xml中,在manifest加入android:sharedUserId="android.uid.system "。
2、在Android.mk中,將LOCAL_CERTIFICATE:= XXX修改成LOCAL_CERTIFICATE := platform 。
经过以上两步就可以把ap的权限提升到system权限了。 但是用这种方法提升权限有两个弊端(即对上述方式2中红字的解释),如下:
A、程序的拥有都必须有程序的源码;
B、程序的拥有都还必须有android开发环境,就是说自己能make整个android系统。
3、附小例代码:
package com.test.shared;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.os.SystemProperties;
public class TestReadActivity extends Activity {
final static String name = "com.qobo.accelerometerSetting.";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SystemProperties.set("runtime.testa","123456");
String str = SystemProperties.get("runtime.testa");
Log.d("SYS", str);
}
}
更多参考:
Android Property System | Android属性系统原理介绍:http://blog.youkuaiyun.com/jackyu613/article/details/6136620