본문 바로가기

개발 개발/Android

PDK JNI 로그 log 나오게 하기

android_bluetooth_HeadsetBase.cpp 파일에서 로그좀 볼려는데 죽어도 안나온다.

결국 실제 조건을 확인하기 위해서 풀컴파일후 해당파일 터치후 컴파일 옵션에 임시파일 보존 속성 추가후 다시 컴파일
mydroid/build/core/config.mk 에  --save-temps  추가

COMMON_GLOBAL_CFLAGS:= -DANDROID -fmessage-length=0 -W --save-temps -Wall -Wno-unused -Winit-self -Wpointer-arith


원래 파일의 하기 부분 체크시

        if (rc < 0) {
            if (errno == EBUSY) {
                LOGI("read() error %s (%d): repeating read()...", strerror(errno), errno);
                goto again;
            }
            *err = errno;
            LOGE("read() error %s (%d)", strerror(errno), errno);
            return NULL;
        }

    if (is_ascii(buf)) {
        SLOGI("BT AT Recv : [%s]",buf);
    } else {
        SLOGI("Ignoring invalid AT command: %s", buf);
        buf[0] = NULL;
    }

생성된 android_bluetooth_HeadsetBase.ii 확인시 warn 이상 부터 나오도록 조건이 걸려 있다. 아래와 같다

        if (rc < 0) {
            if ((*__errno()) == 16) {
                ({ if (((ANDROID_LOG_INFO == ANDROID_LOG_VERBOSE) && (1 == 0)) || ((ANDROID_LOG_INFO == ANDROID_LOG_DEBUG) && (1 == 0)) || ((ANDROID_LOG_INFO == ANDROID_LOG_INFO) && (1 == 0)) || (ANDROID_LOG_INFO == ANDROID_LOG_WARN) || (ANDROID_LOG_INFO == ANDROID_LOG_ERROR) || (ANDROID_LOG_INFO == ANDROID_LOG_FATAL)) (void)__android_log_print(ANDROID_LOG_INFO, "BT HSHFP CPP", "read() error %s (%d): repeating read()...", strerror((*__errno())), (*__errno())); });
                goto again;
            }
            *err = (*__errno());
            ({ if (((ANDROID_LOG_ERROR == ANDROID_LOG_VERBOSE) && (1 == 0)) || ((ANDROID_LOG_ERROR == ANDROID_LOG_DEBUG) && (1 == 0)) || ((ANDROID_LOG_ERROR == ANDROID_LOG_INFO) && (1 == 0)) || (ANDROID_LOG_ERROR == ANDROID_LOG_WARN) || (ANDROID_LOG_ERROR == ANDROID_LOG_ERROR) || (ANDROID_LOG_ERROR == ANDROID_LOG_FATAL)) (void)__android_log_print(ANDROID_LOG_ERROR, "BT HSHFP CPP", "read() error %s (%d)", strerror((*__errno())), (*__errno())); });
            return __null;
        }

    if (is_ascii(buf)) {
        ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, "BT HSHFP CPP", "BT AT Recv : [%s]",buf));
    } else {
        ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, "BT HSHFP CPP", "Ignoring invalid AT command: %s", buf));
        buf[0] = __null;
    }

이 레벨을 지정하는 (1 == 0)은 무엇일까? 찾아보자. 
mydroid/system/core/include/cutils/log.h 에 보면 레벨별로 LOG_NDEBUG, LOG_NDDEBUG, LOG_NIDEBUG 임을 알 수 있다.

#define LOG(priority, tag, ...) \

    LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)


#define LOG_PRI(priority, tag, ...)                                     \

    ({                                                                  \

       if (((priority == ANDROID_LOG_VERBOSE) && (LOG_NDEBUG == 0)) ||  \

           ((priority == ANDROID_LOG_DEBUG) && (LOG_NDDEBUG == 0))  ||  \

           ((priority == ANDROID_LOG_INFO) && (LOG_NIDEBUG == 0))   ||  \

            (priority == ANDROID_LOG_WARN)                          ||  \

            (priority == ANDROID_LOG_ERROR)                         ||  \

            (priority == ANDROID_LOG_FATAL))                            \

                (void)android_printLog(priority, tag, __VA_ARGS__);     \

    })


결론 :
mydroid/frameworks/base/core/jni/android_bluetooth_common.h 에보면 

#define LOG_NDEBUG 1 로 되어 있는것을 #define LOG_NDEBUG 0 으로 바꾸면 된다.


또는
코드 상단부에 하기 부분 추가

#define LOG_NDEBUG  0

#define LOG_NDDEBUG 0

#define LOG_NIDEBUG 0




ps. http://jusung.springnote.com/pages/4819403
 

WebCore에 테스트 중인 코드에서 드디어 로그를 볼 수 있게 되었네..

webcore/config.h를 해당 cpp파일에 include하게 되면은 LOG가 동작을 않한다.

이유는 config.h에 <wtf/assertions.h>를 포함하게 되는데 assertions에 미리 정의된 LOG 매크로가

<utils/Log.h>에서 정의해야할 LOG 매크로에 영향을 주어 실지로 android_log가 동작하는 것이 아니라 

assertions에 정의된 LOG가 동작하여 adb logcat에 아무런 정보가 출력되지 않는 것이다.


## 일반 적인 Android Native에서 로그 볼때 파일 상단에

 #define LOG_TAG "CustomLogTag" // 원하는 로그테그를 작성

 #define LOG_NDEBUG 0 // LOGV까지 보고 싶으면 값을 0을 주고 LOGI, LOGD, LOGW, LOGE만 보고 싶으면 1을 주던지 않쓰면 된다.

 #include <utils/Log.h>


## WebCore 하부에서 Android Native 로그를 볼때

 #include "config.h" // config.h 밑에다 아래 내용을 정의 해야 된다.


 #undef LOG // Assertions에 정의된 LOG를 undefine하고 밑에 utils/log.h에서 재정의 하게 한다.

 #define LOG_TAG "CustomLogTag"

 #define LOG_NDEBUG 0

 #include <utils/Log.h>