安卓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

相关文章推荐

Android5.0 Recovery 支持中文

网上已经很多开源的实现方式支持4.4的中文显示, 之前也修改过4.4的中文, 切到5.0发现需要修改。 修改的前提是得懂两个地方: 1: 中文的头文件是如何生成和实现显示到屏幕点击打开链接的 头文...

Git 查询已经删除的文件

$ cd frameworks/base $ git log -M --name-status --all -- services/java/com/android/server/wm/StackBo...

linux 驱动module_init()本质--->不同驱动加载顺序对应不同的优先级

阶段一: kernel-3.18\include\linux\init.h中   Linux内核为不同驱动的加载顺序对应不同的优先级,定义了一些宏: #definepure_initcall(fn...

Recvoery相关文章合集

Recvoery相关文章合集 recovery工作原理系列文章 Android–Recovery模块之升级过程 Android recovery UI实现分析 Bootloader - Main ...

Linux时间子系统之三:时间的维护者:timekeeper

本系列文章的前两节讨论了用于计时的时钟源:clocksource,以及内核内部时间的一些表示方法,但是对于真实的用户来说,我们感知的是真实世界的真实时间,也就是所谓的墙上时间,clocksource只...

Android 5.0 开机横屏修改

如果理解了Android的设计的原理, 其实这个修改原理十分简单, 比一些网上流出来的粗暴的修改方式既美观又实用。 修改分为三部分:  1: 上层(Java)修改 既然设计到屏幕的修改, 肯定想...
  • ouo555
  • ouo555
  • 2015-04-01 14:44
  • 3046

MTK kernel log Tool

在开发Linux device Driver或者跟踪调试内核行为的时候经常要通过Log API来trace整个过程,Kernel API printk() 是整个Kernel Log机制的基础API,...

Android Recovery 移植 Busybox

这里说的是源码的编译环境下, 如何完整的移植一份Busybox。 如果在Recovery下开发新功能, 没有Busybox的话, 调试起来很麻烦(不能执行 adb shell)。 这里在推荐一个小...
  • ouo555
  • ouo555
  • 2015-05-22 17:11
  • 1551

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

oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

存储【2】 eMMC分区详解

oooooooooooooooooooooooooooooooooooooo
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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