konifar
11/27/2014 - 2:15 PM

Androidでメソッド数が65536を超えた時の対処方法 ref: http://qiita.com/konifar/items/d98c78facbaae63badca

Androidでメソッド数が65536を超えた時の対処方法 ref: http://qiita.com/konifar/items/d98c78facbaae63badca

// taken from https://gist.github.com/dmarcato/d7c91b94214acd936e42

def toCamelCase(String string) {
    String result = ""
    string.findAll("[^\\W]+") { String word ->
        result += word.capitalize()
    }
    return result
}

afterEvaluate { project ->
    Configuration runtimeConfiguration = project.configurations.getByName('compile')
    ResolutionResult resolution = runtimeConfiguration.incoming.resolutionResult
    // Forces resolve of configuration
    ModuleVersionIdentifier module = resolution.getAllComponents().find {
        it.moduleVersion.name.equals("play-services")
    }.moduleVersion
    String prepareTaskName = "prepare${toCamelCase("${module.group} ${module.name} ${module.version}")}Library"
    Task prepareTask = project.tasks.findByName(prepareTaskName)
    File playServiceRootFolder = prepareTask.explodedDir
    // Add the stripping to the existing task that extracts the AAR containing the original classes.jar
    prepareTask.doLast {
        // First create a copy of the GMS classes.jar
        copy {
            from(file(new File(playServiceRootFolder, "classes.jar")))
            into(file(playServiceRootFolder))
            rename { fileName ->
                fileName = "classes_orig.jar"
            }
        }
        // Then create a new .jar file containing everything from the first one except the stripped packages
        tasks.create(name: "stripPlayServices" + module.version, type: Jar) {
            destinationDir = playServiceRootFolder
            archiveName = "classes.jar"
            from(zipTree(new File(playServiceRootFolder, "classes_orig.jar"))) {
                exclude "com/google/android/gms/actions/**"
                exclude "com/google/android/gms/appindexing/**"
                exclude "com/google/android/gms/appstate/**"
                exclude "com/google/android/gms/analytics/**"
                exclude "com/google/android/gms/auth/**"
                exclude "com/google/android/gms/cast/**"
                exclude "com/google/android/gms/drive/**"
                exclude "com/google/android/gms/fitness/**"
                exclude "com/google/android/gms/games/**"
                exclude "com/google/android/gms/identity/**"
                exclude "com/google/android/gms/panorama/**"
                exclude "com/google/android/gms/plus/**"
                exclude "com/google/android/gms/security/**"
                exclude "com/google/android/gms/tagmanager/**"
                exclude "com/google/android/gms/wallet/**"
                exclude "com/google/android/gms/wearable/**"
//                exclude "com/google/ads/**"
//                exclude "com/google/android/gms/ads/**"
//                exclude "com/google/android/gms/gcm/**"
//                exclude "com/google/android/gms/location/**"
//                exclude "com/google/android/gms/maps/**"
            }
        }.execute()
        delete file(new File(playServiceRootFolder, "classes_orig.jar"))
    }
}
-dontwarn com.google.android.gms.**
Read in 60366 method IDs.
<root>: 60366
    : 8
    android: 10815
        accessibilityservice: 6
        accounts: 8
        animation: 2
        app: 351
        bluetooth: 2
        content: 303

...(略)...

    com: 39448

...(略)...

        google: 18513
            ads: 165
                mediation: 134
                    admob: 24
                    customevent: 40
                    jsadapter: 38

$ git clone https://github.com/mihaip/dex-method-counts.git
$ ./gradlew assemble # ビルド
$ ./dex-method-counts path/to/app.apk # or .zip or .dex or directory
pkg: /data/local/tmp/com.konifar
Failure [INSTALL_FAILED_DEXOPT]
java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536
com.android.dex.DexException: Cannot merge new index 65576 into a non-jumbo instruction!
apply from: 'strip_play_services.gradle'