compréhension de la technologie plug-profondeur Android

Technologie plug-in peut être considéré comme l'une des compétences ingénieur Android doit avoir, à partir de 2012, de mettre en avant le concept de plug-ins (version Android), 2016 plug-in des fleurs sont en fleurs, on peut dire plug-in technologie plomb

Résumé des plug-ins

On peut dire la technologie plug-in implique très large, où le mécanisme de chargement de classe et une réflexion du noyau est Android, les principes pertinents Baidu auto vous plaît.

Plug-in histoire du développement

Technologie plug-in a été dérivé de l'idée d'une course installation gratuite apk, l'installation gratuite de l'APK peut être compris comme plug-ins. bouchon de support d'application peut être chargé et exécuté exécution widget Cela peut ensuite être app pas couramment utilisé pour plug-in make modules fonctionnels, d'une part réduit la taille de l'ensemble de l'installation, d'autre part peut être app fonction dynamique étendue . Vous voulez obtenir la technologie plug-in, principalement pour répondre aux trois questions suivantes:

  • Plug-in de la charge et appeler les uns les autres et le code principal du projet
  • accès plug-in à l'autre et chargé avec les ressources techniques principales
  • la gestion du cycle de vie quatre composants

Voici un peu plus bien connu plug-in framework open source, triés en fonction du temps se produire. Étudier leur principe de mise en uvre, peut voir à peu près le développement de la technologie plug-in, et ceux-ci peuvent être divisés en plusieurs cadre fondé sur trois générations est devenu la réalisation du principe.

La première génération : Dynamic-charge-apk ProxyActivity le premier à utiliser cette technologie d'agent statique pour commander le cycle de vie de plug-in PluginActivity par le ProxyActivity. L'inconvénient évident de moyens, l'activité plug-in doit hériter PluginActivity, faire attention lors de l'élaboration contexte. Le processus par le système de manière DroidPlugin Hook peut activer le plug-in d'activité, rend le développement de plug-ins et le développement général de l'application est pas différent, mais parce que le crochet trop de services système, est très complexe et pas assez stable.

La deuxième génération : Afin d'atteindre simultanément faible plug-in envahissants du développement (développement de l'image que le développement de l'application widget générique) et la stabilité du cadre, les principes sont réalisés dans la sélection aussi peu que possible près du crochet, et mis en uvre par certains composants intégrés dans le manifeste brancher des quatre composants principaux. En outre, chaque cadre, conformément à ses idées de conception ont fait des degrés d'expansion, qui est faite d'une petite croix-plate-forme, cadre de développement à base de composants.

La troisième génération : VirtualApp plus puissant, capable de simuler complètement l'environnement d'exploitation application, l'application permet une installation gratuite et le fonctionnement de la technologie à double ouverte. Atlas est une open source Ali cette année d'un cadre d'application de base pour une moissonneuse-batteuse composants et technologies de récupération de chaleur et sa large gamme d'applications et de diverses applications Ali, qui est connu comme un cadre de conteneur.

Plug-orienté principe

chargeur classe

Il y a deux chargeur classique de classe Android, DexClassLoader et PathClassLoader, qui sont BaseDexClassLoader a hérité. Le code source comme suit pertinente:

La différence est que lorsque vous appelez le constructeur de la classe parent, DexClassLoader plus de passer un paramètre optimizedDirectory, ce répertoire doit être un chemin de stockage interne, le système utilisé pour les fichiers de cache créés par Dex. Le PathClassLoader ce paramètre est nul, les fichiers Dex ne peut être chargé dans le répertoire du magasin. On peut donc utiliser DexClassLoader pour charger apk externe, utilisé comme suit:

En fait, sur le chargement de classe plus de détails, j'ai eu aussi une analyse approfondie, vous pouvez consulter le lien suivant: Classe détaillée mécanisme de chargement

Les parents mécanisme de délégation

méthode ClassLoader loadClass est appelé à charger la classe, comme suit:

On peut voir les classes chargées ClassLoader, vérifiez d'abord si elle a été chargée par la classe, si ne chargé trop laisser le chargeur de parent à charge, seuls les appels méthode FindClass lui-même à la charge si le chargeur de classe parent ne peut pas charger la mécanismes largement évité le genre de charges répétées.

DexPathList

Ici pour parler de DexPathList DexClassLoader de mise au point. DexClassLoader FindClass méthode surchargée est invoquée lorsque les cours de chargement pour charger son DexPathList interne. DexPathList est généré lorsque la configuration DexClassLoader, qui contient DexFile interne. Comme indiqué ci-dessous:

DexPathList le loadClass ira à traverser DexFile jusqu'à ce que vous trouviez la classe à charger.

Tencent technologie d'assainissement thermique espace qq est l'utilisation d'un mécanisme de chargement DexClassLoader devra être remplacé dexElements classe ajoutée à l'avant, de sorte que le système sera réparé en utilisant la classe trouvé en premier.

Simple et multi DexClassLoader DexClassLoader

Les classes peuvent où là, il y a accès en générant un bouchon correspondant DexClassLoader APK, deux approches uniques et multiples DexClassLoader DexClassLoader deux structures.

Pour la structure multi DexClassLoader, il peut être identifié par le modèle suivant.

Création d'un DexClassLoader Pour chaque fiche sera, lorsque les besoins plug-in est classe chargée à charger par un DexClassLoader correspondant. Ce type de plug-ins différents sont isolés, lorsque différentes versions plug-référence de la même bibliothèque, pas de problème, RePlugin utilise ce programme.

Pour DexClassLoader unique, son modèle est le suivant:

Le plug-in pathList a fusionné dans la principale DexClassLoader de projet DexClassLoader. Les avantages de le faire, vous pouvez appeler entre différents plug-ins et travaille directement avec les uns des autres grandes classes et méthodes, et différents publics du module plug-in peut être extrait vers un plug-in directement pour les plug-ins supplémentaires à usage commun. Petit est utilisé de cette façon.

Appelez les uns les autres plug-ins et le principal projet implique les deux questions suivantes:

Plug-in appels, le projet principal

Lorsque plug-ins de construction de ClassLoader seront transmises projet principal ClassLoader comme chargeur de parent, de sorte que le plug-in est une sorte de projet principal peut être directement référencé par le nom de la classe.

Branchez les principaux appels de projets

  • Si plusieurs mécanisme de ClassLoader, les principales références du projet doivent plug-in classe et par la méthode de réflexion pour charger la classe en appelant ses plug-ins ClassLoader. cadre plug-in entrée généralement unifié pour gérer l'accès à divers plug-in classe et faire certaines restrictions.
  • Si vous utilisez un seul mécanisme de ClassLoader, le projet principal peut être directement par le nom de classe plug-in classe d'accès. De cette façon, il y a une maladie, si deux uvres plug-in différents ont cité différentes versions d'une bibliothèque, le programme peut se tromper, donc passer par un certain nombre de spécifications pour éviter que cela se produise.

A propos de parents confient des informations plus détaillées, vous pouvez également visiter mon blog mis en place avant: les parents classloader le mode confié

chargement des ressources

les ressources du système applications de chargement de ressources d'objet de la, le code suivant montre le processus de génération de l'objet.

Par conséquent, tant que le chemin du apk plug-in ajouté à AssetManager, sera en mesure d'atteindre l'accès au plug-in des ressources.

Dans la mise en uvre spécifique, car une classe publique AssetManager pas besoin de créer par la réflexion, et en partie sur Rom classe ressource a été créée par une modification, il est nécessaire d'examiner la compatibilité des différents Rom.

chemin des ressources de traitement

Et le code de chargement est similaire à la relation entre la prise et les ressources techniques principales sont également traitées de deux façons:

  • Fusion: Add-ins et le chemin principal pour le temps de tous les projets;
  • Isolé divers plug-ins d'ajouter que leur propre chemin apk

Depuis la fusion AssetManager ajoutant le chemin pour tous les plug-ins et le projet principal, les plug-ins de ressources générées peuvent accéder à des ressources et le principal projet en même temps. Cependant, parce que le projet principal et différents plug-ins sont compilés indépendamment pour générer l'identifiant des ressources, il y aura la même situation, lorsque l'accès aura des conflits de ressources.

Lorsque autonomes, les plug-ins de diverses ressources sont isolées les unes des autres, mais si vous voulez réaliser le partage des ressources, il est nécessaire d'obtenir les objets de ressources correspondant.

traitement de contexte

En général, nous avons accès à des ressources à travers l'objet de contexte, la lumière ne suffit pas de créer un des objets de ressources, afin de prendre un peu de travail supplémentaire. Différentes mises en uvre de l'accès aux ressources nécessitent également différents travaux supplémentaires. VirtualAPK façon de traiter avec un exemple.

Étape 1: Créer des ressources

projets principaux crochet de la ressource: la deuxième étape

Pour ressources de fusion voie d'accès, la nécessité de remplacer le projet principal des ressources, les éléments suivants sont le code de remplacement spécifique.

Notez que le crochet de code ci-dessus plusieurs endroits, crochet incluant les points suivants:

Remplacer la cible principale mResource du contexte du projet LoadedApk.

Ajout d'une nouvelle ressource principale ActivityThread du projet mResourceManager et faire un traitement différent basé sur la version Android.

La troisième étape: la ressource associée et l'activité

Le code est appelé (va expliquer plus tard comment raccorder l'activité de création) L'activité est créée lorsque, après avoir été construit en activité, ce qui est la nécessité de remplacer le plugin ressources mResources. Parce que le projet principal des ressources ne peut pas être plug-in autonome accès aux ressources, donc si nous ne remplaçons, aura erreur d'accès aux ressources.

Après avoir terminé le travail ci-dessus, vous pouvez utiliser setContentView, les méthodes de gonfleur telles que plug-in dans l'activité de la facilité de mise en page de chargement.

Résolution des conflits de ressources

La fusion des ressources gérées, présentera un conflit de ressources, parce que peut être l'identifiant de ressource différente plug-in même, de sorte que la solution est de rendre les ressources des différents plug-ins ont différents id ressources.

Resource id est un nombre hexadécimal à 8 bits, exprimée en 0xPPTTNNNN. PP segment de l'espace de paquets utilisé pour distinguer, par défaut seule distinction entre l'application et les ressources du système, le segment ressource type TT, le segment NNNN 0000 dans les mêmes incréments de la APK. Le tableau suivant:

L'idée est de modifier l'ID de ressource des sections PP, différentes pour les plug-ins différents de sections PP, pour distinguer les différents plug-in de ressources. Il y a deux façons de spécifiques:

  • AAPT modifier le code source, compiler le segment PP modifié.
  • Modifier le fichier resources.arsc, qui répertorie l'ID de ressource spécifique au chemin de la cartographie des ressources.

prennent en charge quatre composants

développement Android il y a une classe spéciale, est créée par le système, et gère le cycle de vie du système. Les quatre composants utilisés, activité, service, BroadcastReceiver et ContentProvider. Seules les instances de construct de ces classes est inutile, mais il faut aussi gérer le cycle de vie des composants. Parmi les activités les plus complexes cadre en utilisant des méthodes différentes ne sont pas les mêmes. L'activité a été décrite en détail ci-dessous avec la façon de soutenir la gestion des plug-in du cycle de vie des composants. Environ divisés en deux façons:

  • Agent ProxyActivity
  • StubActivity intégré, le processus de système de crochet d'activité

Agent ProxyActivity

agents de façon ProxyActivity a d'abord été proposé par la dynamique de charge apk, son idée est simple, mettre un ProxyActivy dans le projet principal, va d'abord commencer ProxyActivity commencer plug-in d'activité, créer des plug-ins dans l'activité ProxyActivity et cycle de vie Synchronize . La figure suivante illustre le processus de plug-activité de lancement.

Processus spécifique est la suivante:

  • Il faut d'abord une entrée uniforme (comme le montre la PluginManager) Activité démarrer le bouchon, qui est conservé à l'intérieur de l'activité de bouchon commencera l'information et l'intention de commencer à remplacer l'intention de ProxyActivity.
  • ProxyActivity get ClassLoader et des informations de ressources sur la base des plug-ins de plug-in, créez PluginActivity par la réflexion et appelant sa méthode onCreate.
  • PluginActivty appel setContentView été réécrite, il ira à l'appel setContentView ProxyActivty. Depuis ProxyActivity réécrite getResource renvoie les plug-ins de ressources, de sorte setContentView capables de plug-in accéder aux ressources. De plus findViewById aussi appeler ProxyActivity de.
  • Autre cycle de vie fonction de rappel ProxyActivity appelle le cycle de vie de PluginActivity correspondant.
  • La principale façon de comprendre l'attention proxy ProxyActivity sur deux points:

    • ProxyActivity nécessité de réécrire getResouces, getAssets, méthode retourne getClassLoader la bougie d'objet correspondant. fonctions de cycle de vie et les fonctions connexes et l'interaction de l'utilisateur, tels que onResume, onStop, onBackPressedon, KeyUponWindow, FocusChanged, etc., doivent être transmises à la fiche.
    • PluginActivity tous les appels de méthode de contexte pertinents, tels que setContentView, getLayoutInflater, getSystemService ProxyActivity nécessite donc un appel de méthode correspondante.

    défaut

    • Plug-in activité doit hériter PluginActivity, le développement invasif forte.
    • Si vous voulez soutenir l'activité de singleTask, SingleInstance et d'autres launchMode, il a besoin de sa propre pile d'activité de gestion, il est lourd à mettre en uvre.
    • Plug-in nécessite contexte de manipulation prudente, sujette aux erreurs.
    • Si le module avant d'essayer de se transformer en un plug-in nécessite beaucoup de travail supplémentaire.

    Bien que le peut bien atteindre l'objectif de lancer plug-activité de la voie, mais en raison du fort développement invasif, plug-in système après la charge APK dynamique continue rarement d'utiliser de cette façon, mais le processus de démarrage d'activité par le système de crochet, laissez démarrer le plug-in pour démarrer l'activité comme la construction principale de l'activité aussi simple.

    Mode de crochet

    Avant d'introduire le chemin de crochet, d'abord avec une brève introduction au système est une carte de la façon de démarrer une activité.

    La figure coté sur l'activité est un processus principal commence, les étapes suivantes:

  • Activité1 startActivity d'appel, les appels réels méthode execStartActivity Instrumentation classe, système Instrumentation est utilisé pour surveiller le fonctionnement d'une activité de classe, cycle de vie de l'activité a son ombre.
  • Par inter-processus appelle liant, dans ActivityManagerService dans ses processus internes de la pile d'activité. Et plus tard, par des appels inter-processus dans le processus Activity2 situé.
  • ApplicationThread l'objet est un liant qui pool de fil conducteur liant, comprenant une classe interne H qui hérite de la classe Handler. les informations de ApplicationThread Activity2 est transmise à l'objet de H par l'intermédiaire du fil conducteur.
  • Le fil conducteur après Activity2 obtenir des renseignements, appelez la méthode newActivity Instrumentation classe, créer une occurrence Activity2 ClassLoader par son intérieur.
  • Voici comment démarrer plug-in crochet d'activité en passant, doivent répondre aux deux questions suivantes:

    • plug-in d'activité est pas enregistrée dans AndroidManifest, comment contourner la détection.
    • Comment construire instance d'activité, la synchronisation du cycle de vie

    Il existe de nombreuses solutions à VirtualAPK exemple, l'idée de base est la suivante:

  • Tout d'abord incorporé dans le manifeste StubActivity, au démarrage crochet figure Etape 1, en remplaçant l'intention dans StubActivity.
  • l'étape de crochet 10, la réflexion créée par plug-in plug-ins ClassLoader Activité
  • Après tout callbacks cycle de vie de l'activité seront notifiés au plug-in Activité
  • Système de remplacement Instrumentation

    VirtualAPK lors de l'initialisation appelle hookInstrumentationAndHandler, qui Accrocher le système de classe Instrumentaiton, vu de la classe et de l'activité ci-dessus commencent étroitement liés.

    Ce code remplacera les objets classe VAInstrumentation Instrumentation personnalisée devenir le thread principal. Au démarrage et créer un plug-activité, la classe secrètement faire des mains et des pieds.

    crochet activité au démarrage

    classe VAInstrumentation execStartActivity remplace la méthode, le code correspondant est le suivant:

    processus sera execStartActivity intention implicite, si l'intention implicite adaptée aux plug-ins d'activité, le convertit en explicite. Après markIntentIfNeeded être lancé par les plug-ins Activité remplacé par précédemment pris en compte dans AndroidManifest fosse StubActivity, et enregistrer les informations sur le plug-in Activité d'intention. DispatchStubActivity qui a une fonction qui StubActivity commencera l'activité de sélection spécifique launchMode base. Pour VirtualAPK launchMode soutien à l'activité principale du projet AndroidManifest en mode démarrage pour chaque activité sont intégrés un certain nombre de bits de puits.

    Le processus de création Activité de crochet

    tromper, le système précédent, permettent au système de penser qu'ils commencent une activité normale. Quand il vient à l'étape 10. La figure 3.2, puis insérer l'activité en retour. A ce stade, l'appel est classe méthode newActivity VAInstrumentation.

    Étant donné que le StubActivity AndroidManifest pas intégré dans une catégorie spécifique, dans ce cas se produirait ClassNotFoundException. Après élimination du traitement de l'information d'anomalie de la bougie d'activité ClassLoader réfléchie par la configuration de l'activité de plug-ins.

    autres opérations

    Après l'activité des plug-ins construit, afin d'assurer leur fonctionnement normal, mais aussi de faire un travail supplémentaire.

    Ce code est principalement pour remplacer l'activité dans des ressources, contexte et d'autres objets en conséquence sont devenus l'objet de plug-ins, les plug-ins d'activité assurer le bon fonctionnement de l'appel en ce qui concerne les méthodes de contexte.

    Après ces étapes, vous commencez à réaliser le plug-activité, et ce traitement supplémentaire qui ne nécessite pas de plug-ins d'activité, et l'activité conventionnelle même. Cette question est, comment faire après onResume, onStop et autre cycle de vie, il? La réponse est tout le cycle de vie et la fonction liée à l'activité, le système appellera le plug-in d'activité. La raison est que dans le traitement des AMS Activité, activité par un montrant jeton une cible spécifique, ce qui est le jeton et les objets qui sont créés lorsque vous démarrez la correspondance d'activité, ce qui est notre activité remplacé par le plug-in d'activité, donc après tous les appels à AMS sera transmis au plug-in d'activité.

    D'autres composants

    L'activité des quatre composants prennent en charge la plupart des composants complexes et d'autres pour atteindre le principe est, brièvement beaucoup plus simple résumés comme suit:

    • service : La différence est que le service et l'activité, le cycle de vie de l'activité est déterminée par l'interaction de l'utilisateur, et le service est le cycle de vie de notre initiative de l'appel de code, et le service et les cas manifestes sont enregistrés dans un à un. L'idée est de mettre en uvre des plug-ins orientés service via intégré StubService, crochet, etc. dans le système manifeste startService remplacer l'appel à démarrer le service, après avoir créé le plug-in service StubService et gérer manuellement leur cycle de vie.
    • BroadcastReceiver : Parsing widget de manifeste diffusé l'enregistrement statique dans l'enregistrement dynamique.
    • ContentProvider : Semblable à la façon dont le service, pour tous les appels à travers un puits de compte ContentProvider de la fiche dans la distribution de ContentProvider manifeste.

    résumé

    VirtualAPK en remplaçant les systèmes d'instrumentation, crochet et créer une activité commence, ce qui élimine la nécessité d'une lourdeur des plug-ins cycle de vie de l'activité de gestion manuelle, de sorte que les plug-ins Activité d'activité comme comme une gestion normale du système, et les plug-ins d'activité dans le développement et régulier, comme, qui est capable de fonctionner de manière indépendante et peut être appelé en tant que projet principal de bouchon.

    Autre cadre plug-in pour traiter l'activité la pensée le plus, est rien de plus qu'une combinaison des deux ou l'une des deux façons. Lorsque crochet, cadres différents peuvent choisir un point de crochet différent. RePlugin cadre 360 comme la sélection de crochet système de ClassLoader, à savoir la configuration de la figure 3.2 ClassLoader Activity2 en activité est évaluée pour être activé lorsque le bouchon, le bouchon appellera configuration ClassLoader objet correspondant. De plus RePlugin Pour la stabilité du système, aussi peu que possible du crochet sélectionné afin qu'il n'accroche pas la méthode startActivity de choix pour remplacer le système intention, mais en réécrivant l'activité startActivity, de sorte que la prise est nécessaire hérite de la classe d'activité une base de PluginActivity similaire a. Mais RePlugin Gradle fournit un plug-plug-in classe de base d'activité a remplacé le PluginActivity, les utilisateurs dans le développement de l'activité plug-ins est pas la perception.

    Reproduit

    Faites tout de suite! rapport de travail du gouvernement, huit tâches ont calendrier!
    Précédent
    Rallye de tester la nouvelle Guangzhou Automobile Chi Chuan GS5270T
    Prochain
    15 PPT, avec vue sur la réforme et le développement des points de conférence de presse appartenant à l'État!
    Shawn nouveau démonstration personnelle! En plus du quatrième anniversaire ce mois-ci, ne note pas, ne manquez pas cette famille commune!
    Renault chiffre d'affaires du troisième trimestre de 11,5 milliards d'euros ou une augmentation annuelle de 2%
    Âgé de 53 ans a perdu sa femme déesse de génération: son petit ami vivant ensemble depuis 26 ans la mort subite d'une crise cardiaque dans l'avion!
    Les politiques préférentielles pour attirer aussi, à 21 millions de personnes installées dans la ville, mais a trouvé une situation délicate ...
    l'optimisation des instructions détaillées Android et Java appels de méthode
    marque de sortie Red Flag nouvelle technologie mise en page automatisation / intelligente
    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