Nous déboguons un problème avec l'une de nos applications qui affecte uniquement les appareils Huawei. Pour le déboguer, nous avons acheté P20 Lite ANE-LX1. Nous avons placé quelques points d'arrêt dans notre code et étudions la trace complète de la pile. L'appareil dispose de Android 8.0 installé, et nous avons le même SDK téléchargé dans notre Android Studio.
Lorsque nous attachons notre appareil à un débogueur et essayons d'enquêter sur la trace de la pile, nous obtenons les erreurs suivantes dans les fichiers source du système:
Après avoir joué avec la trace de la pile, nous pouvons confirmer qu'en effet nos fichiers source ne correspondent pas à ce qui est installé sur l'appareil. Parfois, le débogueur pointe vers une ligne où functionA
est appelée, et dans la trace de la pile, nous voyons que functionB
est appelé à la place. Les fichiers que nous avons pu confirmer sont concernés par ce problème:
VideoView
,MediaPlayer
,ContentProvider
.Nous avons essayé toutes les solutions possibles que nous avons pu trouver, y compris le nettoyage du projet, la suppression de tout SDK supplémentaire de Android Studio, modification des paramètres du projet - rien ne permet de résoudre ce problème.
Cela nous porte à croire que Huawei installe une version modifiée de Android 8.0 sur leurs appareils, c'est pourquoi nous ne pouvons pas déboguer la trace de pile pour les fichiers système. Nous avons contacté Huawei pour essayer de clarifier cela.
En attendant, nous vous serions reconnaissants de nous faire part de vos idées pertinentes. Peut-être savez-vous où obtenir les fichiers source que Huawei installe sur leurs appareils? Ou peut-être savez-vous comment corriger cette incompatibilité entre le code source et le bytecode d'une autre manière?
Suivant les conseils de Robert, j'ai désinstallé les codes sources de Android 26 et j'ai exécuté à nouveau l'application sur mon Huawei. Dès que j'ai sauté dans le fichier VideoView
, j'ai vu le image suivante:
J'ai cliqué sur "Télécharger" et le téléchargement des fichiers source a commencé:
Après cela, j'ai pu entrer dans VideoView
et cela a semblé fonctionner correctement. Cependant, après cette ligne, il est devenu évident que ces fichiers source sont également erronés:
Quand j'essaye d'entrer dans la fonction requestLayout
j'obtiens ceci:
Et c'est évidemment un mauvais résultat. En fait, si je clique sur "Passez à la ligne suivante", je vois à nouveau le message concernant la non-correspondance du code source avec le bytecode.
Apparemment, Huawei a créé AOSP et modifié ses sources. C'est ce que font de nombreux fabricants et c'est parfaitement bien tant que la source réussit la Suite de test de compatibilité. J'ai moi-même vu des problèmes de lecture vidéo cryptée sur Huawei P20 liés à leur approche de personnalisation de la ROM.
Mais revenons à l'essentiel - vous pouvez obtenir le code cadre exact en cours d'exécution sur votre appareil à partir de /system/framework/arm/boot.oat ou boot-framework.oat ou /system/framework/boot.vdex. Je ne sais pas exactement comment ces fichiers sont structurés mais cela varie entre Android et entre fabricants. Une fois que vous obtenez ces fichiers par adb pull (vous avez sûrement besoin de root pour ce faire), vous pouvez effectuer oat-> dex, dex-> jar en utilisant dex2jar ou d'autres outils et vous obtiendrez la source. Traditionnellement, il était possible d'obtenir le code du framework depuis /system/framework/framework.jar mais après l'introduction de ART, ces fichiers sont souvent vides sur des images système et du code cadre précompilé sont utilisés à la place.