https://code.google.com/p/android/issues/detail?id=20814
해결책으로는 Proguard를 사용하여 최적화를 수행하거나 dex를 여러개로 쪼개서 런타임에서 불러쓰는 방법이 있다고 한다.
우선 내 안드로이드 앱이 가지고 있는 메소드 개수를 추출해보자. 이를 위해선 dex format을 어셈블/디어셈블 할 수 있는 smali, baksmali가 필요하다. download에서 jar 파일들의 버전명을 삭제해줘야 스크립트 파일들이 제대로 동작한다.
https://code.google.com/p/smali/
dex.sh
#!/bin/bash function dex-method-count() { cat $1 | head -c 92 | tail -c 4 | hexdump -e '1/4 "%d\n"' } dir=$(mktemp -d -t dex) baksmali $1 -o $dir for pkg in `find $dir/* -type d`; do smali $pkg -o $pkg/classes.dex count=$(dex-method-count $pkg/classes.dex) name=$(echo ${pkg:(${#dir} + 1)} | tr '/' '.') echo -e "$count\t$name" done rm -rf $dir
MacOSX 에서는 기본적으로 JAVA_HOME과 PATH가 잡혀있지 않으므로 설정해주고 위의 쉘을 실행한다.
~/.bash_profile
export PATH=$PATH:. export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_07.jdk/Contents/Home
이제 쉘을 실행시키면 메소드 개수가 출력되는 것을 확인할 수 있다.
$ sudo ./dex.sh /My_workspace/android/MY_Sample/bin/MY_Sample.apk