AndroidT(13) Log 系统 -- C plus plus 语言格式的LOG输出(二)

1.概览

  上一章提到的是在Android系统中,以C语言格式方式进行log输出。本章就来讲讲c++语言格式的。

std::cout<<"This is a c++ log"<<std::endl;

  在Android中也同样提供了类似的接口

LOG(INFO)<<"This is a c++ log from Android.";

  不同的是不需要后加 std::endl 来告知一行结束。在Android的log系统中,天然的就认为一个LOG就对应一行内容。

2. 打印LOG内容所属的类型

2.1 输出 Android系统的LOG到logd

  在 Android 中,有着非常多的子系统,所以 Android 的 LOG 系统是支持多个buffer的,即不同类型的log写入不同的buffer中。它所支持的log类型可以简单的使用对应版本的 logcat 工具查看

board:/ # logcat -h
Usage: logcat [options] [filterspecs]

General options:
  -b, --buffer=<buffer>       Request alternate ring buffer(s):
                                main system radio events crash default all
                              Additionally, 'kernel' for userdebug and eng builds, and
                              'security' for Device Owner installations.
                              Multiple -b parameters or comma separated list of buffers are
                              allowed. Buffers are interleaved.
                              Default -b main,system,crash,kernel.

  在c++语言风格的log接口中是没办法选择buffer输出的,它们默认被输出到 main buffer中去。

2.2 打印内容所属的级别

  手头需要做的事有轻重缓急,log中的信息所代表的事项也同样如此。下面是Android log 系统的几个级别

//system\libbase\include\android-base\logging.h
namespace android {
namespace base {
...
enum LogSeverity {
  VERBOSE,
  DEBUG,
  INFO,
  WARNING,
  ERROR,
  FATAL_WITHOUT_ABORT,  // For loggability tests, this is considered identical to FATAL.
  FATAL,
...
};
}
};

  前面也说了,c++风格的LOG接口只支持打印到main buffer,所以和上面的log级别组合也就如下几种

//system\libbase\include\android-base\logging.h
#define LOG(severity) LOGGING_PREAMBLE(severity) && LOG_STREAM(severity)

LOG(VERBOSE)
LOG(DEBUG)
LOG(INFO)
LOG(WARNING)
LOG(ERROR)
LOG(FATAL_WITHOUT_ABORT)
LOG(FATAL)

  不同级别的log使用场景可以参考上一章节。

2.3 输出 Android系统的LOG到 kmsg

  上面我们所说的 main/system/radio buffer实际上都是来自于logd的内部缓存,即属于logd这个进程。
  但输出log到kernel中,则需要使用到kmsg了。kmsg大家应该更加的熟悉,因为linux存在时间可比Android悠久的多,它属于linux kernel的log子系统,Android系统是基于linux,所以除了Android系统本身规划的这些log外。还有一套linux kernel的log系统,它暴露的设备节点如下

board:/ # ls /dev/kmsg -Z
u:object_r:kmsg_device:s0 /dev/kmsg

2.4 切换LOG输出 – SetLogger

  Android还是一如既往的周到,提供了切换接口

//file:system\libbase\include\android-base\logging.h
LogFunction SetLogger(LogFunction&& logger);

  切换kernel log

SetLogger(android::base::KernelLogger);

  其中KernelLogger定义如下

// Log to the kernel log (dmesg).
void KernelLogger(LogId log_buffer_id, LogSeverity severity, const char* tag, const char* file, unsigned int line, const char* message);

  在代码中,调用了如上接口后,在其之后的log都会被打印到/dev/kmsg中。我们可以通过dmesg来获取。
  同样的,我们也可以将log定向到标准输出中

SetLogger(android::base::StdioLogger);

3.使用实例 – logPrintCppStyle

3.1 编译配置 – Android.bp

cc_binary {
    name: "logPrintCppStyle",
    srcs: [
        "*.cpp",
    ],
    shared_libs: [
        "libbase",
    ],
    cppflags: [
        "-Wno-unused-parameter",
    ],
}

  C语言风格的log打印接口,只使用了库 libbase,所以只要包含它即可。

3.2 测试源码 – logPrintCppStyle.cpp


#define LOG_TAG     "logPrintCppStyle"


#include <stdlib.h>
#include <android-base/logging.h>//from libbase
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char* argv[])
{
    /*
        1.print the log to stdio but not logd
            board:/ # logcat -s logPrintCppStyle&
            [1] 4971
            board:/ # logPrintCppStyle
            LOG(INFO):write INFO level to main buffer
    */
    //android::base::InitLogging(nullptr, android::base::StdioLogger);

    /**
     * 2. print the log to kernel log buffer but not logd 
     *      board:/ # logPrintCppStyle
     *      board:/ # --------- beginning of kernel
     *      11-25 18:22:11.924  4975  4975 I logPrintCppStyle: LOG(INFO):write INFO level to main buffer
     *      board:/ # dmesg|grep logPrintCpp
     *      [15331.396227] logPrintCppStyle: LOG(INFO):write INFO level to main buffer
    */
    //android::base::InitLogging(nullptr, android::base::KernelLogger);

    /**
     * 3.default:
     *      board:/ # logPrintCppStyle
     *      --------- beginning of main
     *      11-25 18:26:59.983  4980  4980 I logPrintCppStyle: LOG(INFO):write INFO level to main buffer
    */
    /**
     * 4.Control the log to be shown by its level
     *      4.1 INFO is the default level. So VERBOSE don't shows in default.
     *      board:/ # logPrintCppStyle
     *          11-24 19:07:43.577  2894  2894 I logPrintCppStyle: LOG(INFO):write log
     *          11-24 19:07:43.578  2894  2894 W logPrintCppStyle: LOG(WARNING):write log
     *          11-24 19:07:43.578  2894  2894 E logPrintCppStyle: LOG(ERROR):write log
     *          11-24 19:07:43.578  2894  2894 F logPrintCppStyle: LOG(FATAL_WITHOUT_ABORT):write log
     *
     *      board:/ # setprop log.tag.logPrintCppStyle V
     *      board:/ # logPrintCppStyle
     *      11-24 19:08:12.676  2925  2925 V logPrintCppStyle: LOG(VERBOSE):write log
     *      11-24 19:08:12.677  2925  2925 D logPrintCppStyle: LOG(DEBUG):write log
     *      11-24 19:08:12.677  2925  2925 I logPrintCppStyle: LOG(INFO):write log
     *      11-24 19:08:12.677  2925  2925 W logPrintCppStyle: LOG(WARNING):write log
     *      11-24 19:08:12.677  2925  2925 E logPrintCppStyle: LOG(ERROR):write log
     *      11-24 19:08:12.677  2925  2925 F logPrintCppStyle: LOG(FATAL_WITHOUT_ABORT):write log
     *
     *      board:/ # setprop log.tag.logPrintCppStyle I
     *      board:/ # logPrintCppStyle
     *      11-24 19:09:17.451  2929  2929 I logPrintCppStyle: LOG(INFO):write log
     *      11-24 19:09:17.451  2929  2929 W logPrintCppStyle: LOG(WARNING):write log
     *      11-24 19:09:17.451  2929  2929 E logPrintCppStyle: LOG(ERROR):write log
     *      11-24 19:09:17.451  2929  2929 F logPrintCppStyle: LOG(FATAL_WITHOUT_ABORT):write log
     *
     *      board:/ # setprop log.tag.logPrintCppStyle E
     *      board:/ # logPrintCppStyle
     *      11-24 19:09:40.640  2931  2931 E logPrintCppStyle: LOG(WARNING):write log
     *      11-24 19:09:40.640  2931  2931 F logPrintCppStyle: LOG(FATAL_WITHOUT_ABORT):write log
     *
     *      board:/ # setprop log.tag.logPrintCppStyle F
     *      board:/ # logPrintCppStyle
     *      11-24 19:09:47.405  2933  2933 F logPrintCppStyle: LOG(FATAL_WITHOUT_ABORT):write log
    */
    LOG(VERBOSE)<<"LOG(VERBOSE):write log";
    LOG(DEBUG)<<"LOG(DEBUG):write log";
    LOG(INFO)<<"LOG(INFO):write log";
    LOG(WARNING)<<"LOG(WARNING):write log";
    LOG(ERROR)<<"LOG(ERROR):write log";
    //LOG(FATAL_WITHOUT_ABORT)<<"LOG(FATAL_WITHOUT_ABORT):write log";
    //LOG(FATAL)<<"LOG(FATAL):write log";

    /**
     * 5. using PLOG to show the detial error when error occurs
     * 11-24 19:17:49.677  2941  2941 E logPrintCppStyle: PLOG(ERROR):write log: No such file or directory
    */
    open("/dev/fakeDev", O_APPEND);
    PLOG(ERROR) << "PLOG(ERROR):write log";
    /**
     * 6.control the location where log is shown. /dev/dmesg or logd's main buffer
     *   board:/ # logPrintCppStyle
     *   11-24 19:20:31.142  2943  2943 V logPrintCppStyle: LOG(VERBOSE):write log
     *   11-24 19:20:31.143  2943  2943 D logPrintCppStyle: LOG(DEBUG):write log
     *   11-24 19:20:31.143  2943  2943 I logPrintCppStyle: LOG(INFO):write log
     *   11-24 19:20:31.143  2943  2943 W logPrintCppStyle: LOG(WARNING):write log
     *   11-24 19:20:31.143  2943  2943 E logPrintCppStyle: LOG(ERROR):write log
     *   11-24 19:20:31.143  2943  2943 F logPrintCppStyle: LOG(FATAL_WITHOUT_ABORT):write log
     *   11-24 19:20:31.143  2943  2943 E logPrintCppStyle: PLOG(ERROR):write log: No such file or directory
     *   11-24 19:20:31.143  2943  2943 I logPrintCppStyle: set StdioLogger as Logger...
     *   LOG(INFO):write log
    */
    LOG(INFO)<<"set StdioLogger as Logger...";
    SetLogger(android::base::StdioLogger);
    LOG(INFO)<<"LOG(INFO):write log";
    SetLogger(android::base::KernelLogger);
    /**
     * 7. making the crash in the application
     *  11-24 19:22:38.611  2958  2958 I crash_dump64: performing dump of process 2955 (target tid = 2955)
     *   11-24 19:22:38.642   417   417 I logd    : logdr: UID=0 GID=0 PID=2958 n tail=0 logMask=8 pid=2955 start=0ns deadline=0ns
     *   11-24 19:22:38.648   417   417 I logd    : logdr: UID=0 GID=0 PID=2958 n tail=0 logMask=1 pid=2955 start=0ns deadline=0ns
     *   11-24 19:22:38.641  2958  2958 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
     *   11-24 19:22:38.641  2958  2958 F DEBUG   : Build fingerprint: 'Fake/full_board_t/board:13/TP1A.220624.014/eng.flagstaff.20220920.145750:userdebug/test-keys'
     *   11-24 19:22:38.641  2958  2958 F DEBUG   : Revision: '0'
     *   11-24 19:22:38.641  2958  2958 F DEBUG   : ABI: 'arm64'
     *   11-24 19:22:38.641  2958  2958 F DEBUG   : Timestamp: 2022-11-24 19:22:38.613264983+0800
     *   11-24 19:22:38.641  2958  2958 F DEBUG   : Process uptime: 2s
     *   11-24 19:22:38.642  2958  2958 F DEBUG   : Cmdline: logPrintCppStyle
     *   11-24 19:22:38.642  2958  2958 F DEBUG   : pid: 2955, tid: 2955, name: logPrintCppStyl  >>> logPrintCppStyle <<<
     *   11-24 19:22:38.642  2958  2958 F DEBUG   : uid: 0
     *   11-24 19:22:38.642  2958  2958 F DEBUG   : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
     *   11-24 19:22:38.642  2958  2958 F DEBUG   : signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
     *   11-24 19:22:38.642  2958  2958 F DEBUG   : Abort message: 'LOG(FATAL_WITHOUT_ABORT):write log'
     *   11-24 19:22:38.642  2958  2958 F DEBUG   :     x0  0000000000000000  x1  0000000000000b8b  x2  0000000000000006  x3  0000007ffea7f850
     *   11-24 19:22:38.642  2958  2958 F DEBUG   :     x4  000000000000000a  x5  000000000000000a  x6  000000000000000a  x7  7f7f7f7f7f7f7f7f
     *   11-24 19:22:38.642  2958  2958 F DEBUG   :     x8  00000000000000f0  x9  0000007361352a80  x10 0000000000000001  x11 0000007361393760
     *   11-24 19:22:38.642  2958  2958 F DEBUG   :     x12 0000007ffea7eb34  x13 0000000000000002  x14 0000000000000000  x15 00000073613568e2
     *   11-24 19:22:38.642  2958  2958 F DEBUG   :     x16 0000007361400d58  x17 00000073613dc2a0  x18 00000073633e4000  x19 0000000000000b8b
     *   11-24 19:22:38.642  2958  2958 F DEBUG   :     x20 0000000000000b8b  x21 00000000ffffffff  x22 0000007362f63000  x23 0000000000000000
     *   11-24 19:22:38.642  2958  2958 F DEBUG   :     x24 0000000000000000  x25 0000000000000000  x26 0000000000000000  x27 0000000000000000
     *   11-24 19:22:38.643  2958  2958 F DEBUG   :     x28 0000000000000000  x29 0000007ffea7f8d0
     *   11-24 19:22:38.643  2958  2958 F DEBUG   :     lr  0000007361384248  sp  0000007ffea7f830  pc  0000007361384274  pst 0000000000001000
     *   11-24 19:22:38.643  2958  2958 F DEBUG   : backtrace:
     *   11-24 19:22:38.643  2958  2958 F DEBUG   :       #00 pc 0000000000053274  /apex/com.android.runtime/lib64/bionic/libc.so (abort+164) (BuildId: 2909e25171905ab2aa55000ddb487289)
     *   11-24 19:22:38.643  2958  2958 F DEBUG   :       #01 pc 00000000000063fc  /system/lib64/liblog.so (__android_log_default_aborter+12) (BuildId: ea3eb93b960dede93d1fb67c42ed7273)
     *   11-24 19:22:38.643  2958  2958 F DEBUG   :       #02 pc 0000000000016a50  /system/lib64/libbase.so (android::base::LogMessage::~LogMessage()+352) (BuildId: 805c1dfe4ea9454d03b5d1626665b3f0)
     *   11-24 19:22:38.643  2958  2958 F DEBUG   :       #03 pc 00000000000015dc  /system/bin/logPrintCppStyle (main+1404) (BuildId: f7c3609dd3aa7216053ac5cd10d3df82)
     *   11-24 19:22:38.643  2958  2958 F DEBUG   :       #04 pc 000000000004b650  /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+96) (BuildId: 2909e25171905ab2aa55000ddb487289)
    */
    //LOG(FATAL)<<"LOG(FATAL):write log";

    /**
     * 8.
     *   11-27 12:37:17.677  5706  5706 V logPrintCppStyle: LOG(VERBOSE):write log
     *   11-27 12:37:17.677  5706  5706 D logPrintCppStyle: LOG(DEBUG):write log
     *   11-27 12:37:17.677  5706  5706 I logPrintCppStyle: LOG(INFO):write log
     *   11-27 12:37:17.678  5706  5706 W logPrintCppStyle: LOG(WARNING):write log
     *   11-27 12:37:17.678  5706  5706 E logPrintCppStyle: LOG(ERROR):write log
     *   11-27 12:37:17.678  5706  5706 E logPrintCppStyle: PLOG(ERROR):write log: No such file or directory
     *   11-27 12:37:17.678  5706  5706 I logPrintCppStyle: set StdioLogger as Logger...
     *   11-27 12:37:17.687  5706  5706 F logPrintCppStyle: Check failed: false == true (false=0, true=1)
     * error information:
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : Build fingerprint: 'Fake/full_board_t/board:13/TP1A.220624.014/eng.flagstaff.20220920.145750:userdebug/test-keys'
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : Revision: '0'
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : ABI: 'arm64'
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : Timestamp: 2022-11-27 12:37:17.707826659+0800
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : Process uptime: 1s
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : Cmdline: logPrintCppStyle
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : pid: 5706, tid: 5706, name: logPrintCppStyl  >>> logPrintCppStyle <<<
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : uid: 0
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
     *       11-27 12:37:17.725  5709  5709 F DEBUG   : signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
     *       11-27 12:37:17.725  5709  5709 F DEBUG   : Abort message: 'Check failed: false == true (false=0, true=1) '
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x0  0000000000000000  x1  000000000000164a  x2  0000000000000006  x3  0000007fde3c3c90
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x4  000000000000000a  x5  000000000000000a  x6  000000000000000a  x7  7f7f7f7f7f7f7f7f
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x8  00000000000000f0  x9  0000007864688a80  x10 0000000000000001  x11 00000078646c9760
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x12 0000007fde3c2f74  x13 0000000000000002  x14 0000000000000000  x15 000000786468c8e2
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x16 0000007864736d58  x17 00000078647122a0  x18 0000007868288000  x19 000000000000164a
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x20 000000000000164a  x21 00000000ffffffff  x22 0000007867a27000  x23 00000058c8e3fb8e
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x24 00000058c8e3fc17  x25 00000058c8e3fc1a  x26 00000058c8e3fc6c  x27 00000058c8e3fbb3
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x28 00000058c8e3fc8c  x29 0000007fde3c3d10
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     lr  00000078646ba248  sp  0000007fde3c3c70  pc  00000078646ba274  pst 0000000000001000
     *       11-27 12:37:17.725  5709  5709 F DEBUG   : backtrace:
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :       #00 pc 0000000000053274  /apex/com.android.runtime/lib64/bionic/libc.so (abort+164) (BuildId: 2909e25171905ab2aa55000ddb487289)
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :       #01 pc 00000000000063fc  /system/lib64/liblog.so (__android_log_default_aborter+12) (BuildId: ea3eb93b960dede93d1fb67c42ed7273)
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :       #02 pc 0000000000016a50  /system/lib64/libbase.so (android::base::LogMessage::~LogMessage()+352) (BuildId: 805c1dfe4ea9454d03b5d1626665b3f0)
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :       #03 pc 000000000000131c  /system/bin/logPrintCppStyle (main+700) (BuildId: dc17c42573ba586fece229f605ff661a)
     *       11-27 12:37:17.726  5709  5709 F DEBUG   :       #04 pc 000000000004b650  /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+96) (BuildId: 2909e25171905ab2aa55000ddb487289)
    */
    CHECK_EQ(false, true);
    return EXIT_SUCCESS;
}

  上面的例子大致包含了如下几种用法
    a)使用接口SetLogger设置log的输出位置,其中 InitLogging 的功能和它是类似的,只不过更加自由,可以重新设置abort级别的log输出。
    b)输出各级别的log
    c)PLOG的使用,这个还是比较有意思的,因为他会直接把错误码直接转换成人类可阅读的形式输出log,下面是例子

    /**
     * 5. using PLOG to show the detial error when error occurs
     * 11-24 19:17:49.677  2941  2941 E logPrintCppStyle: PLOG(ERROR):write log: No such file or directory
    */
    open("/dev/fakeDev", O_APPEND);
    PLOG(ERROR) << "PLOG(ERROR):write log";

    d)FATAL级别和CHECK_XX系列的接口,前者会直接造成程序进入abort分支,导致程序异常退出。后者在条件满足的条件下和前者表现完全一致

    /**
     * 8.
     *   11-27 12:37:17.677  5706  5706 V logPrintCppStyle: LOG(VERBOSE):write log
     *   11-27 12:37:17.677  5706  5706 D logPrintCppStyle: LOG(DEBUG):write log
     *   11-27 12:37:17.677  5706  5706 I logPrintCppStyle: LOG(INFO):write log
     *   11-27 12:37:17.678  5706  5706 W logPrintCppStyle: LOG(WARNING):write log
     *   11-27 12:37:17.678  5706  5706 E logPrintCppStyle: LOG(ERROR):write log
     *   11-27 12:37:17.678  5706  5706 E logPrintCppStyle: PLOG(ERROR):write log: No such file or directory
     *   11-27 12:37:17.678  5706  5706 I logPrintCppStyle: set StdioLogger as Logger...
     *   11-27 12:37:17.687  5706  5706 F logPrintCppStyle: Check failed: false == true (false=0, true=1)
     * error information:
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : Build fingerprint: 'Fake/full_board_t/board:13/TP1A.220624.014/eng.flagstaff.20220920.145750:userdebug/test-keys'
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : Revision: '0'
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : ABI: 'arm64'
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : Timestamp: 2022-11-27 12:37:17.707826659+0800
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : Process uptime: 1s
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : Cmdline: logPrintCppStyle
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : pid: 5706, tid: 5706, name: logPrintCppStyl  >>> logPrintCppStyle <<<
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : uid: 0
     *       11-27 12:37:17.724  5709  5709 F DEBUG   : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
     *       11-27 12:37:17.725  5709  5709 F DEBUG   : signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
     *       11-27 12:37:17.725  5709  5709 F DEBUG   : Abort message: 'Check failed: false == true (false=0, true=1) '
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x0  0000000000000000  x1  000000000000164a  x2  0000000000000006  x3  0000007fde3c3c90
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x4  000000000000000a  x5  000000000000000a  x6  000000000000000a  x7  7f7f7f7f7f7f7f7f
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x8  00000000000000f0  x9  0000007864688a80  x10 0000000000000001  x11 00000078646c9760
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x12 0000007fde3c2f74  x13 0000000000000002  x14 0000000000000000  x15 000000786468c8e2
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x16 0000007864736d58  x17 00000078647122a0  x18 0000007868288000  x19 000000000000164a
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x20 000000000000164a  x21 00000000ffffffff  x22 0000007867a27000  x23 00000058c8e3fb8e
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x24 00000058c8e3fc17  x25 00000058c8e3fc1a  x26 00000058c8e3fc6c  x27 00000058c8e3fbb3
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     x28 00000058c8e3fc8c  x29 0000007fde3c3d10
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :     lr  00000078646ba248  sp  0000007fde3c3c70  pc  00000078646ba274  pst 0000000000001000
     *       11-27 12:37:17.725  5709  5709 F DEBUG   : backtrace:
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :       #00 pc 0000000000053274  /apex/com.android.runtime/lib64/bionic/libc.so (abort+164) (BuildId: 2909e25171905ab2aa55000ddb487289)
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :       #01 pc 00000000000063fc  /system/lib64/liblog.so (__android_log_default_aborter+12) (BuildId: ea3eb93b960dede93d1fb67c42ed7273)
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :       #02 pc 0000000000016a50  /system/lib64/libbase.so (android::base::LogMessage::~LogMessage()+352) (BuildId: 805c1dfe4ea9454d03b5d1626665b3f0)
     *       11-27 12:37:17.725  5709  5709 F DEBUG   :       #03 pc 000000000000131c  /system/bin/logPrintCppStyle (main+700) (BuildId: dc17c42573ba586fece229f605ff661a)
     *       11-27 12:37:17.726  5709  5709 F DEBUG   :       #04 pc 000000000004b650  /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+96) (BuildId: 2909e25171905ab2aa55000ddb487289)
    */
    CHECK_EQ(false, true);

4.使用属性控制log级别输出

  打印到logd中的log和C语言形式的log一样,也是支持根据log级别做有选择的方式进行输出的。但对于输出到标准输出以及kmsg的情况则是不适用的。

board:/ # setprop log.tag.logPrintCppStyle V
board:/ # logPrintCppStyle
LOG(INFO):write log
11-27 17:20:19.197  5914  5914 V logPrintCppStyle: LOG(VERBOSE):write log
11-27 17:20:19.197  5914  5914 D logPrintCppStyle: LOG(DEBUG):write log
11-27 17:20:19.197  5914  5914 I logPrintCppStyle: LOG(INFO):write log
11-27 17:20:19.197  5914  5914 W logPrintCppStyle: LOG(WARNING):write log
11-27 17:20:19.197  5914  5914 E logPrintCppStyle: LOG(ERROR):write log
11-27 17:20:19.197  5914  5914 E logPrintCppStyle: PLOG(ERROR):write log: No such file or directory
11-27 17:20:19.197  5914  5914 I logPrintCppStyle: set StdioLogger as Logger...
11-27 17:20:19.206  5914  5914 F logPrintCppStyle: Check failed: false == true (false=0, true=1)
Aborted
board:/ # setprop log.tag.logPrintCppStyle E
board:/ # logPrintCppStyle
11-27 17:20:24.767  5923  5923 E logPrintCppStyle: LOG(ERROR):write log
11-27 17:20:24.767  5923  5923 E logPrintCppStyle: PLOG(ERROR):write log: No such file or directory
11-27 17:20:24.775  5923  5923 F logPrintCppStyle: Check failed: false == true (false=0, true=1)
Aborted
<think>我们正在处理一个复杂的命令序列,涉及多个步骤:切换目录、初始化环境、选择编译配置和编译内核组件。命令如下: cd /home/zhujianhua/work/AndroidU/sprd_vnd/bsp && source build/envsetup.sh && lunch ums9230_6h10_Natv_k515 - userdebug - androidt && make kernelcomponent -j3 我们将分解这个命令,并解释每个部分的作用,然后讨论可能遇到的问题及解决办法。 ## 命令分解 1. **cd /home/zhujianhua/work/AndroidU/sprd_vnd/bsp** 切换到指定目录,这是后续命令执行的工作目录。 2. **source build/envsetup.sh** 执行`build/envsetup.sh`脚本,该脚本用于初始化Android编译环境。它会定义一些有用的函数(如`lunch`、`m`、`mm`等)并设置环境变量。 3. **lunch ums9230_6h10_Natv_k515 - userdebug - androidt** 选择编译目标(target)。`lunch`命令用于从菜单中选择或直接指定一个目标。这里直接指定目标为`ums9230_6h10_Natv_k515 - userdebug - androidt`。 注意:目标字符串中包含了空格和连字符,这可能是笔误?通常,`lunch`的目标格式为`<product_name>-<build_variant>`,例如`aosp_arm-eng`。因此,这里的目标应该是一个整体字符串,可能应为`ums9230_6h10_Natv_k515-userdebug-androidt`(用连字符连接,无空格)。如果目标字符串包含空格,可能会导致`lunch`命令无法识别。 4. **make kernelcomponent -j3** 开始编译名为`kernelcomponent`的目标,使用3个并行任务(`-j3`)。这可能是特定于该平台的编译目标。 ## 可能遇到的问题及解决方法 ### 1. 目录不存在或路径错误 - **问题**:如果`/home/zhujianhua/work/AndroidU/sprd_vnd/bsp`目录不存在,`cd`命令会失败,整个命令链会终止(因为使用了`&&`,前一个命令失败则后续不执行)。 - **解决**:确保该目录存在,并且路径正确。可以使用`ls`命令检查目录是否存在。 ### 2. envsetup.sh 脚本不存在 - **问题**:在切换目录后,如果`build/envsetup.sh`文件不存在,`source`命令会失败。 - **解决**:确认该目录下存在`build`子目录,并且`envsetup.sh`位于其中。通常,在Android源代码树的根目录下会有这个文件。因此,请确认当前工作目录(`/home/zhujianhua/work/AndroidU/sprd_vnd/bsp`)是否是正确的Android源代码根目录(或包含`build`目录的目录)。 ### 3. lunch 目标无效 - **问题**:目标字符串`ums9230_6h10_Natv_k515 - userdebug - androidt`包含空格,这可能导致`lunch`命令无法识别。正确的目标格式通常不包含空格,而是用连字符连接各个部分。 - **解决**:检查目标名称的正确性。可能应为`ums9230_6h10_Natv_k515-userdebug-androidt`(去掉空格)。可以通过运行`lunch`命令然后按空格键列出所有可选目标,查看正确的目标名称。 ### 4. 编译目标 kernelcomponent 不存在 - **问题**:如果`kernelcomponent`不是一个有效的编译目标,`make`命令会失败。 - **解决**:确认该目标在当前的编译环境中存在。可以尝试先运行`make`命令查看所有目标,或者查阅项目文档。另外,有时目标名称可能有拼写错误,注意检查。 ### 5. 编译失败 - **问题**:编译过程中可能因为各种原因失败(如依赖缺失、代码错误、环境配置不正确等)。 - **解决**: - 检查错误日志,确定失败原因。 - 确保所有必要的依赖已经安装(如编译器、库文件等)。 - 尝试使用更少的并行任务(例如`-j1`)来避免并行编译中的问题。 - 清理编译环境(如运行`make clean`)然后重新编译。 ### 6. 环境变量未正确设置 - **问题**:在`source build/envsetup.sh`和`lunch`之后,环境变量(如`ANDROID_PRODUCT_OUT`等)可能没有正确设置,导致编译失败。 - **解决**:在运行`lunch`后,可以打印环境变量(如`echo $TARGET_PRODUCT`)来验证设置是否正确。 ### 7. 并行编译选项-j3的问题 - **问题**:使用`-j3`指定3个并行任务,但有时并行编译可能导致竞争条件或资源不足(内存不足等)。 - **解决**:根据机器配置调整并行任务数。通常建议设置为CPU核心数的1.5到2倍。如果编译失败,尝试减少并行任务数(如`-j1`)以排除并行引起的问题。 ## 建议的执行步骤 1. 首先,单独执行每个命令,检查每一步是否成功。 ```bash cd /home/zhujianhua/work/AndroidU/sprd_vnd/bsp source build/envsetup.sh lunch ums9230_6h10_Natv_k515-userdebug-androidt # 注意去掉空格 make kernelcomponent -j3 ``` 2. 如果`lunch`的目标格式有问题,请使用正确的目标字符串。 3. 如果编译失败,查看错误输出,并逐步排查。 ## 相关帮助命令 - 查看`lunch`的帮助:运行`lunch`后直接回车,会列出所有可选目标。 - 查看`make`的帮助:`make -h` 或 `make --help`,但注意在Android编译环境中,也可以使用`m -h`(在`envsetup.sh`之后可用)。 - 编译单个模块:`mmm <模块路径>` 或 `mm`(在模块目录下)可以在`envsetup.sh`之后使用。 希望这些信息能帮助你顺利执行命令! §§相关问题§§ 1. 如何验证Android编译环境的正确设置? 2. 在编译过程中遇到依赖错误应该如何解决? 3. 如何增加或减少并行编译任务数,以及如何确定最佳任务数? </think>我将针对您提供的命令序列,分析各个步骤的作用、可能遇到的问题及解决方案,并提供相关帮助信息。 ### 命令分解与作用 ```bash cd /home/zhujianhua/work/AndroidU/sprd_vnd/bsp && source build/envsetup.sh && lunch ums9230_6h10_Natv_k515-userdebug-androidt && make kernelcomponent -j3 ``` 1. **`cd .../bsp`** 切换到Android源码目录(展锐平台特定路径) 2. **`source build/envsetup.sh`** 初始化Android编译环境: - 添加`lunch`、`m`、`mm`等编译命令 - 设置环境变量(如`ANDROID_BUILD_PATHS`) - 注册产品配置信息[^1] 3. **`lunch ...`** 选择目标设备编译配置: - `ums9230_6h10_Natv_k515`:芯片平台型号 - `userdebug`:编译类型(可调试版本) - `androidt`:Android版本分支 4. **`make kernelcomponent -j3`** 编译内核组件: - `-j3`:使用3线程并行编译 ### 常见问题及解决方案 #### 1. 环境初始化失败(source命令) - **现象**:`envsetup.sh not found` - **原因**:路径错误或源码不完整 - **解决**: ```bash # 确认目录结构 ls build/envsetup.sh # 重新同步源码 repo sync -c -j4 ``` #### 2. lunch选择失败 - **现象**:`Invalid lunch combo` - **原因**:目标配置名称错误或未定义 - **解决**: ```bash # 查看可用配置列表 printconfig # 检查vendorsetup.sh是否注册 grep ums9230_6h10 vendor/*/vendorsetup.sh ``` #### 3. 内核编译错误 - **典型错误**: ```log Kernel configuration invalid: .config not found ``` - **解决步骤**: 1. 检查内核配置 ```bash cd kernel/sprd/ums9230_6h10 make ARCH=arm64 O=out ums9230_6h10_Natv_k515_defconfig ``` 2. 修复依赖缺失 ```bash sudo apt install flex bison libssl-dev ``` 3. 减少并行线程(内存不足时) ```bash make kernelcomponent -j1 # 单线程编译 ``` #### 4. 权限问题 - **现象**:`Permission denied` - **解决**: ```bash # 检查文件权限 ls -ld /home/zhujianhua/work # 递归修复所有权 sudo chown -R zhujianhua:zhujianhua AndroidU/ ``` #### 5. 编译终止(-j3问题) - **现象**:随机编译中止 - **原因**:并行任务过多导致资源竞争 - **优化方案**: ```bash # 根据CPU核心数调整-j参数 JOBS=$(($(nproc)/2)) make kernelcomponent -j$JOBS ``` ### 调试建议 1. **分步执行**: ```bash cd /home/zhujianhua/work/AndroidU/sprd_vnd/bsp source build/envsetup.sh lunch ums9230_6h10_Natv_k515-userdebug-androidt make kernelcomponent -j3 ``` 2. **日志记录**: ```bash make kernelcomponent -j3 2>&1 | tee build.log ``` 3. **环境验证**: ```bash # 检查关键变量 echo $TARGET_PRODUCT $TARGET_BUILD_VARIANT # 验证内核配置 make -C kernel/sprd/ums9230_6h10/ listconfigs ``` ### 关键文档参考 - 展锐编译手册:`bsp/vendor/sprd/docs/Kernel_Build_Guide.pdf` - Android官方编译指南:[Android Build System](https://source.android.com/docs/setup/build)[^2]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值