티스토리 뷰

안드로이드

log 관리하기

아카이sun 2016.09.28 23:30

우리는 흔히 디버깅을 위해서 Log를 쓰곤 합니다.

Log는 디버깅을 하는데에 있어서 치유제가 되지만 때론 독이되기도 합니다.

로그를 비활성화 시키지 않으면 배포된 어플리케이션에서도 다양한 Log를 통하여 뜻하지 않은 정보를 유출시킬 

수 있습니다.

그리고 필자가 이제까지 로그설정에 대해 심각한 오류를 가지고 있었고 바로잡았습니다.

보통 우리는 gradle에 각종 설정값들을 입력합니다.


buildTypes {
release {

debuggable false
}
debug {

debuggable true
}
}


buildTypes에 realese와 debug 모드로 나누어 사용하는 모습입니다.


필자는 debuggable이 디버그의 활성화 유무를 설정하는 것이라는 오해를 하였습니다.

실제 debuggable의 기능은 logcat창에서 해당 어플리케이션의 활성화 여부를 설정합니다. 

즉, 어플리케이션을 선택하여 해당 어플리케이션의 로그만 볼 수 있도록 필터하는 것이죠. 

저 부분을 설정한다면 해당 어플리케이션의 선택창은 비활성화가 되며 로그는 안드로이드 기기에서 뱉어내는 수많

은 로그들사이에 뭍히기만 할 뿐 여전히 로그는 작동합니다.


그럼 어떻게, 편리하게 로그 활성화 여부를 제어할까?

디버그모드일때는 로그를 활성화시키고 릴리즈모드일 때는 로그를 비활성화 시켜야 합니다.



다양한 방법이 있습니다..


1. manifests의 application에 android:debuggable="false"를 주기.


해당 기능을 명시하면 avoid hardcoding the debug mode라면서 빨간색 줄이 그어집니다. 해당사항은 구글링해보

니 lint에러 설정을 수정하면 된다고 하지만 뭔가 꺼림직합니다.


2. proguard에서 설정


참고글 - http://stackoverflow.com/questions/13218772/removing-log-call-using-proguard

프로가드에서 설정하면 된다고 합니다만. 필자는 간혹 디버그모드에서도 프로가드 테스트를 하기 때문에 이 방법

은 사용하지 않았습니다.


3. ApplicationInfo를 이용하여 Custom Class를만들어 사용


박상권님의 블로그참조 

http://gun0912.tistory.com/12



4. gradle을 이용하여 Custom Class를 만들어 사용


이 방법은 상권님의 방장으로 계시는 안드로이드 Q&A및 팁에서 닉네임 @@님이 공유해주신 내용에서 조금 변형한 방법입니다. 자료 공유해주신 @@님 감사합니다.


release {
debuggable false
buildConfigField "boolean", "DEBUG_MODE", "false"
}
debug {
debuggable false
buildConfigField "boolean", "DEBUG_MODE", "false"
}

@@님은 resValue를 이용하셨지만 저는 좀 더 편하게 사용하고 싶었습니다. context를 넘긴다던가의 행위가 없이 말이죠.

따라서 위처럼 buildConfigField라는것을 이용했습니다. 

그리고 아래와 같이 custom class를 구현했습니다.


public class Logger {

public static void v(String tag, String msg){
if(BuildConfig.DEBUG_MODE){
Log.v(tag, msg);
}
}

public static void d(String tag, String msg){
if(BuildConfig.DEBUG_MODE){
Log.d(tag, msg);
}
}

public static void i(String tag, String msg){
if(BuildConfig.DEBUG_MODE){
Log.i(tag, msg);
}
}

public static void w(String tag, String msg){
if(BuildConfig.DEBUG_MODE){
Log.w(tag, msg);
}
}

public static void e(String tag, String msg){
if(BuildConfig.DEBUG_MODE){
Log.e(tag, msg);
}
}
}

buildConfigField을 이용하면 BuildConfig에 자동으로 해당자료형과 key, value를 생성시켜줍니다.


위의 예제는 기존의 BuildConfig.DEBUG를 써도 되지만 상권님의 블로그, 그리고 다수의 구글링을 통해 간헐적으로 로그가 찍히는 버그가 있다는 것을 보았습니다. 따라서 gradle에서 직접적으로 제어하는 필요성을 느껴 작성하게 되었습니다.






댓글
  • 프로필사진 김준석 좋은정보 얻어가요 2016.10.30 22:42 신고
  • 프로필사진 어렵네요 좋은 정보 감사합니다. 질문이 있는데, 4번에서

    release {
    debuggable false
    buildConfigField "boolean", "DEBUG_MODE", "false"
    }
    debug {
    debuggable false
    buildConfigField "boolean", "DEBUG_MODE", "false"
    }

    여기에서 debug 안에는 false -> true로 변경시켜줘야하는거 아닌가요?? 그래야 디버그 모드에서만 작동하는게 아닌가요??
    짧은 식견으로 질문 남깁니다 ㅠㅠ
    2018.03.23 11:14 신고
  • 프로필사진 아카이sun 네 맞습니다. 그리고 저렇게 선언하지 않아도 config값에는 이미 debug인지아닌지 정보가 포함되어 있습니다. 2018.03.23 12:05 신고
댓글쓰기 폼