Der Quellcode stimmt nicht mit dem Bytecode für View.java von Android überein

Aug 24 2020

Ich versuche, meine Android-App zu debuggen. Wenn der Debugger zur Datei View.java gelangt, wird die Meldung "Quellcode stimmt nicht mit dem Bytecode überein" angezeigt. Ich kann sehen, dass sich der Debugger im falschen Teil der Datei befindet. Weiß jemand, wie man das behebt?

Ich debugge auf einem Android 10 (API 29) Gerät. In den Android Studio-Einstellungen -> Aussehen und Verhalten -> Systemeinstellungen -> Android SDK habe ich sichergestellt, dass alles auf dem neuesten Stand ist. Ich habe auch mehrere Male bereinigt und neu erstellt, Caches entfernt, Android Studio und das Gerät neu gestartet, deinstalliert / neu installiert und Android Studio auf 4.0.1 aktualisiert. In den Moduleinstellungen beträgt die "Compil Sdk Version" 29 und die Target SDK Version und die Min SDK Version 29. Nichts hilft oder hat Auswirkungen. Viele dieser Schritte wurden in ähnlichen Beiträgen vorgeschlagen.

Die View.java-Datei, die geöffnet werden soll, befindet sich unter: ~ / Library / Android / sdk / sources / android-29 / android / view / View.java. Dies sollte die richtige Datei sein, aber der Debugger befindet sich im falschen Teil der Datei, während ich die Fehlermeldung erhalte.

Nehmen wir an, dass View.java meines Laptops für diese API-Ebene korrekt ist: Könnte auf meinem Telefon nicht standardmäßiger Code ausgeführt werden, und gibt es eine Möglichkeit, dies zu erkennen oder auszuschließen?

Antworten

curious_george Aug 24 2020 at 23:58

Ich glaube, ich habe herausgefunden, was passiert ist, und ich habe eine Lösung für dieses Problem, wenn es mit Android SDK-Dateien passiert. Erschreckenderweise wird die Android SDK-Plattform auf Revision 5 aktualisiert, aber das Quellpaket wird nicht aktualisiert. Es befindet sich noch in Revision 1! Warum dies passiert ist, kann ich nicht erklären: Eine vernünftige Person würde erwarten, dass beide synchron sind. Dieser Screenshot zeigt, dass der Quellcode nicht mit der von Android Studio heruntergeladenen Binärdatei übereinstimmt:

Die einzige Möglichkeit, dies zu umgehen, besteht darin, die benötigten Dateien manuell herunterzuladen und manuell in Ihrem SDK-Quellverzeichnis zu patchen. Es ist hässlich, es ist unnötig, aber wenn Sie wirklich eine bestimmte SDK-Datei durchgehen möchten, müssen Sie es tun.

Hier sind die Schritte, die ich befolgt habe:

  1. Finden Sie heraus, welchen Android-Build Sie haben. Gehen Sie auf Ihrem Gerät zu "Einstellungen" -> "Über das Telefon" -> "Android-Version" und notieren Sie sich den Wert für "Build-Nummer". Meins ist QQ3A.200805.001.
  2. Finden Sie auf dieser Seite das Tag heraus, das Ihrer Build-Nummer entspricht: https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds. Für meine Build-Nummer lautet das Tag: android-10.0.0_r41
  3. Suchen Sie die Datei, die Sie benötigen https://android.googlesource.com. Mit google.com fand ich es unter:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java
  4. Bestimmen Sie das Android-Repo, in dem sich Ihre Datei befindet. Wenn Sie sich die vorherige URL ansehen, kann ich daraus schließen, dass es sich um Folgendes handelt: https://android.googlesource.com/platform/frameworks/base/
  5. Schnapp dir das Repo mit deinem Tag. Oder greifen Sie online auf die neueste Version dieser einzelnen Datei dieses Tags zu, z.https://android.googlesource.com/platform/frameworks/base/+log/refs/tags/android-10.0.0_r41/core/java/android/view/View.java, Revision 18c0fbf.
    • Um die einzelne Datei herunterzuladen, fügen Sie der URL "? Format = text" hinzu, um die base64-codierte Version zu erhalten. Dann dekodieren Sie es: cat file | base64 --decode.
  6. Jetzt haben Sie die Datei. Wechseln Sie in Ihr SDK-Verzeichnis, das die fehlerhafte Datei enthält: cd ~ / Library / Android / sdk / sources / android-29 / android / view /
  7. Sichern Sie die alte Datei (cp -pr View.java View.java.orig), wenn Sie möchten (Sie können die SDK-Quelldateien jederzeit neu installieren, wenn Sie Probleme haben). Kopieren Sie Ihre neue Datei an denselben Speicherort.
  8. Jetzt verwendet Ihr Debugger die richtige Datei! Sie müssen dies für jede Datei tun, über die sich Ihr Debugger beschwert.

Ich hoffe, das hilft jemand anderem in der Zukunft. Ich habe viel Zeit damit verbracht, dies herauszufinden, und ich hoffe aufrichtig, dass jemand anderes diese Zeit nicht verschwenden muss. Google muss die Quellpakete mit den Release-Paketen konsistent halten. In allen früheren SDK-Versionen scheint keines der Quellpakete mit der neuesten Release-Version synchron zu sein. Möglicherweise besteht eine andere hässliche Möglichkeit zum Debuggen von SDK-Dateien darin, eine SDK-Release-Version der Version 1 zu verwenden, die dem Quellpaket der Version 1 entspricht.