Android kernel和logcat的输出等级

kernel:
查看当前输出级别

cat /proc/sys/kernel/printk
6       6       1       7


输出

# kernel/msm-4.9/kernel/printk/printk.c
#kernel-5.10/kernel/printk/printk.c

int console_printk[4] = {
        CONSOLE_LOGLEVEL_DEFAULT,       /* console_loglevel */
        MESSAGE_LOGLEVEL_DEFAULT,       /* default_message_loglevel */
        CONSOLE_LOGLEVEL_MIN,           /* minimum_console_loglevel */
        CONSOLE_LOGLEVEL_DEFAULT,       /* default_console_loglevel */
};

// 控制台日志级别:优先级高于该值的消息将被打印至控制台
// 默认的消息日志级别:将用该优先级来打印没有优先级的消息(即不加log级别时以什么级别打印)
// 最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级)
// 默认的控制台日志级别:控制台日志级别的缺省值


宏定义:

找到级别定义

grep -rn CONSOLE_LOGLEVEL_DEFAULT ./kernel/


高通

#define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT
#define CONSOLE_LOGLEVEL_SILENT  0 /* Mum's the word */
#define CONSOLE_LOGLEVEL_MIN     1 /* Minimum loglevel we let people use */
#define CONSOLE_LOGLEVEL_QUIET   4 /* Shhh ..., when booted with "quiet" */
#define CONSOLE_LOGLEVEL_DEFAULT 7 /* anything MORE serious than KERN_DEBUG
grep -rn "#define KERN_DEBUG" ./kernel/

rk修改log等级:

kernel-5.10/include/linux/printk.h

#define CONSOLE_LOGLEVEL_DEFAULT CONFIG_CONSOLE_LOGLEVEL_DEFAULT

将CONFIG_CONSOLE_LOGLEVEL_DEFAULT改为0

高通

#define KERN_EMERG      KERN_SOH "0"    /* system is unusable */
#define KERN_ALERT      KERN_SOH "1"    /* action must be taken immediately */
#define KERN_CRIT       KERN_SOH "2"    /* critical conditions */
#define KERN_ERR        KERN_SOH "3"    /* error conditions */
#define KERN_WARNING    KERN_SOH "4"    /* warning conditions */
#define KERN_NOTICE     KERN_SOH "5"    /* normal but significant condition */
#define KERN_INFO       KERN_SOH "6"    /* informational */
#define KERN_DEBUG      KERN_SOH "7"    /* debug-level messages */
# kernel/msm-4.9/include/linux/printk.h 
static inline int printk_get_level(const char *buffer)
{
        if (buffer[0] == KERN_SOH_ASCII && buffer[1]) {
                switch (buffer[1]) {
                case '0' ... '7':
                case 'd':       /* KERN_DEFAULT */
                case 'c':       /* KERN_CONT */
                        return buffer[1];
                }
        }
        return 0;
}

static inline const char *printk_skip_level(const char *buffer)
{
        if (printk_get_level(buffer))
                return buffer + 2;

        return buffer;
}


指定级别

int console_printk[4] = {
        CONSOLE_LOGLEVEL_DEFAULT, // 4 /* console_loglevel */
        MESSAGE_LOGLEVEL_DEFAULT, // 4 /* default_message_loglevel */
        CONSOLE_LOGLEVEL_MIN,     // 1 /* minimum_console_loglevel */
        CONSOLE_LOGLEVEL_DEFAULT, // 4 /* default_console_loglevel */
};


// 结果:没生效,还是 6 6 1 7

高通初始化服务

# device/qcom/common/rootdir/etc/init.qcom.sh
buildvariant=`getprop ro.build.type`
case "$buildvariant" in
    "userdebug" | "eng")
        #set default loglevel to KERN_INFO
        # echo "6 6 1 7" > /proc/sys/kernel/printk
        echo "4 4 1 4" > /proc/sys/kernel/printk
        ;;
    *)
        #set default loglevel to KERN_WARNING
        echo "4 4 1 4" > /proc/sys/kernel/printk
        ;;
esac

# 设置参数测试:没起作用
# 获取
getprop persist.console.silent.config
# 设置
setprop persist.console.silent.config 0
注意:这个值默认是1

结果:修改高通的服务脚本,重新编译生效(应该是这个服务覆盖了printk.c的配置)java

 java相关log:

# frameworks/base/core/java/android/util/Log.java

public static int i(String tag, String msg) {
    return println_native(LOG_ID_MAIN, INFO, tag, msg);
}
改为
public static int i(String tag, String msg) {
    return 0;
}

// 结果:关闭了log.i的输出,同理可以关闭其它的输出
// 注意:native层的log输出还在
// 具体的log输出在 system/core/include/cutils/log.h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值