Android系统10 RK3399 init进程启动(十八) isLoggable日志级别输出控制
配套系列教学视频链接:
安卓系列教程之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)
#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日志级别输出控制相关推荐
- Android系统10 RK3399 init进程启动(十五) 配置新产品
配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 前面几 ...
- Android系统10 RK3399 init进程启动(三十八) 属性Selinux实战编程
配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 上一节 ...
- Android系统10 RK3399 init进程启动(三十五) 属性文件介绍和生成过程
配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 ini ...
- Android系统10 RK3399 init进程启动(三十四) 常见Property属性
配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 上一节 ...
- Android系统10 RK3399 init进程启动(三十六) 属性property操作API
配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 前面几 ...
- Android系统10 RK3399 init进程启动(三十三) property属性系统框架
配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 属性系 ...
- Android系统10 RK3399 init进程启动(三十一) SeAndroid实战之定义策略
配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 之前章 ...
- Android系统10 RK3399 init进程启动(二) RK3399开发板硬件介绍
配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 本文介 ...
- Android 9 (P)之init进程启动源码分析指南之三
Android 9 (P)之init进程启动源码分析指南之三 Android 9 (P)系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 An ...
最新文章
- centos7.0 docker安装部署
- 华为手机 android8.0APP更新时出现安装包解析异常的提示及安装闪退(无反应)问题
- 苹果 的硬件架构和普通PC有区别吗? 有什么区别?
- AS下配置OpenCV环境
- ckeditor 4.2.1_演示 ckeditor 上传插入图片
- python多线程执行其他模块的文件_python并发编程--进程线程--其他模块-从菜鸟到老鸟(三)...
- deque双向队列的使用
- JAVA面试题总汇(含答案)
- 注解 @Target 用法
- python_GUI操作(鼠标、键盘)
- java编译不报错但运行啥都没_java编译时与运行时概念与实例详解
- 重磅!中国科协发布2020重大科学问题和工程技术难题
- saltstack管理七之minion端备份
- 【Chrome】如何对Chrome浏览器内容进行长截图
- 尚学堂马士兵SSH笔记下载
- 关于计算机体系结构-北桥和南桥
- Proteus,keil5仿真运行stm32程序,流水灯详细教程
- java pacs上传服务_医疗pacs系统影像数据的同步方法及前置服务器的制造方法
- 微信加密某一个人私聊?微信私密聊天
- 使用nvm管理node和npm
热门文章
- matlab之常用命令整理(持续更新中...)
- android usb gadget分析
- JavaScript看这一篇就够了,简单全面一发入魂
- 统信软件:第一份收入破亿的答卷
- 51单片机 播放青花瓷(源码)
- MarchingCubes算法提取等值面的基本原理
- delphi中常见错误提示说明总结
- python二级真题 d[i] = d.get(i,0)+1
- linux安装无线打印机,Unraid 安装CUPS实现共享打印和无线打印
- C语言基础:最简单的程序