当前位置: 首页 > 科技观察

浅谈Android日志分析

时间:2023-03-20 00:11:49 科技观察

【.com快译】众所周知,日志在一个应用产品的整个开发生命周期中扮演着重要的角色。例如:在软件开发过程中,错误日志可以帮助开发人员及时发现程序中的逻辑错误;并且在产品投放市场后,支持工程师可以通过分析错误日志来解决各种疑难杂症。在我们常用的安卓(Android)系统中,各种日志默认都是集中管理的。当然,市场上有很多用于开发Android应用程序的工具,它们允许应用程序开发程序员编写自定义日志消息和由特定日志语句定义的各种过滤器。目前,Android生态系统提供了不同类型的日志,包括:应用日志、系统日志、事件日志和广播日志(RadioLogs)。日志系统由:内核驱动程序和内核缓冲区(用于存储Android日志消息)、可用于创建日志条目和访问日志消息的C、C++和Java类以及可用于查看日志的独立服务器组成日志消息(logcat)程序,并具有查看日志和过滤来自主机的日志消息(通过eclipse或ddms)等组件。Android系统的Linux内核有四种不同的日志缓冲区,分别为系统的不同部分提供日志记录。例如:通过文件系统中/dev/log这个设备节点,我们可以访问Android的四个日志缓冲区:main、event、radio和system。mainlog是应用程序,event是系统事件信息,radio是手机相关信息,system是底层系统消息和调试。日志中的每条消息都包含一个标记。通过这样的标记,我们可以知道:消息来自系统或应用程序的哪一部分、时间戳(消息到达的时间)、消息的日志级别(或消息所代表的事件的优先级)、日志消息体本身(对于错误、异常或信息的详细描述)。Android系统中的四种日志类型:1.应用日志使用android.util.Log类方法将不同优先级的消息写入日志。利用各种Java类,以字符串的形式静态声明它们的标签,并传递给日志方法。记录方法可用于识别消息的“优先级”(或记录级别)。各种消息检索工具(logcat)在处理日志时可以按标识或优先级进行过滤。2.系统日志使用android.util.Slog类写入不同优先级的消息及其关联消息。许多Android框架类能够区分系统日志(可能很混乱)和应用程序日志消息。格式化的消息通过C/C++库传递给内核驱动程序,它可以将消息存储在适当的缓冲区(例如,系统缓冲区)中。3.事件日志使用android.util.EventLog类创建事件日志消息,通常是二进制格式。日志条目包含二进制标记代码,后跟二进制参数。消息标记代码通常存储在系统上的/system/etc/event-log-tags中。每条消息都有一个带有日志消息的字符串,以及一个指向条目关联(存储)值的代码。4.Broadcastlog作用于与电话(调制解调器)有关的信息。日志条目由二进制标记代码和消息组成,可用于提供各种类型的网络信息。日志系统自动将带有特定标签的消息路由到无线电缓冲区中。Android上的日志格式Android系统中常见的日志格式为:tv_sectv_nsecprioritypidtidtagmessageLen消息。其中:tag:日志标签。tv_sec&tv_nsec:日志消息的时间戳。pid:来自日志消息的进程ID。tid:线程ID。优先级的值可以按照以下规则从低到高排列:V-detail(详细,最低优先级)*D-debug(调试)*I-信息(Info)*W-warning(警告)*E-Error(错误)*F-Fatal(致命)*S-Silent(静默,优先级最高,但不打印任何东西)*日志文件位置原则上,Android日志(包括崩溃日志)可以存放在多个地方,并且没有标准化目录(即:特定于系统的ROM)要求。在这里,我们介绍一些常用和常用的目录:/data/anr:Dalvik(译者注:是谷歌为Android平台设计的虚拟机。)将在ANR时写入堆栈跟踪,即“ApplicationNotResponding”,也称为“Force-Close”。/data/dontpanic:这里包含一些崩溃日志,用于各种跟踪。/data/kernelpanics:与“kernelpanic”相关的日志存放在这里。/data/tombstones:这里会包含多个tombstone_nn文件(nn是0到10之间的数字,即超过10后需要重新统计)。“日志”相关的命令行工具在实际项目中,我们可以通过各种应用程序或命令行工具,从设备或模拟器上抓取Android上产生的相关日志,然后共享给各个开发者或维护者,以便他们进行深入分析。以下是三个常用的命令:adblogcat:显示当前Android系统所有类型的日志。adblogcat-vthreadtime:在显示中包括日期和时间。adblogcat-vthreadtime>logfile.txt:将日志存储在logfile.txt中。实用过滤模式为了减少数据量,可以在adb命令中使用如下过滤器(filter)(参见--https://www.pcloudy.com/executing-adb-shell-commands/),来减少日志总量。当然,您也可以使用此类过滤器来搜索用户Android设备上的日志文件。adblogcat-f:将所有日志保存到一个文件中。adblogcat"*:E":获取所有致命错误信息。亚行日志|grep-i"foo.example.":获取与"foo.example.*"相关的所有日志并标记它们。adblogcat"application_or_tag_name:*""*:S":按应用名称获取所有日志。adblogcat-bevents"gsm_service_state_change""*:S":获取所有GSM状态变化。adblogcat-bradio:获取所有广播事件。日志分析至此,我们对Android的日志系统有了一个基本的了解。在实际分析中,我们通常会关注两类应用日志,它们是:Debug日志——开发和测试阶段产生的日志文件。生产日志——最终用户在使用过程中直接生成的文件。我们可以使用GoogleLogTool、SonyLogTool等工具,采用过滤模式进行深入分析。原标题:Android日志分析,作者:BalaMurugan