Ich habe eine ziemlich große Android-App, die auf vielen Bibliotheksprojekten basiert. Der Android-Compiler hat eine Beschränkung von 65536 Methoden pro .dex-Datei und ich übertreffe diese Zahl.
Grundsätzlich gibt es zwei Pfade, die Sie auswählen können (zumindest die mir bekannten), wenn Sie das Methodenlimit erreichen.
1) Verkleinern Sie Ihren Code
2) Erstellen Sie mehrere Dex-Dateien ( siehe diesen Blog-Beitrag )
Ich schaute in beide und versuchte herauszufinden, warum meine Methodenanzahl so hoch war. Die Google Drive-API nimmt mit einer Guava-Abhängigkeit von über 12.000 den größten Anteil ein. Die Gesamtbibliotheken für Drive API v2 erreichen über 23.000!
Meine Frage ist wohl, was soll ich tun? Sollte ich die Google Drive-Integration als Funktion meiner App entfernen? Gibt es eine Möglichkeit, die API zu verkleinern (ja, ich verwende Proguard)? Sollte ich den Multiple-Dex-Weg gehen (was ziemlich schmerzhaft aussieht, insbesondere bei APIs von Drittanbietern)?
quelle
apk
Form herunterzuladen ? Ich persönlich würde gerne die Integration von Laufwerken sehenAntworten:
Es sieht so aus, als hätte Google endlich eine Problemumgehung / Korrektur implementiert, um das 65-KB-Methodenlimit für Dex-Dateien zu überschreiten.
Siehe: Erstellen von Apps mit über 65.000 Methoden
Sie sollten es dennoch vermeiden, das 65K-Methodenlimit zu erreichen, indem Sie proguard aktiv verwenden und Ihre Abhängigkeiten überprüfen.
quelle
Sie können dazu die Multidex-Unterstützungsbibliothek verwenden, um Multidex zu aktivieren
1) in Abhängigkeiten aufnehmen:
2) Aktivieren Sie es in Ihrer App:
3) Wenn Sie eine Anwendungsklasse für Ihre App haben, überschreiben Sie die Methode attachBaseContext wie folgt :
4) , wenn Sie nicht haben eine Anwendung Klasse für Ihre Anwendung dann registrieren android.support.multidex.MultiDexApplication wie Ihre Anwendung in Ihrer Manifest - Datei. so was:
und es sollte gut funktionieren!
quelle
Play Services
6.5+ hilft: http://android-developers.blogspot.com/2014/12/google-play-services-and-dex-method.html...
Das sind gute Nachrichten, für ein einfaches Spiel zum Beispiel brauchen Sie wahrscheinlich nur das
base
,games
und vielleichtdrive
.quelle
In Versionen von Google Play-Diensten vor Version 6.5 mussten Sie das gesamte API-Paket in Ihre App kompilieren. In einigen Fällen war es dadurch schwieriger, die Anzahl der Methoden in Ihrer App (einschließlich Framework-APIs, Bibliotheksmethoden und Ihres eigenen Codes) unter dem Grenzwert von 65.536 zu halten.
Ab Version 6.5 können Sie stattdessen selektiv Google Play-Dienst-APIs in Ihre App kompilieren. Ersetzen Sie beispielsweise die folgende Zeile in Ihrer build.gradle-Datei, um nur die APIs Google Fit und Android Wear einzuschließen:
mit diesen Zeilen:
Für weitere Informationen können Sie hier klicken
quelle
Verwenden Sie Proguard, um Ihre Apk zu erleichtern, da Methoden, die nicht verwendet werden, nicht in Ihrem endgültigen Build enthalten sind. Überprüfen Sie in Ihrer Proguard-Konfigurationsdatei, ob Sie Proguard mit Guave verwenden können (ich entschuldige mich, wenn Sie dies bereits haben, war es zum Zeitpunkt des Schreibens noch nicht bekannt):
Wenn Sie ActionbarSherlock verwenden, wird durch den Wechsel zur v7-Appcompat-Supportbibliothek außerdem die Anzahl Ihrer Methoden erheblich reduziert (basierend auf persönlichen Erfahrungen). Anweisungen befinden sich:
quelle
Warning: butterknife.internal.ButterKnifeProcessor: can't find superclass or interface javax.annotation.processing.AbstractProcessor
beim Laufen bekommen./gradlew :myapp:proguardDevDebug
Sie können Jar Jar Links verwenden , um große externe Bibliotheken wie Google Play Services (16K-Methoden!) Zu verkleinern.
In Ihrem Fall werden Sie nur rip alles von Google Play - Dienste jar Ausnahme
common
internal
unddrive
Unterpakete.quelle
Für Eclipse-Benutzer, die Gradle nicht verwenden, gibt es Tools, mit denen das Google Play Services-JAR aufgeschlüsselt und nur mit den gewünschten Teilen neu erstellt werden kann.
Ich benutze strip_play_services.sh von dextorer .
Es kann schwierig sein, genau zu wissen, welche Services eingeschlossen werden sollen, da einige interne Abhängigkeiten bestehen. Sie können jedoch klein anfangen und die Konfiguration erweitern, wenn sich herausstellt, dass die erforderlichen Elemente fehlen.
quelle
Ich denke, dass es auf lange Sicht der beste Weg wäre, Ihre App in mehreren Dex zu brechen.
quelle
Multi-dex Unterstützung
sein wirddie offizielle Lösung für dieses Problem. Siehe meine Antwort hier für die Details.quelle
Wenn Sie nicht Multidex verwenden, wird der Build-Prozess sehr langsam. Sie können Folgendes tun. Wie bereits erwähnt, verwenden Sie eine bestimmte Google Play Service-Bibliothek. In den meisten Fällen wird nur dies benötigt.
Hier finden Sie alle verfügbaren Pakete , die APIs selektiv in Ihre ausführbare Datei kompilieren
Wenn dies nicht ausreicht, können Sie das Gradle-Skript verwenden. Fügen Sie diesen Code in die Datei 'strip_play_services.gradle' ein.
}}
Wenden Sie dann dieses Skript wie folgt in Ihrem build.gradle an
quelle
Wenn Sie Google Play Services verwenden, wissen Sie möglicherweise, dass mehr als 20.000 Methoden hinzugefügt werden. Wie bereits erwähnt, bietet Android Studio die Möglichkeit, bestimmte Dienste modular einzubeziehen. Benutzer, die an Eclipse festhalten, müssen die Modularisierung jedoch selbst in die Hand nehmen :(
Glücklicherweise gibt es ein Shell-Skript , das die Arbeit ziemlich einfach macht. Extrahieren Sie einfach in das JAR-Verzeichnis von Google Play Services, bearbeiten Sie die mitgelieferte .conf-Datei nach Bedarf und führen Sie das Shell-Skript aus.
Ein Beispiel für seine Verwendung finden Sie hier .
quelle
Wie er sagte, ersetze ich
compile 'com.google.android.gms:play-services:9.0.0'
nur durch die Bibliotheken, die ich brauchte und es hat funktioniert.quelle