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에 올라온 다른 답변을 참고하자.

참조

android library안의 component 선언은 어디에

결론부터 이야기하면 android app 에서 사용되는 library(정확히는 android library)에 있는 모든 component는 이 library를 사용하는 app의 AndroidManifest.xml 파일에 모두 선언해야 한다.

이에 대해서는 developers.android.com의 AndroidManifest.xml 부분에 있으며 그 내용은 다음과 같다.

In the manifest file of the application project, you must add declarations of all components that the application will use that are imported from a library project. For example, you must declare any <service><receiver>,<provider>, and so on, as well as <permission><uses-library>, and similar elements.

이에 대한 질문과 답은 StackOverflow에 있으니, 또한 참고하면 좋을 것 같다.

trouble writing output: Too many methods

dependencies

안드로이드 프로젝트를 빌드할 때 메소드 갯수가 많은 경우 아래와 같은 에러를 내며 빌드가 되지 않는 경우가 있다.

Android Dex: [IAP] trouble writing output: Too many methods: 77667; max is 65536. By package:
Android Dex: [IAP] 26 android
Android Dex: [IAP] 83 android.accessibilityservice
Android Dex: [IAP] 661 android.accounts
....

일단 에러의 원인은 Dalvik에서 실행하기 위해서는 앱이 65536 개를 초과하는 메소드를 가져서는 안되기 때문이다. 보통은 만날 일이 없는 에러일테다. 하지만, 에러가 났다면 어떻게 해야할까? 해결책은 링크를 참조하면 된다. 간단히 요약하면 리팩토링을 통해 메소드 갯수를 줄이라는 것이다.

그런데, 제공받은 라이브러리 때문에 나는 경우라면? 임의로 수정할 수도 없는 노릇이다. 다만, 안드로이드 단말에서 런타임시에 제공되는 (일명) 시스템 라이브러리라면, 라이브러리를 참조하는 scope를 바꾸어 빌드를 하지 않도록 설정 해 위 에러를 이를 피해갈 수 있다. 먼저, 인텔리제이의 도움말 – Dependency 탭의 Scope항목을 살펴보자.

  • Compile : The dependency is included in the classpath for your sources and test sources at the compilation and run phases.
  • Test : The dependency is included in the classpath only for your test sources at the compilation and run phases.
  • Runtime : The dependency is included in the classpath for your sources and test sources but only at the run phase.
  • Provided : For your sources, the dependency is included in the classpath only at the compilation phase. This is useful when there is a container (e.g. a web container of an application server) that provides the corresponding dependency at runtime.

위에 써 있듯이 스코프를 Provided로 하면 런타임시에 컨테이너에서 제공한다고 생각하여 apk 안에 포함하여 빌드 하지않고 컴파일 시에 참조만 한다. 이를 통해 빌드하는 도중에 나는 위 에러는 피할 수 있을 것이다. 다만, 이는 모든 경우에 해당하는 것은 아니다.