tip6. 디버그 모드 구분하기
안드로이드에는 디버그 모드가 있다. 어플리케이션이 디버그가 가능한 상태인지 표시하는 플래그로 기본 값은 false이다. 보통 알려진 설정 방법은 AndroidManifest.xml 의 <application> 부분에 android:debuggable 값을 true/false로 설정하는 것이다.
| <application android:debuggable="true" ... > |
그런데 이 플래그는 구글 플레이 스토어에 apk를 올릴 때 필터링 대상이라 AndroidManifest.xml 안에 저 값을 그대로 두면 apk를 업로드할 수 없다. 또한 IDE에서는, 사용자가 임의로 설정하지 말고 디버그용으로 apk를 만들 때와 릴리즈용으로 apk를 만들 때 자동으로 설정이 되도록 놔두라고 가이드 한다. IDE에서 에뮬레이터나 단말로 Run/Debug를 실행하면 android:debuggable=”true”가 되고, 키스토어를 이용해 사인을 하면 android:debuggable=”false”가 되는 셈이다.
정리하면,
- 디버그 용 키스토어
바이너리 종류에 관계없이 로그 출력 - 릴리즈용 키스토어
바이너리 종류에 관계없이 로그 미출력
그럼 이제 디버그 모드를 사용해 보자. 어플리케이션의 디버그 모드를 확인하는 방법은 여기에 잘 정리되어 있는데, 나는 BuildConfig.DEBUG가 사용하기 편리하고 깔끔하기 때문에 애용한다. 이 디버그 모드는 로그를 출력할 때 유용한데, 상태에 따라 로그의 출력 여부를 조절하도록 Log 클래스를 감싸면 좋다. (참고로, Log 클래스는 final 이다.)
| public class LogUtil { public static void v( String tag, message ) { if ( BuildConfig.DEBUG ) Log.v( tag, message ); } } |
단, 주의 할 점은 Android SDK 17 이후 버전에서 제공하는 것으로 그 이하 버전을 사용하는 경우는 늘 로그가 출력될 수 있다. 그냥 안드로이드 스튜디오를 쓰자.
@Override
protected void onCreate(Bundle savedInstanceState) {
if (!BuildConfig.DEBUG) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
}
super.onCreate(savedInstanceState);
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(getFragmentContainerId());
if (fragment == null) {
try {
fragment = createFragment();
fm.beginTransaction()
.add(getFragmentContainerId(), fragment)
.commit();
} catch (IllegalStateException e) {
LogUtil.d(TAG, "onCreate() : " + e.getMessage());
}
}
}
}