Systemproperties类在android.os下,但这个类是隐藏的,上层程序开发无法直接使用,其实用java的反射机制是可以使用这个类。安卓系统属性,可从多个文件中获取, 当启动属性服务时,将从以下文件中加载默认属性,这些属性的定义宏在bionic/libc/include/sys/_system_properties.h:
/default.prop
/system/build.prop
/system/default.prop
/data/local.prop
(1)build.prop是编译时收集的各种property(LCD density/语言/编译时间, etc.),编译完成之后,文件生成在out/target/product/<board>/system/目录下。在Android运行时可以通过property_get()[c/c++域] / SystemProperties.get()[Java域 frameworks\base\core\java\android\os\SystemProperties.java]读取这些属性值。
build.prop的生成是由make系统解析build/core/Makefile完成。Makefile中首先定义各种变量,这在下一步执行时会用。
...
PRODUCT_DEFAULT_LANGUAGE="$(calldefault-locale-language,$(PRODUCT_LOCALES))" \
PRODUCT_DEFAULT_REGION="$(calldefault-locale-region,$(PRODUCT_LOCALES))" \
...
(2)Makefile中调用build/tools/buildinfo.sh执行脚本,并输出到build.prop。Buildinfo.sh很简单,只是echo一些属性,比如:
...
echo"ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"
echo"ro.product.locale.region=$PRODUCT_DEFAULT_REGION"
...
ro.product.locale.language/ ro.product.locale.region就是些属性,等号后面是值。
(3)Makefile中直接把$(TARGET_DEVICE_DIR)/system.prop的内容追加到build.prop中,还会收集ADDITIONAL_BUILD_PROPERTIES中的属性,追加到build.prop中。
ADDITIONAL_BUILD_PROPERTIES又会收集PRODUCT_PROPERTY_OVERRIDES中定义的属性,如下:
ADDITIONAL_BUILD_PROPERTIES:= \
$(ADDITIONAL_BUILD_PROPERTIES)\
$(PRODUCT_PROPERTY_OVERRIDES)
通过build.prop生成过程的分析,可知哪里可以修改原有的属性或加入自己定义属性,那就是2) buildinfo.sh; 3) system.prop; 4) ADDITIONAL_BUILD_PROPERTIES或PRODUCT_PROPERTY_OVERRIDES。
备注:build.prop的属性值可以在开机过程中动态设置而不放在文本中,如在init.rc中setprop ro.sf.lcd_density 160
(4)需要注意的是android属性的名称是有一定的格式要求的,如下:前缀必须用system\core\init\property_service.c中定义的前缀,进行系统属性设置的程序也必须有system或root权限,如何将android程序的权限提升到system权限?方法是这样的:
1、在AndroidManifest.xml中,在manifest加入android:sharedUserId="android.uid.system"。
2、在Android.mk中,將LOCAL_CERTIFICATE := XXX修改成LOCAL_CERTIFICATE :=platform。
经过以上两步就可以把ap的权限提升到system权限了。至于说到的前缀对应的属性,首先看根据权限分配的PID号
1 #define AID_ROOT 0 /* traditional unix root user */
2 #define AID_SYSTEM 1000 /* system server */
3 #define AID_RADIO 1001 /* telephony subsystem, RIL */
4 #define AID_DHCP 1014 /* dhcp client */
5 #define AID_SHELL 2000 /* adb and debug shell user */
6 #define AID_CACHE 2001 /* cache access */
7 #define AID_APP 10000 /* first app user */
system/core/init/property_service.c中的property_perms数组,则定义了前缀和权限的对应关系。如果设置某个前缀属性的PID不对,则会提示:sys_prop: permission denied
======================================== Android平台LOG输出规范=======================================
Log的调用及等级介绍
(1)、Log的等级有Verbose,Debug,Info,Warn,Error。
(2)、java层调用:在java层调用import android.util.Log,在需要打印Log的地方执行Log.v,Log.d,Log.i,Log.w,Log.e.
其他用法常见的有Logcat -v time带时间戳;logcat -s "xxxx"显示特定字串;logcat -b radio显示ril层打印,Logcat无此打印。
(3)、c、c++层调用:在c,c++层包含此头文件:#include <cutils/log.h>,在需要调用Log的地方执行:ALOGV,ALOGD,ALOGI,ALOGW,ALOGE。
(4)、各个Log等级的使用
Verbose: 开发调试过程中一些详细信息,不应该编译进产品中,只在开发阶段使用。(参考api文档的描述:Verbose should never be compiled into anapplication except during development)
Debug: 用于调试的信息,编译进产品,但可以在运行时关闭。(参考api文档描述:Debug logs are compiled in but stripped atruntime)
Info:例如一些运行时的状态信息,这些状态信息在出现问题的时候能提供帮助。
Warn:警告系统出现了异常,即将出现错误。
Error:系统已经出现了错误。
=========================================Log写入文件==========================================
在Android开发的时候经常会遇到手机offline,影响日志的查看与分析,或者有些平台不支持离线后台写入Log。为此,有必要将日志写入文件中,便于以后调试的时候可以拿来分析使用。
具体参见http://blog.csdn.net/wyzxk888/article/details/7478152。只需要创建一个类文件LogWriter,在其他文件创建LogWriter实例mm,需要打印的地方用mm.print("xxxx")就行了。
=========================================将异常(getStackTrace)转化成String==========================================
有时需要将本来在Logcat中的exception输出保存到特定文本或者分析日志中,方法:
private static String getStackMsg(Exception e) {
StringBuffer sb = new StringBuffer();
StackTraceElement[] stackArray = e.getStackTrace();
for (int i = 0; i < stackArray.length; i++) {
StackTraceElement element = stackArray[i];
sb.append(element.toString() + "\n");
}
return sb.toString();
}
private static String getStackMsg(Throwable e) {
StringBuffer sb = new StringBuffer();
StackTraceElement[] stackArray = e.getStackTrace();
for (int i = 0; i < stackArray.length; i++) {
StackTraceElement element = stackArray[i];
sb.append(element.toString() + "\n");
}
return sb.toString();
}
参考原文:http://blog.csdn.net/thl789/article/details/7014300
参考原文:http://blog.csdn.net/xujianqun/article/details/6363318