l'optimisation des instructions détaillées Android et Java appels de méthode

Faites une petite expérience:

Mettre en activité apk est un bouton et un TextView, cliquez sur le bouton pour rendre les résultats apparaissent sur le TextView.

Code apk est la suivante:

publicclassMainActivityextendsAppCompatActivity {button Bouton; TextView textView; @OverrideprotectedvoidonCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); textView = findViewById (R.id.text); button = findViewById (R.id. bouton); button.setOnClickListener (newView.OnClickListener () {@OverridepublicvoidonClick (Voir v) {test test = Newtest (); String s = test.getValue (); textView.setText (s);}});}}

Code de test dans laquelle la classe suit comme:

Public class Test {

 public String getValue () {

 ce retour est la méthode getValued;}}

Essayez ensuite de penser, zone de texte de résultat montre quel serait-il?

1er résultats:

Si fonctionne normalement, les résultats sont les suivants (ce test est effectué sur tous PSBA Android N):

cette méthode est getValued

D'autres tests

Ensuite, un autre test.

Nous donnons ClassPath PathClassLoader l'APK avant tout Injecter Dex, le Dex ne contient qu'une seule classe, et avant le nom de package de test + nom de la classe même, comme suit:

public class test {public String getValue () {return c'est la méthode getValue de Dex;} public String abc () {return c'est la méthode abc !!!;}}

Tel est le principe le plus simple de hotfix, devinez quoi, quel sera le résultat?

Le deuxième résultat

Le résultat sera c'est-il?

En fait, dans la version de débogage, nous pouvons obtenir le résultat correct:

Dans la version, le résultat est ce que nous imaginons ces résultats sont les suivants:

expliquer

Pourquoi est-il un tel phénomène: appel de méthode getValue est évidemment la raison pour laquelle la méthode abc renvoie le résultat de celui-ci?

Pour expliquer ce phénomène, nous devons avoir une certaine compréhension des principes de l'exécution du code de machine virtuelle Android.

Lorsque nous compilons le code Java dans apk, le compilateur utilisera fichier java javac sera transféré dans les fichiers de classe, puis seront transférés par les fichiers de classe dx dans le fichier dex (si elle est compilateur jackjill, il sera généré dans le processus de la classe).

le temps d'installation APK, PMS sera optimisé pour le processus apk evoke dex2oat par installd.

Quand nous commençons le système lorsque la machine virtuelle pour charger BootClassLoader, rechargeant SystemClassLoader, la charge de la classe de paquet de pot correspondant respectivement jusqu'à BOOTCLASSPATH et SYSTEMSERVERCLASSPATH dans.

Au démarrage APK, va créer un PathClassLoader, il sera chargé dans apk de mémoire liée à la bibliothèque et ses dépendances dans la classe.

Si nous clssapath PathClassLoader le début inject nouveau pot / Dex, une priorité d'exécution PathClassLoader sera chargé en face du pot / Dex, s'APK de manière à couvrir le remplacement de la classe de mise en uvre de la classe.

Mais nous ne habituellement pas remarqué le mécanisme de la machine virtuelle.

Lorsque vous installez apk, apk si une version de débogage, sera l'exécution forcée en guise d'explication, cette fois-ci réalisée par le code octet, on voit le code octet comme celui-ci:

À savoir l'exécution d'invocation virtuelle manière + methodID. Ceci est methodID apk dex en lui-même, chacun de la table de chaîne de Dex a une table de stockage Méthode et (bien sûr, d'autres tables tables de classe, etc.).

Par tables chaîne se trouvent dans ce qui est un indice correspondant chaîne, par table de méthode, vous pouvez obtenir methodID correspondant ID de chaîne, puis se trouve dans la table nom de la méthode String.

Au moyen d'un nom de machine virtuelle, puis trouver la méthode a été chargée à partir du cache, si la méthode ne se trouve pas, il est chargé de la classpath et détermination, enfin trouver la méthode correspondante.

Ainsi, la version de débogage normale interprété, ce processus ne pose aucun problème, y compris l'utilisation de l'ancienne classe correspondant à la nouvelle classe, vous pouvez toujours obtenir le nom de la méthode correcte par lui-même methodID compilation décision, et il peut obtenir le procédé correct et l'exécution.

Mais la version du temps, Dex sera optimisé. Optimisation dex2oat la mesure de déterminer la configuration du système selon l'hélice, dans le PSBA N, la configuration par défaut est la suivante:

interpréter seulement l'optimisation de motif, en fait, seulement dalvik optimisation du niveau d'instruction, et le code de la machine ne sont pas en mode générés (vitesse optimisée ou analogue d'autres portions de code machine est générée, tout est en mode compilation complète, sont tous optimisés pour bytecode code machine), mais une telle instruction invoqueraient virtuelle optimisée pour Quicken dans Invoke-virtuel rapide.

Le but de l'optimisation est de trouver le regard methodID dans vtable. methodID est dex recherche globale, par rapport à regarder vtable intérieur de la classe, l'efficacité est beaucoup plus élevé, après tout, un Dex est susceptible d'avoir des dizaines de milliers de méthode et la méthode dans une classe généralement que quelques dizaines à.

Optimisation seule interprétation, et est basé sur le temps de compilation prémisse non seulement pour obtenir le nom de la classe, mais aussi pour se rendre à la définition de la classe.

Parce que nous sommes chargés dynamiquement Dex, le Dex ne se trouve que dans le Dex chargé classloader, il suffit de savoir qu'il ya une classe en soi apk dex2oat compilation du temps.

Lorsque l'optimisation dex2oat interpréter uniquement effectuée, il dépend du compilateur d'origine Méthode, résultant en un procédé de génération d'un index d'origine index vtable classe de test. Cependant, le temps en cours d'exécution, étant donné que les nouvelles classes d'essai plus une méthode de abc, androïde différentes cordes table, tables de méthode, comme le vtable sont classés par ordre alphabétique, ce qui dans les méthodes abc méthode d'essai avant, donc l'indice vtable initial a constaté la méthode devient méthode abc.

Vtable en raison des changements de l'indice, il y a eu méthode d'essai est appelée évidemment, peut être le résultat de l'exécution d'une méthode phénomène abc étrange.

Si nous compilons mode aucun vérifierons (optimisation pas Quicken, ou autre peut être compilé en mode code machine), laisser fonctionner en mode interprété, il n'y a pas de problème. Mais si ensemble android apk dans le Manifest: vmSafeMode = « true », indépendamment du fait que l'autre mode pour forcer le compilateur, pour compiler le mode apk interprétera toujours seule, ce qui entraîne des problèmes persistent.

Par exemple, nous utilisons pour compiler la vitesse, connectez-vous interpréter seulement encore:

résumé

Apk pendant les correctifs, les plug-ins, le temps de charge dynamique, souvent multiple pot / Dex contient la même classe, si la structure de classe a changé en raison de la nécessité de mettre à niveau, il cachera un peu difficile à expliquer à l'intérieur de la fosse, faites attention.

Les politiques préférentielles pour attirer aussi, à 21 millions de personnes installées dans la ville, mais a trouvé une situation délicate ...
Précédent
marque de sortie Red Flag nouvelle technologie mise en page automatisation / intelligente
Prochain
la réforme des entreprises d'Etat et nouvelles vers la conférence de développement neuf, doit voir!
Le seul été Hollywood blockbuster? Kun Ling a joué dans « sauvetage Ferris, » libéré de bouche à oreille bonne!
Anhui: fleuve Yangtsé, 60.000 tonnes de déchets solides empilés les eaux usées peut être tout à courant continu Yangtsé!
2018 entretien Java principal --MySQL sept principe sous-tableau sous-bibliothèque
Miss Hong Kong TVB Li Peng a souligné le chaos unique de répudiation « retraite » Mère sans détour: Ne salissez pas avec les garçons à la maison
Ford GT Carbon Series chiffre officiel de la piste est né
Qu'est-ce soutien? Cette paire de yin et le yang, le noir et le bleu Air Jordan 1 était encore plus grande que la foudre commune aussi limitée!
Respecter leur carrière! 52 ans TVB drame populaire éloge masculin a gagné l'opération musculaire folle Dieu Mme choc
Johnson Controls entreprise de la batterie automobile ou la vente de 14 milliards $
2018 questions d'entrevue BAT (cinq) modèle de mémoire -Java principe de fil d'exécution
Doux regard tout frais! Justin Bieber et sa petite amie de se marier l'exposition figure de vacances Houbahama!
Gaz, électricité, 5G ...... ces bons moyens de subsistance des personnes, des représentants du taux central! Deux sessions de New Sound