Limite dei methods 64K per un file dex in Android

Ho affrontato questo problema java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536 e ho deciso di escludere alcuni methods da un file dex. Il mio gradle.build:

 compile ('com.google.android.gms:play-services:+') { exclude group: "com.google.android.gms.analytics" exclude group: "com.google.android.gms.games" exclude group: "com.google.android.gms.plus" exclude group: "com.google.android.gms.drive" exclude group: "com.google.android.gms.ads" } 

Penso che questo frammento di codice non sia corretto, perché esiste un method ID not in [0, 0xffff]... errore method ID not in [0, 0xffff]... Come posso escludere parti non necessarie di Google Play Service? Io uso solo mappe e GCM.

  • Connettere mySQL con Android
  • come hide / hide la list delle barre delle azioni su android 3?
  • android LocationManager.requestLocationUpdates con minTime> 0 non funziona come previsto
  • Come eseguire una riprova quando il download non riesce in AsyncTask utilizzando AlarmManager
  • L'aggiornamento di una notifica rimuove lo stato di primo piano di un servizio?
  • Dialogo con background trasparente in Android
  • Aggiornato.

    Grazie reVerse. È un codice davvero utile. C'è uno script per get il count dei methods (puoi anche vedere i nomi dei pacchetti esistenti) https://gist.github.com/JakeWharton/6002797 ( source ./dex.sh; dex-method-count-by-package test.apk )

    Prima di utilizzare lo snippet di codice dalla risposta di reVerse

     Count of methods / Package ... 22484 com.google.android.gms 2 com.google.android.gms.actions 578 com.google.android.gms.ads 152 com.google.android.gms.ads.doubleclick 25 com.google.android.gms.ads.identifier 86 com.google.android.gms.ads.internal 86 com.google.android.gms.ads.internal.rawhtmlad 86 com.google.android.gms.ads.internal.rawhtmlad.client 88 com.google.android.gms.ads.mediation 4 com.google.android.gms.ads.mediation.admob 73 com.google.android.gms.ads.mediation.customevent 26 com.google.android.gms.ads.purchase 118 com.google.android.gms.ads.search ... 858 com.google.android.gms.games.internal.api 43 com.google.android.gms.games.internal.constants 8 com.google.android.gms.games.internal.data 31 com.google.android.gms.games.internal.events 9 com.google.android.gms.games.internal.experience 215 com.google.android.gms.games.internal.game 56 com.google.android.gms.games.internal.multiplayer 23 com.google.android.gms.games.internal.notification 80 com.google.android.gms.games.internal.player 86 com.google.android.gms.games.internal.request ... 

    Dopo aver usato lo snippet di codice dalla risposta di reVerse, i pacchetti: gli annunci, i giochi e le altre voci sono state eliminate.

  • Imansible istanzia l'applicazione com.android.tools.fd.runtime.BootstrapApplication? Android
  • Android, Intent.FLAG_ACTIVITY_CLEAR_TOP sembra non funziona?
  • Nessun spazio rimasto sull'emulatore Android
  • Modifica della voce predefinita del text da parlare di Android
  • Come recuperare le informazioni sui dispositivi Bluetooth con il dispositivo di selezione Bluetooth di Android?
  • Distriggers disabilitativamente la modalità di risparmio energetico app su Samsung
  • One Solution collect form web for “Limite dei methods 64K per un file dex in Android”

    Aggiornamento – Google Play Services 6.5 (12-08-14)

    Con la versione 6.5 Google ha infine separato i servizi Google Play. Quindi da ora in poi sarà ansible compilare selettivamente le API nel tuo eseguibile.

    Esempio (solo utilizzando API AdMob e Android Wear)

     compile 'com.google.android.gms:play-services-wearable:6.5.+' compile 'com.google.android.gms:play-services-ads:6.5.+' 

    Per tutte le altre singole API di Google Play Services, controlla questa pagina su d.android.com .

    Nota: l' utilizzo del + è generalmente scoraggiato. Da ora la versione corretta attuale sarebbe 6.5.87 . Per ulteriori informazioni, vedere il Blog-Post ufficiale (clicca) .


    Qualche tempo fa c'è stato un articolo su Medium.com chiamato "il limite di [Sky] DEX" No, i methods 65K sono " (vale sicuramente una lettura), che descrive un modo per eliminare i servizi di Google Play con uno script shell che potete trovare qui (google-play-services-strip-script) .
    Mentre questa è un'opzione, c'è anche un task di gradel che fa per voi:

     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" File playServiceRootFolder = project.tasks.find { it.name.equals(prepareTaskName) }.explodedDir Task stripPlayServices = project.tasks.create(name: 'stripPlayServices', group: "Strip") { inputs.files new File(playServiceRootFolder, "classs.jar") outputs.dir playServiceRootFolder description 'Strip useless packages from Google Play Services library to avoid reaching dex limit' doLast { copy { from(file(new File(playServiceRootFolder, "classs.jar"))) into(file(playServiceRootFolder)) rename { fileName -> fileName = "classs_orig.jar" } } tasks.create(name: "stripPlayServices" + module.version, type: Jar) { destinationDir = playServiceRootFolder archiveName = "classs.jar" from(zipTree(new File(playServiceRootFolder, "classs_orig.jar"))) { -----> // Specify what should be removed } }.execute() delete { delete (file(new File(playServiceRootFolder, "classs_orig.jar"))) } } } project.tasks.findAll { it.name.startsWith('prepare') && it.name.endsWith('Dependencies') }.each { Task task -> task.dependsOn stripPlayServices } } 

    Nota: questo viene eseguito dall'attività di Gradle per eliminare i pacchetti non utilizzati nella libreria di Google Play Services @GitHubGist

    La parte rilevante per te è where la freccia è nel task.create(...) . Qui è necessario specificare quali parti vanno rimosse. Quindi nel tuo caso scrivi qualcosa in questo modo:

     exclude "com/google/ads/**" exclude "com/google/android/gms/analytics/**" exclude "com/google/android/gms/games/**" exclude "com/google/android/gms/panorama/**" exclude "com/google/android/gms/plus/**" exclude "com/google/android/gms/drive/**" exclude "com/google/android/gms/ads/**" exclude "com/google/android/gms/wallet/**" exclude "com/google/android/gms/wearable/**" 

    Ciò rimuove tutto tranne la parte di Maps e GCM.

    Nota: Per usarla, basta copiare il contenuto della task gradle nella parte inferiore del file build.gradle del module app.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.