El código fuente no coincide con el código de bytes de View.java de Android
Estoy intentando depurar mi aplicación de Android. Cuando el depurador llega al archivo View.java, recibo el mensaje "El código fuente no coincide con el código de bytes". Puedo ver que el depurador está en la parte incorrecta del archivo. ¿Alguien sabe cómo arreglar esto?
Estoy depurando en un dispositivo Android 10 (API 29). En las Preferencias de Android Studio -> Apariencia y comportamiento -> Configuración del sistema -> SDK de Android, me aseguré de que todo esté actualizado. También limpié y reconstruí varias veces, eliminé cachés, reinicié Android Studio y el dispositivo, desinstalé / reinstalé, actualicé Android Studio a 4.0.1. En la configuración del módulo, "Compile Sdk Version" es 29, y Target SDK Version y Min SDK Version es 29. Nada ayuda ni tiene ningún efecto. Muchos de estos pasos se sugirieron en publicaciones similares.
El archivo View.java que intenta abrir se encuentra en: ~ / Library / Android / sdk / sources / android-29 / android / view / View.java. Este debería ser el archivo correcto, pero el depurador está en la parte incorrecta del archivo mientras recibo el mensaje de error.
Poniéndome mi sombrero negro, supongamos que el View.java de mi computadora portátil es correcto para ese nivel de API: ¿podría mi teléfono ejecutar un código no estándar y hay alguna forma de detectarlo o descartarlo?
Respuestas
Creo que descubrí lo que estaba sucediendo y tengo una solución para este problema cuando sucede con los archivos SDK de Android. Curiosamente, la plataforma Android SDK se actualiza a la revisión 5, pero el paquete fuente no se actualiza. ¡Todavía está en la revisión 1! No puedo explicar por qué sucedió esto: una persona razonable esperaría que ambos estuvieran sincronizados. Esta captura de pantalla muestra que el código fuente no coincide con el binario que descargó Android Studio:
La única forma de evitar esto es descargar manualmente los archivos que necesita y parchearlos manualmente en su directorio de origen del SDK. Es feo, es innecesario, pero si realmente desea recorrer un archivo SDK específico, debe hacerlo.
Estos son los pasos que seguí:
- Descubra qué compilación de Android tiene. En su dispositivo, vaya a "Configuración" -> "Acerca del teléfono" -> "Versión de Android" y anote el valor de "Número de compilación". El mío es QQ3A.200805.001.
- Encuentre la etiqueta correspondiente a su número de compilación usando esta página: https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds. Para mi número de compilación, la etiqueta es: android-10.0.0_r41
- Encuentra el archivo que necesitas en https://android.googlesource.com. Usando google.com, lo encontré en:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java
- Determine el repositorio de Android en el que se encuentra su archivo. Al mirar la URL anterior, puedo deducir que está en: https://android.googlesource.com/platform/frameworks/base/
- Toma ese repositorio con tu etiqueta. O tome la revisión más reciente de esa etiqueta de ese archivo individual en línea, por ejemplo:https://android.googlesource.com/platform/frameworks/base/+log/refs/tags/android-10.0.0_r41/core/java/android/view/View.java, revisión 18c0fbf.
- Para descargar el archivo individual, agregue "? Format = text" a la URL para obtener la versión codificada en base64. Luego decodifíquelo: archivo cat | base64 --decode.
- Ahora tienes el archivo. Vaya a su directorio SDK que contiene el archivo errante: cd ~ / Library / Android / sdk / sources / android-29 / android / view /
- Haga una copia de seguridad del archivo anterior (cp -pr View.java View.java.orig) si lo desea (siempre puede volver a instalar los archivos fuente del SDK si falla). Copie su nuevo archivo en la misma ubicación.
- ¡Ahora, su depurador usará el archivo correcto! Tendrá que hacer esto para cada archivo del que se queja su depurador.
Espero que esto ayude a alguien más en el futuro. Pasé mucho tiempo resolviendo esto y sinceramente espero que alguien más no tenga que perder ese tiempo. Google debe mantener la coherencia de los paquetes fuente con los paquetes de lanzamiento. Al observar todas las versiones anteriores del SDK, ninguno de los paquetes fuente parece estar sincronizado con la última versión. Quizás otra forma desagradable de depurar archivos SDK es usar una versión de lanzamiento del SDK de la Revisión # 1 que coincida con el paquete fuente de la Revisión # 1.