配套系列教学视频链接:

安卓系列教程之ROM系统开发-百问100ask

说明

系统:Android10.0

设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)

前言

在编写代码时, 有不同的级别的日志, 有些日志需要在调试阶段看, 在运行时就不能出现, 此时就可以通过android提供的接口来进行控制日志的输出。


一, 编译时静态控制

#define  LOG_INFO 5

#define LOG_DEBUG 6

#define current_dbg_level  LOG_INFO

#define my_log(level, fmt, ...)  \

do { \

if(current_dbg_level >= level) \

ALOGI(fmt, ##__VA_ARGS__); \

}while(0);

上面的代码主要是通过比对my_log(level, fmt, ...) 中level 和current_dbg_level的大小, 稍微注意的的是, LOG_INFO比LOG_DEBUG高, 但是此处设置的是数字越小界别越高。上面的代码特点是, 如果需要调整输出的日志级别,就需要重新改代码并编译,再运行才能起效。

二,运行时动态调整

Android系统其实提供了相关接口, 可以在不改代码的情况下, 通过命令来控制程序的日志级别输出, 这样就省去了编译的步骤,并为灵活输出日志提供了途径, 该接口提供java和C/C++的接口, 如下所示:

java接口:boolean isLoggable(string TAG, int  level)

解释:

1, 该函数是将参数中的level与默认用户设置的级别进行比较,用户设置级别默认是info, 如果参数level大于用户设置级别,函数会返回true,而用户设置级别的途径是通过命令etprop log.tag.xxx  V/D/I/W/E/A  来完成。

2. 只有 level >= 用户设置的级别才能输出,即level >= 用户设置的级别时isLoggable返回true,反之则返回false;

3. 可以通过setprop log.tag.<YOUR_LOG_TAG> <LEVEL>来设置用户日志比对级别,如adb shell setprop log.tag.XXX D。也可以将这些属性按照log.tag.XXX=D的形式,写入/data/local.prop中, 而XXX就是代码中的字符串TAG

4. tag的长度如果超过23个字符则会抛出IllegalArgumentException异常

framework日志控制例子:

frameworks/base/services/core/java/com/android/server/ConnectivityService.java

private static final boolean DBG = true;

private static final boolean DDBG = Log.isLoggable(TAG, Log.DEBUG);

private static final boolean VDBG = Log.isLoggable(TAG, Log.VERBOSE);

if (VDBG || DDBG) log("Setting MTU size: " + iface + ", " + mtu);

private static void log(Strings) {

Slog.d(TAG, s);

}

C/C++接口:__android_log_is_loggable()

int __android_log_is_loggable(int prio, const char* tag, int default_prio)

参数1: 当前代码输出的级别,会和属性log. tag.<tagname>进行比对。

参数2: 标签

参数3: 默认的比对日志级别,类似log. tag.<tagname>

参考代码:

#define LOG_EMERG     (ANDROID_LOG_FATAL)

#define LOG_ALERT     (ANDROID_LOG_FATAL)

#define LOG_CRIT      (ANDROID_LOG_FATAL)

#define LOG_ERR       (ANDROID_LOG_ERROR)

#define LOG_WARNING   (ANDROID_LOG_WARN)

#define LOG_INFO      (ANDROID_LOG_INFO)

#define LOG_DEBUG     (ANDROID_LOG_DEBUG)

#define LOG_VERBOSE    (ANDROID_LOG_VERBOSE)

#define syslog(level, fmt, ...)  \

do { \

if(__android_log_is_loggable(level, LOG_TAG, ANDROID_LOG_INFO)){ \

ALOGI(fmt, ##__VA_ARGS__); \

} \

}while(0);

总结

两种方法都可以控制日志输出, 第一种相对来说轻量一些, 第二种判断逻辑代码比第一种多写, 但是更智能些。

Android系统10 RK3399 init进程启动(十八) isLoggable日志级别输出控制相关推荐

  1. Android系统10 RK3399 init进程启动(十五) 配置新产品

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 前面几 ...

  2. Android系统10 RK3399 init进程启动(三十八) 属性Selinux实战编程

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 上一节 ...

  3. Android系统10 RK3399 init进程启动(三十五) 属性文件介绍和生成过程

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 ini ...

  4. Android系统10 RK3399 init进程启动(三十四) 常见Property属性

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 上一节 ...

  5. Android系统10 RK3399 init进程启动(三十六) 属性property操作API

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 前面几 ...

  6. Android系统10 RK3399 init进程启动(三十三) property属性系统框架

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 属性系 ...

  7. Android系统10 RK3399 init进程启动(三十一) SeAndroid实战之定义策略

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 之前章 ...

  8. Android系统10 RK3399 init进程启动(二) RK3399开发板硬件介绍

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 本文介 ...

  9. Android 9 (P)之init进程启动源码分析指南之三

          Android 9 (P)之init进程启动源码分析指南之三 Android 9 (P)系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 An ...

最新文章

  1. centos7.0 docker安装部署
  2. 华为手机 android8.0APP更新时出现安装包解析异常的提示及安装闪退(无反应)问题
  3. 苹果 的硬件架构和普通PC有区别吗? 有什么区别?
  4. AS下配置OpenCV环境
  5. ckeditor 4.2.1_演示 ckeditor 上传插入图片
  6. python多线程执行其他模块的文件_python并发编程--进程线程--其他模块-从菜鸟到老鸟(三)...
  7. deque双向队列的使用
  8. JAVA面试题总汇(含答案)
  9. 注解 @Target 用法
  10. python_GUI操作(鼠标、键盘)
  11. java编译不报错但运行啥都没_java编译时与运行时概念与实例详解
  12. 重磅!中国科协发布2020重大科学问题和工程技术难题
  13. saltstack管理七之minion端备份
  14. 【Chrome】如何对Chrome浏览器内容进行长截图
  15. 尚学堂马士兵SSH笔记下载
  16. 关于计算机体系结构-北桥和南桥
  17. Proteus,keil5仿真运行stm32程序,流水灯详细教程
  18. java pacs上传服务_医疗pacs系统影像数据的同步方法及前置服务器的制造方法
  19. 微信加密某一个人私聊?微信私密聊天
  20. 使用nvm管理node和npm

热门文章

  1. matlab之常用命令整理(持续更新中...)
  2. android usb gadget分析
  3. JavaScript看这一篇就够了,简单全面一发入魂
  4. 统信软件:第一份收入破亿的答卷
  5. 51单片机 播放青花瓷(源码)
  6. MarchingCubes算法提取等值面的基本原理
  7. delphi中常见错误提示说明总结
  8. python二级真题 d[i] = d.get(i,0)+1
  9. linux安装无线打印机,Unraid 安装CUPS实现共享打印和无线打印
  10. C语言基础:最简单的程序