2017-09-04 3 views
0

Dies scheint ein etwas neues Problem zu sein, und ich bin ehrlich gesagt nicht sicher, welches Problem das eigentliche Problem ist. Letzte Woche, nach der Aktualisierung von VS2017 und Android Support Libraries, habe ich den Fehler "java.exe wurde mit Code 2 beendet" erhalten. Nach der Suche schien es der Konsens zu sein, MultiDex zu aktivieren. Also habe ich das gemacht, und es funktionierte auf neueren Handys gut. Aber als ich versuchte, auf einem KitKat-Telefon zu kompilieren, habe ich angefangen, Klassenausnahmen zu verpassen (aber nur, wenn ich mich mit Android Monitor angemeldet habe, keine Ausnahmen in VS).Xamarin.Android MultiDex funktioniert nicht auf <21 Geräten

Ich folgte this link in Bezug auf benutzerdefinierte Anwendungsklassen. Ich verwende die richtige Bat-Datei und die richtige benutzerdefinierte Klasse. Alles sieht immer noch gut aus 21+, aber die alten Geräte melden immer noch, dass mono.MonoPackageManager fehlt. Wenn ich auf die multidex.keep in meinem Debug-Ordner erstellt sehen, ist mono/MonoPackageManager.class definitiv in dieser Datei. Also habe ich wirklich keine Ahnung.

Ich habe eine APK generiert, um sie mit classyshark zu inspizieren. Ich habe dort ein paar interessante Dinge gefunden. Meine Gesamtanzahl an Methoden liegt bei 30K. Warum wird MultiDex sogar benötigt, wenn das Limit 65K beträgt? Und außerdem habe ich bemerkt, dass mono/MonoPackageManager in classes2.dex ist, obwohl es in meiner multidex.keep Datei ist.

Fehle ich etwas offensichtlich, oder gibt es einige große Bugs in Xamarin.Android in letzter Zeit?

EDIT: Fortschritt Art der gemacht? Ich ignorierte die Tatsache, dass mein Projekt nicht einmal multidex verwenden sollte, und bemerkte, dass die multidex.keep-Datei, die generiert wurde, nur eine einzige Zeile ohne Leerzeichen oder irgendetwas war. Wenn ich diese Datei änderte, um jede Klasse in eine neue Zeile zu setzen, dann fügte ich diese Datei mit der Build-Aktion MainDexMainDexList hinzu, alles funktioniert einwandfrei. Ich musste die Klassen, über die es sich zuvor beschwerte, nicht erneut hinzufügen. Ich habe mehrere Versionen von Android-Build-Tools (speziell 25.0.2 und 26.0.1) mit dem gleichen Ergebnis ausprobiert. Ich finde es sehr seltsam, dass das Hinzufügen neuer Zeilen das Problem behebt, aber die generierte Datei hat keine neuen Zeilen.

+1

Siehe https://bugzilla.xamarin.com/show_bug.cgi?id=59036 für die Regression von Zeilenumbrüchen. Unter https://bugzilla.xamarin.com/show_bug.cgi?id=55117 erfahren Sie, warum 30k nicht in der Nähe von 65k liegt. (Proguard wird standardmäßig nicht in Xamarin verwendet) –

Antwort

1

hatte ich genau das gleiche Problem und es gelöst durch eine benutzerdefinierte multidex.keep Datei in meinem Projekt Stammordner Erstellen und Hinzufügen folgendes vor:

mono/MonoPackageManager.class 
mono/MonoRuntimeProvider.class 
mono/MonoPackageManager_Resources.class 
mono/android/app/NotifyTimeZoneChanges.class 
mono/android/app/ApplicationRegistration.class 

Dies ist zusätzlich zu einem meiner eigentlichen Anwendungsklassen es beschwerte sich, während der Laufzeit nicht zu finden. Dies löste meine < 21 Probleme (speziell für KitKat (19)).

Das Build-System erstellt immer noch eine multidex.keep-Datei, aber das ist zusätzlich zu meiner benutzerdefinierten, so scheint es für mich zu arbeiten.

Verwandte Themen