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 안에 포함하여 빌드 하지않고 컴파일 시에 참조만 한다. 이를 통해 빌드하는 도중에 나는 위 에러는 피할 수 있을 것이다. 다만, 이는 모든 경우에 해당하는 것은 아니다.