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)