Limit der Methoden 64K pro Dex-Datei in Android

8

Ich sah mich mit dem Problem java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536 konfrontiert und entschied mich, einige Methoden aus einer Dex-Datei auszuschließen. Mein Gradel.build:

%Vor%

Ich denke, dass dieser Codeschnipsel falsch ist, weil es einen Fehler method ID not in [0, 0xffff]... gibt. Wie kann ich unnötige Teile des Google Play-Service ausschließen? Ich benutze nur Karten und GCM.

Aktualisiert.

Danke nochmal. Es ist wirklich nützlicher Code. Es gibt ein Skript, um die Anzahl der Methoden zu ermitteln (kann auch die Namen der vorhandenen Pakete sehen) Ссылка ( source ./dex.sh; dex-method-count-by-package test.apk )

Bevor Sie das Code-Snippet aus der Antwort von reVerse verwenden

%Vor%

Nachdem das Code-Schnipsel aus der Antwort von reVerse verwendet wurde, wurden die Pakete: Anzeigen, Spiele und usw. gelöscht.

    
Vladimir 01.09.2014, 14:22
quelle

1 Antwort

9

Aktualisierung - Google Play Services 6.5 (12-08-14)

Mit Version 6.5 hat Google die Google Play-Dienste endgültig entbündelt. Von nun an wird es möglich sein, die APIs selektiv in Ihre ausführbare Datei zu kompilieren.

Beispiel (nur AdMob und Android Wear APIs verwenden)

%Vor%

Für alle anderen einzelnen Google Play Services-APIs diese Seite auf d.android.com .

Hinweis: Die Verwendung von + wird normalerweise nicht empfohlen. Ab sofort wäre die aktuell korrekte Version 6.5.87 . Weitere Informationen finden Sie im offiziellen Blog-Post (klick) .

Vor einiger Zeit gab es einen Artikel auf Medium.com namens " [DEX] Sky ist die Grenze? Nein, 65K Methoden ist " (definitiv eine Lektüre wert), die eine Möglichkeit beschreibt strippen die Google Play Services mit einem Shell-Skript, das Sie hier (google-play-services-strip-script) finden .
Während dies eine Option ist, gibt es auch eine grddle-Aufgabe , die dies für Sie erledigt:

%Vor%

Hinweis: Dies wird aus der Task zum Abrufen ungenutzter Pakete in der Google Play Services-Bibliothek @GitHubGist <übernommen / a>

Der relevante Teil für dich ist, wo der Pfeil in task.create(...) ist. Dort müssen Sie angeben, welche Teile entfernt werden sollen. Also schreibe in deinem Fall einfach so etwas hinein:

%Vor%

Dies wird alles außer dem Maps- und GCM-Part entfernen.

Hinweis: Um es zu verwenden, kopieren Sie einfach den Inhalt der grddle-Aufgabe in die build.gradle -Datei Ihres App-Moduls.

    
reVerse 01.09.2014, 15:08
quelle

Tags und Links