java.lang.NoClassDefFoundError bei älteren Android SDK-Versionen

8

Ich habe eine Version meiner App auf Google Play veröffentlicht und bin heute Morgen mit einer Reihe unglücklicher Kunden aufgewacht. Die neueste Version der App integriert Unterstützung für einen Bluetooth Low Energy (BTLE) Herzfrequenzmesser.

Die App läuft unter Android 4.3 und 4.4 einwandfrei, stürzt jedoch bei 4.0, 4.1 und 4.2 mit folgendem Fehler ab:

%Vor%

Der Fehler tritt auf, wenn eine Absicht in einem einfachen Onclick ähnlich der folgenden erstellt wird ...

%Vor%

Nachdem ich ein 4.2-Tablet rausgehackt habe, um das Problem zu replizieren, bin ich zu dem Schluss gekommen, dass es mit dieser neuen Version der Bluetooth LE unterstützenden App zu tun hat, die in SDK 4.3 und höher aktiviert ist. Wenn ich alle Referenzen auf Bluetooth in MainActivity lösche, geht der Absturz bei 4.2 und früheren Geräten verloren.

Mein Verständnis beim Lesen der Dokumentation war, dass man eine App schreiben könnte, die die Bluetooth LE-Funktionalität enthält, und sie würde auf älteren Geräten laufen, solange man darauf achtet, BTLE-Code nicht zu verwenden / p> %Vor%

Daher enthält meine manifest.xml nicht Folgendes, da dies den Download auf ältere Geräte verhindern würde und ich möchte natürlich, wenn möglich, eine einzelne Codebasis beibehalten ...

%Vor%

Erste Frage, ist meine obige Annahme in der Lage, BTLE-Code in SDKs vor 4.3 korrekt zu machen? Wenn nicht, muss ich wirklich zwei Versionen der App erstellen ... eine für Leute, die 4.3 und später verwenden und eins für alle anderen?

Es gibt viele StackOverflow-Posts über java.lang.NoClassDefFoundError und ich glaube, ich habe die meisten relevanten gelesen. Viele schlagen vor, dass ich den Java-Buildpfad überprüfe, um sicherzustellen, dass Android Private Libraries und Android-Abhängigkeiten überprüft werden. Sie sind. Einige schlagen vor, den gen-Ordner vor den src-Ordner zu verschieben, aber das scheint keinen Unterschied zu machen.

Ich würde ein Bild des Eclipse-Java-Buildpfads posten, aber da dies mein erster Beitrag ist, habe ich nicht die 10 Reputationspunkte, die zum Einfügen eines Bildes benötigt werden. Hier ist ein weiterer Beitrag, dem ich folgte ... Android java.lang.NoClassDefFoundError

Also, zweite Frage, irgendwelche anderen Gedanken darüber, was mit dem Build-Pfad falsch sein könnte?

vielen Dank im Voraus.

Update ... irgendwie, indem ich eine Frage stelle, habe ich genug Punkte, um Bilder vom Java-Build-Pfad zu posten. Wie @Ashoke hervorhebt, denke ich, dass es etwas mit dem falschen Build-Pfad zu tun hat oder Bibliotheken unterstützt.

    
Dan Eiref 06.11.2014, 22:27
quelle

4 Antworten

2

Versuchen Sie, den gesamten Ble-Code in eine separate Klasse zu übertragen, die Sie nur dann auf einem Gerät mit den erforderlichen API-Levels ausführen. Ich denke, ohne diese könnten die Rückrufe zu Ihren Problemen führen.

    
Ifor 11.11.2014 16:07
quelle
1

Ich habe festgestellt, dass das statische Definieren des le-Callbacks in der Aktivität einen Fehler ergibt, aber das Einschließen in eine Funktion mit einer api-Prüfung wird nicht den gleichen Fehler erzeugen.

anstelle von:

%Vor%

Ich habe verwendet:

%Vor%     
TacoEater 10.02.2016 02:36
quelle
0

jetzt, dass Sie APIs verwenden, die nicht in älteren Android-Versionen verfügbar sein kann, stellen Sie sicher, dass Sie die App mit entsprechender Support-Bibliothek verpacken.

Zum Beispiel finden Sie in diesem android Probe BluetoothLeGattSample . Es verwendet unter support lib.

%Vor%

sehen Sie die Android-Dokumentation für Eclipse-Anweisungen für die Einrichtung der Support-Bibliothek

    
ashoke 06.11.2014 22:59
quelle
0

Dies ist normal, um diese Ausnahme auf & lt; 4.3-Geräten zu erhalten, weil BLE nicht existierte, so dass dein kompilierter Code die entsprechenden Klassen in dem OS nicht finden kann. Nichts ist falsch mit deinem Build-Pfad.

Die beste Lösung besteht in der Tat darin, Ihren BLE-Code in einer if -Klausel zu schützen, indem Sie zur Laufzeit auf BLE-Funktionalität testen. Sie sollten die OS-Version auch in dem if like:

filtern %Vor%

Sie sollten android:required="false" für diese Funktion deklarieren, das bedeutet, dass die Anwendung die Funktion bevorzugt verwendet, wenn sie auf dem Gerät vorhanden ist, aber dass sie gegebenenfalls ohne die angegebene Funktion funktioniert.

%Vor%     
Murphy 06.11.2014 22:56
quelle