Il codice sorgente non corrisponde al bytecode per View.java di Android
Sto tentando di eseguire il debug della mia app Android. Quando il debugger arriva al file View.java, ricevo il messaggio "Il codice sorgente non corrisponde al bytecode". Vedo che il debugger si trova nella parte sbagliata del file. Qualcuno sa come risolvere questo problema?
Sto eseguendo il debug su un dispositivo Android 10 (API 29). Nelle preferenze di Android Studio -> Aspetto e comportamento -> Impostazioni di sistema -> Android SDK, mi sono assicurato che tutto sia aggiornato. Ho anche pulito e ricostruito più volte, rimosso cache, riavviato Android Studio e il dispositivo, disinstallato / reinstallato, aggiornato Android Studio a 4.0.1. Nelle impostazioni del modulo, "Compile SDK Version" è 29, e Target SDK Version e Min SDK Version su 29. Niente aiuta o ha alcun effetto. Molti di questi passaggi sono stati suggeriti in post simili.
Il file View.java che tenta di aprire si trova in: ~ / Library / Android / sdk / sources / android-29 / android / view / View.java. Questo dovrebbe essere il file corretto, ma il debugger si trova nella parte sbagliata del file mentre ricevo il messaggio di errore.
Indossando il mio cappello nero, supponiamo che View.java del mio laptop sia corretto per quel livello API: il mio telefono potrebbe eseguire codice non standard ed esiste un modo per rilevarlo o escluderlo?
Risposte
Penso di aver capito cosa stava succedendo e ho una soluzione per questo problema quando si verifica con i file SDK di Android. Spaventosamente, la piattaforma Android SDK viene aggiornata alla revisione 5, ma il pacchetto sorgente non viene aggiornato. È ancora in revisione 1! Perché ciò sia accaduto, non posso spiegarlo: una persona ragionevole si aspetterebbe che entrambi siano sincronizzati. Questa schermata mostra che il codice sorgente non corrisponde al binario scaricato da Android Studio:

L'unico modo per aggirare questo è scaricare manualmente i file necessari e correggerli manualmente nella directory di origine dell'SDK. È brutto, non è necessario, ma se vuoi davvero passare attraverso un file SDK specifico devi farlo.
Ecco i passaggi che ho seguito:
- Scopri quale build Android hai. Sul tuo dispositivo, vai su "Impostazioni" -> "Informazioni sul telefono" -> "Versione Android" e annota il valore "Numero build". Il mio è QQ3A.200805.001.
- Trova il tag corrispondente al tuo numero di build utilizzando questa pagina: https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds. Per il mio numero di build, il tag è: android-10.0.0_r41
- Trova il file che ti serve https://android.googlesource.com. Utilizzando google.com, l'ho trovato su:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java
- Determina il repository Android in cui risiede il tuo file. Guardando l'URL precedente, posso dedurre che è a: https://android.googlesource.com/platform/frameworks/base/
- Prendi quel repo usando il tuo tag. Oppure prendi in linea la revisione più recente di quel tag di quel singolo file, ad esempio:https://android.googlesource.com/platform/frameworks/base/+log/refs/tags/android-10.0.0_r41/core/java/android/view/View.java, revisione 18c0fbf.
- Per scaricare il singolo file, aggiungi "? Format = text" all'URL per ottenere la versione con codifica base64. Quindi decodificalo: cat file | base64 --decode.
- Ora hai il file. Vai alla tua directory SDK che contiene il file errante: cd ~ / Library / Android / sdk / sources / android-29 / android / view /
- Esegui il backup del vecchio file (cp -pr View.java View.java.orig) se vuoi (puoi sempre reinstallare i file sorgente dell'SDK se sbagli). Copia il tuo nuovo file nella stessa posizione.
- Ora, il tuo debugger utilizzerà il file corretto! Dovrai farlo per ogni file di cui il tuo debugger si lamenta.
Spero che questo aiuti qualcun altro in futuro. Ho passato molto tempo a capirlo e spero sinceramente che qualcun altro non debba sprecare quel tempo. Google deve mantenere i pacchetti sorgente coerenti con i pacchetti di rilascio. Guardando tutte le versioni precedenti dell'SDK, nessuno dei pacchetti sorgente sembra essere sincronizzato con l'ultima versione di rilascio. Forse un altro brutto modo per eseguire il debug dei file SDK è utilizzare una versione di rilascio dell'SDK Revision # 1 che corrisponda al pacchetto sorgente Revision # 1.