Le code source ne correspond pas au bytecode pour View.java d'Android

Aug 24 2020

J'essaye de déboguer mon application Android. Lorsque le débogueur accède au fichier View.java, je reçois le message "Le code source ne correspond pas au bytecode". Je peux voir que le débogueur est dans la mauvaise partie du fichier. Est-ce que quelqu'un sait comment réparer ceci?

Je débogue sur un appareil Android 10 (API 29). Dans les préférences d'Android Studio -> Apparence et comportement -> Paramètres système -> SDK Android, je me suis assuré que tout est à jour. J'ai également nettoyé et reconstruit plusieurs fois, supprimé les caches, redémarré Android Studio et l'appareil, désinstallé / réinstallé, mis à jour Android Studio vers 4.0.1. Dans les paramètres du module, la «version de compilation du SDK» est 29, et la version cible du SDK et la version minimale du SDK sur 29. Rien n'aide ni n'a d'effet. Beaucoup de ces étapes ont été suggérées dans des articles similaires.

Le fichier View.java qu'il tente d'ouvrir se trouve dans: ~ / Library / Android / sdk / sources / android-29 / android / view / View.java. Cela devrait être le bon fichier, mais le débogueur est dans la mauvaise partie du fichier pendant que j'obtiens le message d'erreur.

En mettant mon chapeau noir, supposons que View.java de mon ordinateur portable soit correct pour ce niveau d'API: mon téléphone pourrait-il exécuter un code non standard, et existe-t-il un moyen de le détecter ou de l'exclure?

Réponses

curious_george Aug 24 2020 at 23:58

Je pense avoir compris ce qui se passait et j'ai une solution à ce problème lorsqu'il se produit avec les fichiers du SDK Android. De manière effrayante, la plate-forme Android SDK est mise à jour vers la révision 5, mais le package source n'est pas mis à jour. Il est toujours en révision 1! Pourquoi cela s'est produit, je ne peux pas l'expliquer: une personne raisonnable s'attendrait à ce que les deux soient synchronisés. Cette capture d'écran montre que le code source ne correspond pas au binaire téléchargé par Android Studio:

Le seul moyen de contourner ce problème est de télécharger manuellement les fichiers dont vous avez besoin et de les corriger manuellement dans votre répertoire source SDK. C'est moche, c'est inutile, mais si vous voulez vraiment parcourir un fichier SDK spécifique, vous devez le faire.

Voici les étapes que j'ai suivies:

  1. Découvrez la version d'Android dont vous disposez. Sur votre appareil, accédez à "Paramètres" -> "À propos du téléphone" -> "Version Android" et notez la valeur de votre "Numéro de version". Le mien est QQ3A.200805.001.
  2. Découvrez le Tag correspondant à votre numéro de build en utilisant cette page: https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds. Pour mon numéro de build, la balise est: android-10.0.0_r41
  3. Trouvez le fichier dont vous avez besoin sur https://android.googlesource.com. En utilisant google.com, je l'ai trouvé sur:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java
  4. Déterminez le dépôt Android dans lequel se trouve votre fichier. En regardant l'URL précédente, je peux en déduire qu'elle se trouve à: https://android.googlesource.com/platform/frameworks/base/
  5. Saisissez ce dépôt en utilisant votre balise. Ou récupérez en ligne la dernière révision de cette balise de ce fichier individuel, par exemple:https://android.googlesource.com/platform/frameworks/base/+log/refs/tags/android-10.0.0_r41/core/java/android/view/View.java, révision 18c0fbf.
    • Pour télécharger le fichier individuel, ajoutez "? Format = text" à l'URL pour obtenir la version encodée en base64. Puis décodez-le: fichier cat | base64 --decode.
  6. Vous avez maintenant le fichier. Accédez au répertoire de votre SDK contenant le fichier errant: cd ~ / Library / Android / sdk / sources / android-29 / android / view /
  7. Sauvegardez l'ancien fichier (cp -pr View.java View.java.orig) si vous le souhaitez (vous pouvez toujours réinstaller les fichiers source du SDK si vous vous trompez). Copiez votre nouveau fichier au même emplacement.
  8. Maintenant, votre débogueur utilisera le bon fichier! Vous devrez le faire pour chaque fichier dont votre débogueur se plaint.

J'espère que cela aidera quelqu'un d'autre à l'avenir. J'ai passé beaucoup de temps à comprendre cela et j'espère sincèrement que quelqu'un d'autre n'aura pas à perdre ce temps. Google doit garder les packages sources cohérents avec les packages de version. En regardant toutes les versions précédentes du SDK, aucun des packages sources ne semble être synchronisé avec la dernière version. Peut-être qu'une autre façon laide de déboguer les fichiers SDK consiste à utiliser une version de version du SDK de révision n ° 1 qui correspond au package source de la révision n ° 1.