Android Log系统介绍

2023-11-19

前言

日志分析是开发的核心阶段之一,开发人员经常会遇到这样那样的问题,需要借助日志分析来解决。Bug日志有助于在开发阶段识别Android应用中的Bug。一旦应用发布到市场上,开发者(或者支持工程师)也要通过分析bug日志来解决问题。可见,日志系统在开发过程中非常重要。

目录

  1. Log系统介绍
    1.1日志类型
    1.2 log系统框架
    1.3 写日志流程
    1.4 读日志流程
    1.5 接口使用
    1.6 Logd介绍
    1.7 logcat介绍
  2. 常见问题
    2.1 系统资源占用
    2.2 log信息丢失
    2.3 log信息丢失解决思路
    2.4 log信息常用的指令

1、Android Log系统介绍

Android使用的是一个集中式日志系统来记录所有的日志,应用开发者可以编写自定义日志,也可以定义日志过滤器,来打印关键日志信息来反馈程序运行状况。例如 App 中常使用的 Log.d、Log.v 、log.i等,而在 Native 层会使用 ALOGD 打印日志。对于第三方添加的 C/C++ 应用程序来说,如果希望使用 Android 的日志系统,就需要添加 liblog 库。

1.1 日志类型

在Android生态系统中有不同类型的日志: 主日志、系统日志、事件日志和Radio日志。 这四种日志分别对应着Linux内核中有四个不同的日志缓冲区。
主日志:用于应用程序,使用android.util.Log打印,设备节点/dev/log/main
Android系统日志:用于系统,使用android.util.Slog打印,设备节点dev/log/system
Events日志:用于系统事件信息,二进制格式,使用android.util.EventLog打印,设备节点/dev/log/event
Radio日志:用于电话相关信息,设备节点/dev/log/radio

1.2 log系统框架

包括一个日志写入的过程,和一个日志读取的过程。其中涉及到的几个主要的对象:log.d()、logcat、logd、liblog.so
Log.d :封装在 android.jar里,java层的使用接口
logcat:system/core/logcat,log的客户端
liblog : system/core/liblog,navtive接口库
logd : system/core/logd,log系统的服务
在这里插入图片描述

1.3 写日志流程

应用中通过android.jar调用接口,填入想要打印的日志内容。通过JNI调用到native层libandroid_runtime.so,并通过liblog.so库,最终通过dev/socket/logdw将日志写入logd的buff内
在这里插入图片描述

1.4 读日志流程

Android提供了logcat工具来实现对日志的读取。主要过程为先读入 logdr 中传入的客户端参数,然后把之前 LogBuffer 中的日志通过 flushto,最终通过 socket 的 sendDatav() 写给 logcat。
logcat 作为读取的客户端是需要先对日志进行格式解析,并拼接为命令行可见的字符串,因此有了 processBuffer 的过程。同时 logcat 打印日志超过了文件大小限制,就需要调用 rotateLogs 函数去建立新的文件。
在这里插入图片描述

1.5 接口使用

java层

Android 应用层提供日志系统的 Java 接口:Log.java、Rlog.java、Slog.java、EventLog.java。其功能类似只是写入 logd 的日志节点不同。Java 接口封装在 android.jar 中,作为 SDK 提供给开发者使用,在运行时通过 libandroid_runtime.so 中的 JNI 接口调用系统 native api;
使用方式实例如下:
在这里插入图片描述
Log的打印结果如下:
在这里插入图片描述

Native层

log系统的接口封装在Liblog.so库中供Nativie层使用,主要是封装了 logd 访问的 socket 接口。 Liblog.so最终是通过 socket 通信的方式,完成客户端日志写入 logd;
Native层的使用方式如下:
1)mk文件里引入库
在这里插入图片描述

2)C/C++程序使用
在这里插入图片描述

1.6 Logd介绍

Log系统的服务进程,开机时由 init 进程启动,属于守护进程常驻后台。logd 内部维护了四个 RAM buffer 用作日志的缓存,各个进程的日志都会写入这些缓存中。同时可以通过用户的控制参数指令,来管理日志内容的输入输出。 logd 对外维护了 3 个 socket API来与客户端进行通信 ,分别对应着读、写、控制功能。分别为:
dev/socket/logd : 用于传输控制指令
dev/socket/logw : 用于写日志
dev/socket/logr : 用于读日志

Logd系统框图

logd 进程启动后,分别启动 LogReader、LogListener、CommandListener 三个线程,监听并处理来自三个 socket 的消息。在收到消息后,会通过 LogBuffer 类保存日志到对应的 RAM buffer 中;
LogAudit 模块用于接收 Kernel selinux 信息,即可以在用户空间打印 selinux 日志信息;
LogKlog 用于接收 kernel 日志信息,通过设置 property ,可以通过 logcat 命令读取内核日志;
LogStatistics 是日志统计模块,默认开启统计数据较少,仅能以 pid/uid 纬度统计打印日志的数量。如果设置了 logd.statistic = true 。会打印更多纬度的统计信息,包括哪些 pid/uid/tid/TAG 日志量比较大,可用于日志裁剪相关
在这里插入图片描述

1.7 logcat介绍

logcat 作为读取日志的工具,相当于logd的client端,在用户使用log系统的过程中扮演着重要的角色;通过这个client完成log日志的收集,可以控制日志的输出格式等。
Log等级
目前Android系统log等级大致分为7类,V :详细,D:调试,I:信息,W:警告,E:错误,F:严重错误, S :静默。可以通过系统属性来控制系统的log输出等级:setprop persist.log.tag V
在这里插入图片描述
命令简介:
我们经常使用logcat指令来抓取日志,协助我们分析问题,logcat的指令格式:logcat [options] [fileterspecs] ;
常用的logcat指令有:
adb logcat –b all > log.txt
adb logcat –c
Adb logcat –G 8m
在这里插入图片描述
日志统计功能:
随着芯片功能愈发强大,车载android项目上新增的功能和服务也越来越多,导致系统里的日志量经常处于失控状态,非常影响系统的性能。
Log系统还提供了一个日志统计的功能,可以使用adb logcat –S进行统计查看,核心是-S 参数设置了printStatistics 标志位为 true,logcat 通过 /dev/socket/logd 向logd发送请求,打印LogStatistics模块存储的统计信息。
在设置 logd.statistics = true 的配置项后,可以打印出更多日志统计信息,包括pid/uid/tid/TAG 等统计维度的信息。
在这里插入图片描述

2. 常见问题

2.1 系统资源占用

打印日志是非常消耗资源的,原因可概括为:
① 跨进程通信的消耗:日志信息通过 socket 发送给 logd② 内存消耗:logd 中维持对应的 buffer。RAM 的消耗③ CPU 资源消耗:logd 中 ring buffer 会经常进行 pruneLogs 操作,删减日志,耗费CPU资源。④ IO 消耗:创建后台线程保存日志信息到文件里,这回导致应用或者整机卡顿

2.2 log信息丢失

经常有开发人员反馈有日志信息缺失的现象,主要是两个原因,日志量太多和logd折叠策略;
日志量太多:
导致日志读取速度<日志的写入速度,会有日志被清除掉。
logd的丢弃机制导致:
当系统log过多,打印不涣时会丢弃部分日志:
在这里插入图片描述
当某进程频繁打印相同日志时,也会丢弃部分日志:
在这里插入图片描述

2.3 log信息丢失解决思路

解决日志丢失方式,可以从以下几个方面入手:
1,系统各进程缩减log量;
2,禁用黑白名单机制,此方法适用log写入频率特别快,logd勉强能够处理;
3,利用黑白名单机制,适用log写入频率不是很快,但是还有很多log丢失
4,提高logcat的log打印等级
5,增大LogBuffer缓冲区大小

2.4 log信息常用的指令

adb shell dumpstate
查看手机系统当前状态信息(包含系统构建版本、网络相关、内存的使用、cpu的使用、进程等信息),需要root权限。
adb shell bugreport、 adb bugreport
输出过去系统的状态log,会打印出dmesg,dumpstate和dumpsys的输出。
adb shell dmesg
打印内核kernel的信息及日志,需要root权限。
adb shell dumpsys
获取并打印获取系统各项服务信息,可以在命令后面加指定的service name(比如activity,location),如果不加则默认打印出设备中所有service的信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Log系统介绍 的相关文章

随机推荐

  • 公钥 私钥 的理解

    公钥和私钥是成对出现 私钥可以生成公钥 公钥无法生成私钥 私钥加密的内容 可以被公钥解密 公钥加密的内容 可以被私钥解密 举个例子 A 持有自己的私钥 A的私钥生成的公钥被其他人持有 其他人用A的公钥加密的内容 只有用A的私钥才可以解密 且
  • 分享一个java+python双版本源码之基于微信小程序的校园跑腿接单系统 校园快递代领小程序(源码、lw、调试)

    作者 计算机源码社 个人简介 本人七年开发经验 擅长Java Python PHP NET 微信小程序 爬虫 大数据等 大家有这一块的问题可以一起交流 学习资料 程序开发 技术解答 文档报告 如需要源码 可以扫取文章下方二维码联系咨询 Ja
  • target_include_directories([SYSTEM][BEFORE]

    target include directories
  • mybatis获取新增记录的主键

    最近项目中有个需求 需要在新增一条记录后返回该记录的主键 查了下资料 用mybatis可以做 我需要拿第一个方法执行返回的id作为变量传给下面 数据库中该id是记录主键 并且数据库用的是主键自增长 这是前提 有两种方式 第一种方式写法如下
  • 信息化战略规划-CRO-SCM-应用集成-电子商务

    信息化战略规划 CRO SCM 应用集成 电子商务 信息化战略体系 重点 信息系统战略规划 重点 客户关系管理 重点 供应链管理 企业应用集成 电子商务 信息化战略体系 重点 企业战略 目标 企业战略规划 实现目标的规划 企业信息化战略 使
  • 操作系统(四):磁盘调度算法,先来先服务,最短寻道时间优先,电梯算法

    文章目录 一 磁盘结构 二 先来先服务 三 最短寻道时间优先 四 电梯算法 SCAN 一 磁盘结构 盘面 Platter 一个磁盘有多个盘面 磁道 Track 盘面上的圆形带状区域 一个盘面可以有多个磁道 扇区 Track Sector 磁
  • 在echarts中自定义提示框内容

    以折线图为例 在鼠标滑过每个数据标签时 为了更友好地显示数据内容 需要对显示的数据内容作格式化处理 添加自定义内容 这就需要用到tooltip的formatter属性的回调函数 本文将从配置代码和效果两方面来展示它的使用 柱状图的原理类似
  • NCC低代码平台服务搭建指南

    NCC服务搭建 前言 本文档旨在帮助第一次接触NCC的开发人员 搭建NCC开发环境 1 NCC相关资料 开发者社区 https nccdev yonyou com 资料 https pan baidu com s 15V71U7vVOGr8
  • 【论文笔记】TNASP:A Transformer-based NAS Predictor with a Self-evolution Framework

    文章目录 0 摘要 摘要解读 1 Introduction 2 相关工作 3 方法 3 1 Training based network performance predictors 3 2 基于Transformer的预测器 3 3 自演
  • unity3d实现简单的打飞碟游戏

    游戏内容 游戏有n个round 每个round发射10次trial 每个trial的飞碟都可能不同 包括速度角度得分等 使用鼠标进行射击 点中即表示射击成功 游戏要求 使用带缓存的工厂模式来管理飞碟的生产与再利用 工厂使用单例模式 游戏的设
  • python中.argsort()的用法

    argsort 是对数组参数从小到大排序 然后取出排序后的索引 例如 a np array 0 2 0 5 0 3 0 4 a argsort 输出的就是对a数组排序过后的索引 0 2 3 1
  • 三、web端显示之hdfs基本操作

    三台的节点均启动成功之后 完全匹配的上配置的下图所示情况 若启动不成功 则先 root hadoop1 hadoop 3 1 3 stop all sh 再输入ll显示一下 删除每一个集群上的data和logs root hadoop1 h
  • Qt源代码中二进制兼容及d、q指针的理解

    1 二进制兼容的理解 首先按照本文对二进制兼容进行理解 此处是本人的总结 将类的私有属性 不需要暴露的部分 放到私有类中 在类中定义私类的指针进行交互 指针的大小是已知不变的 指针数据类型为Int 4个字节 软件发布后只需要改私类中的部分
  • 安装vmware tools时,kernel版本不匹配问题的解决方法

    安装vmware tools 的时候 提示找不到C header files 此种情况下 按以下步骤操作 1 内核安装完毕后 需要用这个命令确定内核 C header 的安装目录 ls d usr src kernels uname r i
  • 怎样知道自己适不适合做程序员

    编程是一门非常有技术含量的手艺活 待遇和福利相对来说较为丰厚 由于种种原因想要转行做程序员的人 总会有这样的困惑 我是否适合做程序员呢 其实做为一个开发者 有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C语言C 交流群58365041
  • 全文检索几种词向量模型

    1 倒排索引模型 2 布尔检索类型 3 TF IDF权重计算 下面是TF IDF的JAVA代码实现 public class TFIDF public double tf List
  • vue的循环遍历(v-for)

    1 循环遍历 1 循环遍历 vue的循环遍历用v for 语法类似于js中的for循环 当我们有一组数据需要进行渲染时 我们就可以使用v for来完成 2 v for使用格式 格式为 v for item in items 遍历items中
  • 【Android开发】一文全面解析Framework层

    前言 上一篇文章从Native角度讲解了Android进程管理的相关概念 本文将继续从上层的Framework中的进程启动 销毁场景和优先级处理 以及它们与四大组件的种种关联 来逐步解析Android进程管理的其他关键要素 进程的启动 An
  • 腾讯 Bugly 和 CrashHandler 冲突,不上传日志

    简单介绍 CrashHandler 是继承 UncaughtExceptionHandler 类来处理 app 崩溃 自由度比较大 可以收集日志信息保存到本地 上传网络 并重启应用 可以说是除了三方的异常上报工具 开发者使用最多的一种方式
  • Android Log系统介绍

    前言 日志分析是开发的核心阶段之一 开发人员经常会遇到这样那样的问题 需要借助日志分析来解决 Bug日志有助于在开发阶段识别Android应用中的Bug 一旦应用发布到市场上 开发者 或者支持工程师 也要通过分析bug日志来解决问题 可见