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

转载 2012年03月21日 16:11:59

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

Android属性工作原理解析

Android属性方便了android系统进行定制,也有利于android上层应用可以方便操作。 一. android属性文件生成原理。 根据android属性值读取顺序/default.prop...

Android属性之build.prop生成过程分析

田海立2011-11-26 本文简要分析一下build.prop是如何生成的。Android的build.prop文件是在Android编译时刻收集的各种property(LCD density/语言...
  • thl789
  • thl789
  • 2011年11月26日 12:41
  • 38293

Android属性之build.prop生成过程分析

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

Android Property System | Android属性系统(文章写的很好。)

Android Property System | Android属性系统 分类: Android frameworks2012-05-16 16:01 196人阅读 评论(0) 收藏 举报 ...

Android4.0.4-在build.prop中添加属性的方法

1、在*.rc文件中用setprop添加,例如在源码android4.0\system\core\rootdir\etc\init.goldfish.rc中有以下内容:     setprop AR...

将异常(getStackTrace)转化成String

将异常(getStackTrace)转化成String

Android平台Log输出规范

1、  目的: 为了规范软件工程师在android代码编写过程中输出Log的行为,使得发布的产品中打印的Log是必须的,打印的Log的级别是能真实反映此Log对应的级别,标签、Log内容具有很好的可读...

LINUX系统以及ANDROID 平台log信息输出级别设置 [MTK]

oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
  • ffmxnjm
  • ffmxnjm
  • 2017年05月25日 16:27
  • 2594

Android Build类获取系统信息

在Android中可以Build类来获取一些系统信息,本文介绍了Build类的使用,可获取的系统信息列表。并详细介绍了Build类获取系统信息的流程,以及Build类获取到系统信息的来源。最后介绍了如...
  • ccpat
  • ccpat
  • 2015年03月31日 11:27
  • 6198

android 版本对应源码

D:\AndroidStudio\sdk\sources\android-25\android\os\Build.java/* * Copyright (C) 2007 The Android Op...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:安卓Systemproperties的读写 && Android平台LOG输出规范 && Log写入文件 && 将异常(getStackTrace)转化成String
举报原因:
原因补充:

(最多只允许输入30个字)