关闭

安卓Systemproperties的读写 && Android平台LOG输出规范 && Log写入文件 && 将异常(getStackTrace)转化成String

标签: androidpropertiesmakefilebuild脚本
27214人阅读 评论(10) 收藏 举报
分类:

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2801442次
    • 积分:25727
    • 等级:
    • 排名:第230名
    • 原创:221篇
    • 转载:215篇
    • 译文:1篇
    • 评论:665条
    最新评论