在 Android Native 程序中输出 LOG
来源:互联网 发布:国产女装品牌知乎 编辑:程序博客网 时间:2024/04/30 22:56
尽管是在 Linux Kernel 层开发,但有时还是需要接触一些 Android Native 层代码,查看相关 Log。这篇文章主要是介绍 Android 下与 Log 相关工具的用法,以及在 Native 层模块里,如何去打印 Log。
1 Liblog 库
Android 给 Native 层的程序提供一个 liblog 库,用来输出日志。如果程序中需要打印 Log,可以包含 cutils/log.h 这个头文件,并且定义自己的 LOG_TAG,就可以使用这个 liblog。liblog 提供了如下 Log 打印函数:
- ALOGX
- ALOGX_IF
其中 X 代表 Log 优先级,liblog 总共有5级,分别对应 V, D, I, W, E,具体意义如下:
- V: Verbose, 调试时用的冗余信息,在 Release 版本中会被去掉,可以在程序中定义 LOG_NDEBUG 为0,来打开这个级别的 LOG
- D: Debug, 调试 Log,在 Release 版本中会被保留,但可以动态关闭这个级别的 Log
- I: Info,程序运行时的状态 Log,一般都会保留这个级别的 Log
- W: Warning, 程序警告 Log,对调试非常有帮助,需要保留
- E: Error, 程序错误 Log,这个级别 Log 优先级最高,出现这个 Log 意味着程序出错了
下面我们通过一个测试程序说明 liblog 的用法:
#include <stdio.h>
#include <cutils/log.h>
#include <stdlib.h>
#include <unistd.h>
#ifdef LOG_TAG
#undef LOG_TAG
#endif
#define LOG_TAG "mytest"
static bool con = true;
int main(int argc, char *argv[])
{
printf("this is a test log using printf");
ALOGI("This is a test log using ALOGI");
ALOGD("This is a test log using ALOGD");
ALOGD_IF(con, "this is a test using log ALOGD_IF");
return 0;
}
我们需要把这个程序编译成 Android 里的可执行文件,所以还需写一个 Android.mk:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS += -Wall
LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -llog -g
LOCAL_C_INCLUDES := bionic
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_SHARED_LIBRARIES += liblog libcutils
LOCAL_SRC_FILES:= test.cpp
LOCAL_MODULE := test
include $(BUILD_EXECUTABLE)
把这两个文件放到 Android 源码里的一个文件夹内,然后就可以通过 mmm path/to/test
来单独编译这个程序,最后用 adb push
命令把编译的测试程序复制到手机 / Android 模拟器里,这样就可以在 adb shell
里运行我们的程序了。
2 Android Log 查看
如果直接运行,可能只能看到 printf 打印的 Log,因为使用 liblog 输出的 Log,都会放到 /dev/log/system
这个 BUFFER 里。我们可以通过 Android 自带的 logcat 工具去查看。
由于 Android 的庞大,单纯运行 logcat 命令后,我们会被各个模块打印的 Log 给淹没掉。所以得过滤没用的 Log。logcat 工具就是干这个的,使用格式如下:
$ adb logcat TAG1:PRIORITY TAG2:PRIORITY
其中 TAG 就是程序中定义的 LOG_TAG,PRIORITY 就是要显示的最高 Log 级别。那么现在我们要 logcat 只显示 mytest 这个 TAG 打印的所有 Log,则可以这么写:
$ adb logcat mytest:V *:S
后面跟的 *:S
就是把其他模块打印的 LOG 全部屏蔽掉。
如果需要把 printf 这样的标准打印函数也整合到 Android 日志缓存里,可以借助 logwrapper 工具。这里要注意的是所有通过 logwrapper 的日志,其 TAG 会变为程序名,而不是我们在程序里定义的 TAG。有的时候,我们需要在脚本向 Android Log 缓存中输出一些 Log,则可以借助 log 这个工具。例如:
$ log -p v -t MYTEST "this is a test"
其中 -p
就是指定 Log 等级 (v, d, i, w, e)
,-t
是指定该 Log 的 TAG。
- 在 Android Native 程序中输出 LOG
- Android native C 程序中输出LOG信息
- android开发,使用log在native code中输出日志
- 在程序中输出日志, 使用 android.util.Log 类.
- Android教程-02 在程序中输出Log
- Android在JNI中输出输出LOG
- Android在Native层输出Log到本地文件
- Android在JNI中输出Log
- android NDK开发中 在native代码试用log
- android native c++打印log输出
- Android native log输出为kernel log方法
- Android NDK :在 C语言代码中输出Log
- Android NDK :在 C语言代码中输出Log
- 在android jni中添加输出日志Log
- Android中Log的输出
- Android.mk中输出log
- Android中Log.d和Log.v如何实现在release版本不输出
- 在 Android 中调用二进制可执行程序(native executable )
- 设计模式六大原则之三:依赖倒置原则
- Android开发之应用层到驱动层的接口实现(一)
- Office365批量分配许可(License)
- java代码实现打印菱形
- Pycharm连接Oracle数据库
- 在 Android Native 程序中输出 LOG
- sql:常用sql语句整理二 (连接查询)
- 使用Thrift的网络框架搭建一般性网络应用
- 阅读笔记_《effective-csharp》
- Python MySQLdb连接数据库的应用
- iOS 10 的适配问题
- 理论---<url pattern> 匹配规则
- HashMap中key为null时存到哪里去了
- 勒索病毒防护方案