Volley와 Stetho로 네트워크 디버깅

Stetho는 2015년 페이스북에서 공개한 안드로이드 디버깅 도구다. 크롬 브라우저에 내장된 개발자 도구인 DevTools를 활용해 안드로이드 앱의 네트워크, 데이터베이스, 프리퍼런스, 레이아웃 등을 디버깅 할 수 있다. 더 자세한 기능 소개는 공식 페이지를 참조하자.

네트워크 라이브러리와 연계 동작하는 라이브러리들은 보통 Volley를 지원한다. 하지만, Stetho의 네트워크 디버깅 기능은 앱이 OkHttp나 안드로이드의 HttpUrlConnection를 써야 쓸 수 있다. 환경이 맞다면 좋겠지만, 이미 개발된 앱의 네트워크 라이브러리를 Stetho 쓰자고 바꾸기는 어렵다. 같은 고민인지, 아래처럼 Volly의 RequestQueue 객체 생성 시에 OkHttp 라이브러리의 특정 클래스 객체만 활용하는 우회법을 제안하는 글이 많다.

OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(new StethoInterceptor());
mRequestQueue = Volley.newRequestQueue(getApplicationContext(), new OkHttpStack(client));

물론 네트워크 라이브러리를 바꾸는 것에 비해 수정은 적지만, 쓰지 않아도 되는 라이브러리를 추가하는건 여전하다. 이 같은 고민을 한다면 포기하기 전에 여기를 살펴보자. Stetho의 UrlConnectionManager를 활용하는 기능이 포함된 StethoVolleyHurlStack 클래스를 제공하여, OkHttp를 사용하지 않고도 Stetho의 네트워크 디버깅을 사용하도록 도와준다.

RequestQueue queue = Volley.newRequestQueue(this, new StethoVolleyHurlStack());

2020년 1월 테스트로는 잘 되지만, 1년 넘게 commit이 없고 pull-request도 처리 안하는 것으로 미루어 보아 유지보수가 중단된 것 같다.

그 밖에

  • 데이터베이스, 프리퍼런스, 레이아웃 디버깅과 같은 다른 기능들은 위와 같은 수정 없이 Stetho 라이브러리 적용만으로 쓸 수 있다.

참고

인텔리제이에서 키스토어(Keystore) 위치 지정하기

일반적인 경우, 키스토어(Keystore)는 Android Studio나 Intelli J같은 IDE에서 관리를 해준다. 취미로 개발하는 경우에는 기본으로 내장된 키스토어를 사용하면 되고, 신규로 키스토어를 만드는 경우에도 마법사 기능을 통해 잘 지원한다.

그런데, 여러개의 앱을 같은 키스토어를 이용해 사인(signing)한 후에 자원(resource)를 공유한다던가, 기존에 만들어진 키스토어를 새로 셋팅된 IDE에 넣고 싶다면 어떻게해야할까? 키스토어를 지정해주어야한다.

인텔리제이 12를 기준으로 설명하면,

  • 실제로 앱을 마켓에 올리기 위해 만드는 경우에는 “File | Project Structure | Artifacts”에서 새 Artifact를 추가해 키스토어 위치를 지정해주면 된다.
  • 디버깅용 키스토어도 만들어서 사용하고 있다면 이는 “File | Project Struecture | Facets”에서 키스토어를 바꿀 Android 프로젝트를 선택한 후에 Compiler 탭에서 위치를 지정하면 된다.

참고 : http://stackoverflow.com/questions/5860399/using-custom-debug-keys-in-intellij-idea-10-community-ed

어떤 keystore로 sign되었는지 확인하는 방법

my.debug.keystore와 my.keystore 2개를 만들면 편하다는 글을 썼었다. 그럼, my.debug.keystore를 이용해 sign된 상태일 때만, Log가 출력되도록 하는 것은 어떨까?

이 때 내가 어떤 keystore를 이용해 sign되었는지 판단하는 방법이 필요하다. 이를 확인하는 함수는 간단하다. 다음과 같다.

private boolean isDebugMode() {
		if (0 != (getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE)) {
			return true;
		} else {
			return false;
		}
	}