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

来源:互联网 发布:宣城太守知不知 白居易 编辑:程序博客网 时间:2024/06/03 23:48

         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]读取这些属性值。
(1)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)属性(property)都有一个名称和值,他们都是字符串格式,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。
        在系统初始化时,Android将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的,“init”守护进程将启动一个属性服务。任何客户端想获得属性信息,可以从共享内存直接读取。客户端应用程序可以调用libcutils中的API函数以GET/SET属性信息:
int property_get(const char *key, char *value, const char *default_value);
int property_set(const char *key, const char *value);
       当启动属性服务时,将从以下文件中加载默认属性,这些属性的定义宏在bionic/libc/include/sys/_system_properties.h:
/default.prop
/system/build.prop
/system/default.prop
/data/local.prop
属性将会以上述顺序加载,后加载的属性将覆盖原先的值。特别属性如果属性名称以“ro.”开头,那么这个属性被视为只读属性,比如ro.mediatek.version.release=ALPS.ICS2.MP.V1就是指示版本号,程序中用property_get("ro.mediatek.version.release", val, "unknown");即可用来获得版本信息。
而android上层使用的SystemProperties.java的接口,定义在frameworks/base/core/jni/android_os_SystemProperties.cpp中,
======================================== 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

原创粉丝点击