어떤 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;
		}
	}

 

 

debug용 keystore 만들기

Android는 keystore를 이용해 개발자 자신의 앱을 signing 한다. 그런데, 이미 1.0을 release했는데 업데이트가 잘 되는지 궁금 할때 처럼, 기존 자신의 app을 지우지 않은 채 설치(정확히는 update)를 하며 테스트를 해야할 때가 있다. 이때, 매번 export 메뉴를 이용해 내 keystore를 지정, signing을 하는 번거로운 작업을 반복 해야할까?

이 때는, debug용 keystore를 추가로 만들면 된다. Eclipse ADT를 이용해 개발할 때에는 기본적으로 범용 debug.keystore가 들어있다. 이 keystore를 대신할 keystore를 만드는 것이다. 방법은 간단하다. release keystore를 이용해 나만의 debug용 keystore를 만든 후 “Preference > Android > Build > Custom debug keystore”에서 만든 debug용 keystore로 바꿔주면 된다. 이렇게 하면 매번 export하지 않고 “Run As > Android Application”을 통해 app을 계속 설치할 때 INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES 에러를 안 볼 수 있다.

명령어는 다음과 같다.

keytool -importkeystore -v -srckeystore [릴리즈용 키스토어 파일이름] -destkeystore [디버그용 키스토어 파일이름] -srcstorepass [릴리즈용 키스토어 비밀번호] -deststorepass android -srcalias [alias 이름] -destalias androiddebugkey -srckeypass [alias 비밀번호] -destkeypass android

예제는 다음과 같다.

keytool -importkeystore -v -srckeystore my.keystore -destkeystore my.debug.keystore -srcstorepass mystorepassword -deststorepass android -srcalias myAlias -destalias androiddebugkey -srckeypass myaliaspassword -destkeypass android

아니, 왜 비번이 “android”인가? 위에서 언급한 IDE 안의 keystore는 자동으로 생성된다. 그리고 이 keystore를 이용해 signing할 때마다 비밀번호를 입력하는 번거로운 작업이 필요하다. 이를 IDE가 대신 해주는데, 비번을 고정해서 사용하고 있는 거다. “android”로, 그래서 그에 맞추어 비번을 바꿔줘야 IDE를 통한 빌드를 사용할 수 있다.

그럼 debug용 키와 release용 키는 어디가 같고 어디가 다른걸까? 간단히 말하면 핑거프린트(fingerprint)가 같다. 그리고 위에서 수정한대로 비밀번호와 알리아스(alias)가 다르다. fingerprint가 뭔지 궁금하다면 다른 글을 참조하자.

참, keytool은 안드로이드 SDK가 아니라 JDK(Java Development Kit) 안에 들어있다.keystore가 안드로이드에서 유용하게 쓰이지만, 원래는 Java에서 지원하는 기능이라 그렇다.

 

Android API 18에서 startForeground()

Android API 17까지는 서비스가 시스템에 의해 강제종료 되는 것을 막기 위해서 서비스 시작 부분에 startForeground()를 호출했다. 이번 Android API 18에서도 여전히 사용할 수 있지만 notification bar에 안내가 강제로 뜬다.

시스템 앱(/system/app, /system/framework, /vender 폴더에 있는 앱)의 경우에는 기존과 같이 notification bar에 안내가 뜨지 않고 죽지않는 서비스를 만드는 방법이 있다. Androidmanifest.xml 파일의 <Application 선언 부분에 android:persistent=”true” 를 선언하는 것이다. 시스템 앱의 경우, 저 파라미터를 넣어주면 시스템에 의해 강제 종료 되지 않는다.

하지만, 다운로드 받은 앱은 조용히 안죽는 서비스를 만드는 방법이 없다. 원래 startForeground()함수를 이용하면 notification bar에 안내가 되어야 하는데 이전까지는 버그(추측이지만)로 인해 뜨지 않는 것이었고, 18부터는 title과 content를 넣지 않으면 기본 정보를 이용해서라도 notification bar에 현재 포그라운드로 실행되고 있는 서비스 정보가 노출되도록 수정되었다.

Android AVD의 proxy 설정 방법

방법은 2가지다.

하나는 에뮬레이터를 실행할 때, 다른 하나는 AVD가 실행된 후에다. 아래에 두가지 방법을 소개한다.
1.

emulator -avd [avd name] -http-proxy http://[proxy-server-ip]:[port]

2.

  1. Menu
  2. Settings
  3. Wireless & Networks
  4. Mobile Networks
  5. Access Point Names
  6. “Telkila Internet” 클릭
  7. “proxy”와 “port”를 입력
  8. (필요하다면) “username”, “password”도 입력

이런 데이터는 모두 Android Developer 사이트에 있다는 사실도 있지말자. 여기를 참조하자.

그 밖에 다른 proxy 설정 방법을 찾고 있다면, Stackoverflow에 올라온 다른 답변을 참고하자.

참조

맥미니 2009 early + windows 7 사운드 문제

맥미니 2009 early의 사운드 카드는 지금은 (아마도) 없어진 SigmaTel 의 chip을 사용한다. 이 chip이 Windows 7에서 Realtek의 사운드 카드로 인식되는데, 올바른 드라이버를 찾을 수도 없다. 이곳저곳 뒤지다 보니 결국 해결책은 Apple 사이트에 있었다는.

Mac Mini 2009 early 모델을 지원하는 BootCamp를 설치하면 알아서 잡아준다. 링크는 http://support.apple.com/kb/DL1630 이다.

그 밖에

  • Windows 10 깔면 문제가 발생하지 않는다.