O código-fonte não corresponde ao bytecode para View.java do Android
Estou tentando depurar meu aplicativo Android. Quando o depurador chega ao arquivo View.java, recebo a mensagem "O código-fonte não corresponde ao bytecode". Posso ver que o depurador está na parte errada do arquivo. Alguém sabe como consertar isso?
Estou depurando em um dispositivo Android 10 (API 29). Em Preferências do Android Studio -> Aparência e comportamento -> Configurações do sistema -> SDK do Android, verifiquei se tudo está atualizado. Eu também limpei e reconstruí várias vezes, removi caches, reiniciei o Android Studio e o dispositivo, desinstalei / reinstalei, atualizei o Android Studio para 4.0.1. Nas configurações do módulo, "Compile Sdk Version" é 29, e a versão Target SDK e Min SDK Version é 29. Nada ajuda ou tem qualquer efeito. Muitas dessas etapas foram sugeridas em postagens semelhantes.
O arquivo View.java que ele tenta abrir está em: ~ / Library / Android / sdk / sources / android-29 / android / view / View.java. Este deve ser o arquivo correto, mas o depurador está na parte errada do arquivo enquanto recebo a mensagem de erro.
Colocando meu chapéu preto, vamos supor que o View.java do meu laptop esteja correto para aquele nível de API: meu telefone poderia estar executando um código fora do padrão e há alguma maneira de detectar isso ou descartá-lo?
Respostas
Acho que descobri o que estava acontecendo e tenho uma solução para esse problema quando isso acontece com arquivos Android SDK. Assustadoramente, a plataforma Android SDK é atualizada para a revisão 5, mas o pacote fonte não é atualizado. Ainda está na Revisão 1! Por que isso aconteceu, eu não posso explicar: uma pessoa razoável esperaria que ambos estivessem em sincronia. Esta captura de tela mostra que o código-fonte não corresponde ao binário que o Android Studio baixou:
A única maneira de contornar isso é baixar manualmente os arquivos de que você precisa e corrigi-los manualmente no diretório de origem do SDK. É feio, é desnecessário, mas se você realmente quiser percorrer um arquivo SDK específico, terá que fazê-lo.
Aqui estão as etapas que segui:
- Descubra qual versão do Android você possui. No seu dispositivo, vá para "Configurações" -> "Sobre o telefone" -> "Versão do Android" e anote o valor do seu "Número da versão". O meu é QQ3A.200805.001.
- Descubra a etiqueta correspondente ao seu número de construção usando esta página: https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds. Para meu número de compilação, a tag é: android-10.0.0_r41
- Encontre o arquivo que você precisa em https://android.googlesource.com. Usando google.com, encontrei-o em:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java
- Determine o repositório Android em que seu arquivo reside. Olhando para o URL anterior, posso deduzir que é: https://android.googlesource.com/platform/frameworks/base/
- Pegue esse repositório usando sua tag. Ou pegue a revisão mais recente da tag daquele arquivo individual on-line, por exemplo:https://android.googlesource.com/platform/frameworks/base/+log/refs/tags/android-10.0.0_r41/core/java/android/view/View.java, revisão 18c0fbf.
- Para baixar o arquivo individual, adicione "? Format = text" ao URL para obter a versão codificada em base64. Em seguida, decodifique-o: arquivo cat | base64 --decode.
- Agora você tem o arquivo. Vá para o diretório do SDK que contém o arquivo incorreto: cd ~ / Library / Android / sdk / sources / android-29 / android / view /
- Faça backup do arquivo antigo (cp -pr View.java View.java.orig) se quiser (você sempre pode reinstalar os arquivos de origem do SDK se errar). Copie seu novo arquivo no mesmo local.
- Agora, seu depurador usará o arquivo correto! Você terá que fazer isso para cada arquivo sobre o qual seu depurador reclamar.
Espero que isso ajude alguém no futuro. Passei muito tempo tentando descobrir isso e, sinceramente, espero que outra pessoa não perca esse tempo. O Google precisa manter os pacotes de origem consistentes com os pacotes de lançamento. Olhando para todas as versões anteriores do SDK, nenhum dos pacotes de origem parece estar em sincronia com a versão de lançamento mais recente. Talvez outra maneira feia de depurar arquivos SDK seja usar uma versão de lançamento do SDK da Revisão nº 1 que corresponda ao pacote de origem da Revisão nº 1.