plug-in Android cadre du pot VirtualAPK Paquet développement

Avant-propos:

 Si tel est le cas du développement de l'APP (sans tenir compte de la majeure partie de la fosse), je pense que sur une sorte de plug-in mode peut être utilisé. Maintenant que je suis ici est une nouvelle exigence, je dois-je développé SDK, alors je vais écrire contenir AAR APP développe pas, cadre VirtualAPK, mais en fait beaucoup de gens écrivent SDK AAR domestique utilise pas, mais l'utilisation de paquet pot de la façon, aujourd'hui, je n'utiliser le package jar VirtualAPK un cadre.

A. Processus de développement

Je ne suis pas une nouvelle écriture, puis à un code en termes de:

 https://www.jianshu.com/p/3022f4b0ae28

 Démonstration de l'application développée sur un modèle I utilisé deux modules, un module hôte, un module enfichable. Maintenant, le développement du paquet de pot, couplé avec le module nécessaire pour simuler un shell appelé package jar.

 Autrement dit, le module shell - >  l'enveloppe; module hôte - >  domicile; module enfichable - >  plugin.

II. Références package jar

1. L'emballage de pot

Tout d'abord, nous voulons écrire un emballage de pot de commande dans la maison gradle dans cette découverte sur Internet beaucoup. Par exemple, je

 tâche buildJar (DependsOn: , tapez: Jar) { NomArchive = 'testVirtual.jar' def = srcClassDir ; de srcClassDir exclure "** / R.class" exclure "** / R \ $ * classe." }

C'est la maison que je sortir du paquet jar nommé testVirtual.jar

2. package jar Référence

Maintenant, nous avons mis au point de se référer à shell paquet pot, ma coquille est très simple, allez directement OneActivity classe maison (Cette classe est l'un des pré-Demo).

public class MainActivity étend l'activité { @Override onCreate vide protégé (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); intention d'intention = new intention (MainActivity.this, OneActivity.class); startActivity (intention); } }

Ensuite testVirtual.jar dans le dossier libs, si la référence (le général par défaut là-bas) dans la coquille en gradle

dépendances { la mise en uvre FileTree (dir: 'libs', comprennent: ) }

3. Les documents d'achèvement

Bien sûr, comme ci-dessus, il ne peut pas fonctionner. Parce que nous nous battons pour c'est le paquet de pot à la place AAR. Par conséquent, nous avons des ressources à la maison complètent à la coquille, il est arrivé aux ressources dont je dispose seulement activity_one, le mettre dans le dossier de mise en page shell, juste la démonstration qu'une seule activité, ainsi shell manifeste du définitions. Enfin, parce que la maison a une « com.didi.virtualapk: noyau: 0.9.8 » implémentation de référence, nous devons le faire dans le paquet de pot dans la coquille libs.

  Ici, on peut dire à la façon de trouver le paquet jar correspondant selon la mise en uvre:

 Ouvrez le lecteur C / Users / nom d'utilisateur /.gradle/caches/modules-2/files-2.1 dossier, puis aller au contenu du cadre, par exemple, je trouve cela sur

 Allez après la mise en uvre pour trouver le nom

 3 dossiers à l'intérieur que j'ai trouvé un paquet de pot se demandait pas, alors je me AAR est basé sur ce point, parce que je crains qu'il y aura le cadre dans le fichier de ressources, il est décompressé de prendre cette AAR prendre le paquet de pot (il se trouve aucune ressource fichier)

 Pour entrer dans un pot, puis dans un changement de nom du shell libs peut fonctionner normalement. Remarque:

Il peut signaler l'erreur d'identification de ressources, ce qui indique qu'il pourrait y avoir un conflit de ressources, la solution est de ne pas utiliser R. façon de se référer aux ressources, vous pouvez utiliser context.getResources (). DonneIdentifiant (nom, type, context.getPackageName ()) ;

III. Plug-appel

Rien à coquille d'écriture, parce que nous écrivons l'opération plug-in à la maison, tant la maison d'application héritée appel sur la ligne.

 Ensuite, utilisez la ligne de commande à l'ensemble de plug-in, recyclage, avec gradlew assemblePlugin propre

 Le plug-in dans un dossier spécifique (du côté de l'opération et la précédente, sont à la maison à l'opération de plug-in, et la coquille n'a rien à voir)

Enfin, course, lire le précédent tout savoir, je Interact sur un plug-in dans la maison et il y a deux endroits, on est un procédé d'impression d'une maison de journal pour plug-in appeler puis changer le bouton de rappel, le second est la maison de sauter le plug-in une activité.

 Si vous suivez ma méthode pour faire trouveront la première place normale, appel à la maison normale plug-in méthodes, mais la deuxième place étant donné, sauter la maison pas le plugin d'activité, et l'erreur

 android.content.ActivityNotFoundException: Impossible de trouver la classe explicite d'activité {com.example.plugin.virtualmastertest / com.didi.virtualapk.core.A $ 1}, avez-vous déclaré cette activité dans votre AndroidManifest.xml?

Il ne définit pas le sens manifeste, mais pourquoi je l'ai écrit avant nécessité de ne pas être défini dans le manifeste, et nous devons combattre ensemble pot, mais com.didi.virtualapk.core.A 1 $.

apk maison avant je décompiler, a constaté que manifeste après décompilation bien au-dessous ce genre de choses

  < activité android: exportation = "false" android: launchMode = "standard" android: name = "com.didi.virtualapk.delegate.StubActivity" / > < activité android: exportation = "false" android: launchMode = "standard" android: name = "com.didi.virtualapk.core.A $ 1" / > < activité android: exportation = "false" android: launchMode = "standard" android: name = "com.didi.virtualapk.core.A $ 2" android: theme = "@ android: le style / Theme.Translucent" / > < activité android: exportation = "false" android: launchMode = "singleTop" android: name = "com.didi.virtualapk.core.B $ 1" / > < activité android: exportation = "false" android: launchMode = "singleTop" android: name = "com.didi.virtualapk.core.B $ 2" / > < activité android: exportation = "false" android: launchMode = "singleTop" android: name = "com.didi.virtualapk.core.B $ 3" / > < activité android: exportation = "false" android: launchMode = "singleTop" android: name = "com.didi.virtualapk.core.B $ 4" / > < activité android: exportation = "false" android: launchMode = "singleTop" android: name = "com.didi.virtualapk.core.B 5 $" / > < activité android: exportation = "false" android: launchMode = "singleTop" android: name = "com.didi.virtualapk.core.B $ 6" / > < activité android: exportation = "false" android: launchMode = "singleTop" android: name = "com.didi.virtualapk.core.B 7 $" / > < activité android: exportation = "false" android: launchMode = "singleTop" android: name = "com.didi.virtualapk.core.B $ 8" / > < activité android: exportation = "false" android: launchMode = "singleTask" android: name = "com.didi.virtualapk.core.C $ 1" / > < activité android: exportation = "false" android: launchMode = "singleTask" android: name = "com.didi.virtualapk.core.C $ 2" / > < activité android: exportation = "false" android: launchMode = "singleTask" android: name = "com.didi.virtualapk.core.C $ 3" / > < activité android: exportation = "false" android: launchMode = "singleTask" android: name = "com.didi.virtualapk.core.C $ 4" / > < activité android: exportation = "false" android: launchMode = "singleTask" android: name = "com.didi.virtualapk.core.C 5 $" / > < activité android: exportation = "false" android: launchMode = "singleTask" android: name = "com.didi.virtualapk.core.C $ 6" / > < activité android: exportation = "false" android: launchMode = "singleTask" android: name = "com.didi.virtualapk.core.C 7 $" / > < activité android: exportation = "false" android: launchMode = "singleTask" android: name = "com.didi.virtualapk.core.C $ 8" / > < activité android: exportation = "false" android: launchMode = "SingleInstance" android: name = "com.didi.virtualapk.core.D $ 1" / > < activité android: exportation = "false" android: launchMode = "SingleInstance" android: name = "com.didi.virtualapk.core.D $ 2" / > < activité android: exportation = "false" android: launchMode = "SingleInstance" android: name = "com.didi.virtualapk.core.D $ 3" / > < activité android: exportation = "false" android: launchMode = "SingleInstance" android: name = "com.didi.virtualapk.core.D $ 4" / > < activité android: exportation = "false" android: launchMode = "SingleInstance" android: name = "com.didi.virtualapk.core.D 5 $" / > < activité android: exportation = "false" android: launchMode = "SingleInstance" android: name = "com.didi.virtualapk.core.D $ 6" / > < activité android: exportation = "false" android: launchMode = "SingleInstance" android: name = "com.didi.virtualapk.core.D 7 $" / > < activité android: exportation = "false" android: launchMode = "SingleInstance" android: name = "com.didi.virtualapk.core.D $ 8" / > < service Android: exporté = "false" android: name = "com.didi.virtualapk.delegate.LocalService" / > < service Android: exporté = "false" android: name = "com.didi.virtualapk.delegate.RemoteService" android: processus = ": démon" > < intention-filtre > < l'action android: name = "com.example.bn.virtualapktest.intent.ACTION_DAEMON_SERVICE" / > < / Intent-filtre > < / service > < fournisseur Android: les autorités = "com.example.bn.virtualapktest.VirtualAPK.Provider" android: exporté = "false" android: name = "com.didi.virtualapk.delegate.RemoteContentProvider" android: processus = ": démon" / >

PS: Je ne sais pas ce que cela est peut-être la signification du bit pit (après étude après que je vais le dire à nouveau)

 Enfin, nous avons mis ce genre de choses dans la coquille manifeste, sera en mesure de fonctionnement normal, et peut être obtenu après avoir joué paquet jar VirtualAPK de plug-ins, est le shell + maison + modèle plugin.

----- Cliquez ci-dessus pour écouter l'interview de se concentrer sur la poursuite à sec

Lettre privée "666" pour demander Android Advanced Video (Flutter plug-in technologie de pointe, la technologie d'assainissement thermique)
Était une génération de déesse sexy avec l'ex-petit ami de trois ans a rompu en raison de l'humeur mal sentiments manger médecine
Précédent
Wei est la troisième année après la mort de l'Occident, « PPC médical » Baidu est de retour ......
Prochain
Est appelé « la plus belle Miss Hong Kong » fils de 38 ans est mariée à l'avant pour la première fois une exposition photo
téléphones futurs fera ses adieux à l'écran LCD?
« Pauvres » pousser et six articles pour répondre lavage projet porte, Tesla sera à Shanghai
Le volume maximum ECRU x Nike histoire? Blackie chaussures récentes préférés ne!
concert Ronald Cheng avec deux amis Tucao mais ils ont dans le programme organisé par TVB sur scène
Et l'effondrement d'un partage de voiture monté problème, mais aussi à quel point ouvert?
« Trois questions des entreprises appartenant à l'État », répond 15 entrepreneurs et experts à venir!
Seule la mère de 20 ans à venir! Kylie Jenner vaut plus de 900 millions $!
Charmaine continentale drame a joué dans le rôle féminin principal travaillera avec l'équipe Huang Xiaoming admettre à un prêt à six chiffres
« Le futur plan médias d'élite » inscription ouverte! Vous avez dans la voiture
« Le médecin a été arrêté Hong Mao vin » caution Nouvelles de Pékin a demandé à cinq événements interprovincial
Edison Chen et fan commentaires avec Shawn haine mutuelle formelle, Eason Chan, Miriam Yeung pause