31 votes

comment construire un APK et les bibliothèques distinctes que l'application charge dynamiquement

Le résumé est: Comment puis-je construire un APK et les bibliothèques distinctes (par qui je veux dire des ensembles de classes (et, idéalement, des ressources trop) dans certaines formes, telles que le POT, l'AAR ou DEX fichiers), mais de ne pas inclure ces bibliothèques dans le APK; au lieu de cela, l'application des charges au moment de l'exécution?

Détail

Donc ma question principale est de savoir comment construire une application (ex: Gradle de configuration). Comment puis-je spécifier les classes qui en POT ou en DEX fichiers? Puis-je créer un Android Studio module pour chaque DEX fichier que j'ai envie de finir avec?

Un étroitement liés à la question est de savoir comment le code Java doit alors charger les bibliothèques externes et d'accéder à leurs classes au moment de l'exécution. Pour ce dernier, j'ai l'espoir que l'approche présentée à l'accès aux classes de l'application de dex fichier par le chargeur de classe serait de travailler.

J'ai essayé les instructions à https://developer.android.com/studio/projects/android-library.htmlmais qui construit un APK qui ne comprennent que la dépendance de la bibliothèque.

J'ai aussi essayé de Multidex (https://developer.android.com/studio/build/multidex.html), mais qui ne semblent pas à quitter le développeur de tout contrôle sur les classes qui vont dans lequel DEX fichier, et de plus, les colis dans un seul et unique fichier APK. AFAICT il n'y a aucun moyen de contrôler le chargement de ces DEX fichiers au moment de l'exécution.

Arrière-plan

Il y a une possibilité de "X-Y " problème" ici, donc je ferais mieux expliquer le contexte.

Je suis en train de construire une application pour un client. Il ne va pas être distribués par le biais de l'app store, afin de ne pas avoir accès au mécanisme normal pour les mises à jour. Au lieu de cela, le client veut de l'application pour être en mesure de se mettre à jour en téléchargeant de nouveaux composants de lui-même, afin de remplacer les anciens composants, sans devoir manuellement sideload une nouvelle APK. Le principal motif est ici que les mises à jour doivent être facile pour les utilisateurs non-techniques. Si l'application peut contrôler le processus de mise à jour, il peut la rendre lisse et guide de l'utilisateur.

En outre, l'application sera utilisée dans des zones où l'accès à internet est rare et cher, de sorte que le client veut être en mesure d'émettre des mises à jour des applications dans de plus petits morceaux (par exemple, 2 MO) plutôt que de forcer l'utilisateur à le re-télécharger l'ensemble de l'application pour recevoir une petite mise à jour.

L'un des aspects les exigences que je dois mentionner, en cas de questions, c'est que les bibliothèques être chargé au moment de l'exécution sont censés vivre sur une carte microSD. Cela peut aussi aider à la distribution des mises à jour sans accès à internet.

L'état actuel de l'application est qu'il est d'environ 50% écrit: C'est un couple de versions antérieures ont été libérés, mais l'application doit être modifié (restructuré) afin de répondre aux exigences ci-dessus, ainsi que d'autres.

6voto

Jon Goodwin Points 5730

Ce tutoriel est un bon début pour charge externe des DEX fichiers. Seulement trois petits fichiers de la source (MainActivity.java, LibraryInterface.java, LibraryProvider.java) et des copies secondary_dex.jar à partir du dossier des ressources, en application interne de stockage [outdex/dex] (l'internet est également précisé que possible dans le tutoriel). Vous avez à construire avec les fourmis, car il utilise des étapes de génération personnalisée. Je l'ai essayé, il fonctionne très bien. En valeur un regard.
classe personnalisée de chargement en Dalvik et ART


Mise à JOUR ce code a été porté à Android Studio gradle (pas besoin de fourmi). https://github.com/timrae/custom-class-loader
Testé ok. Des Copies com.example.toastlib.jar à partir de la carte sd en interne de stockage d'une application [outdex/dex],(pas du dossier des actifs). ( vous devez lire le fichier README.md fichier dans le projet de construire).

Q: Comment puis-je ajouter une Activité, je ne peux pas l'ajouter à la manifester ?
A: Utilisation De Fragments, ils n'ont pas besoin d'entrées dans le manifeste.

Q: Un Bocal avec des ressources qui est destiné à être ajouté à une le projet doit être en mesure de fusionner ses ressources du projet les ressources propres (R.).
Un: Hacks sont disponibles, les Données du fichier...
Emballage Android fichiers de ressources au sein d'une distribuable fichier Jar

Q: Le fichier externe a un mauvais autorisations.
Un: l'Importer.

Q: j'ai besoin d'ajouter uses-permission.
A: Utilisez API23 vous pouvez ajouter par utilisations des autorisations (mais ils ont encore besoin d'être déclarés dans le Manifeste, de sorte que le nouveau modèle d'autorisations est probablement pas une grande utilité pour nous).

Cette section est pour les utilisateurs (@LarsH a des exigences plus spécifiques sur les mises à jour), L'exemple ci-dessus est 17kb apk et 1 ko jar. Vous pourriez mettre la majeure partie de votre code dans le bocal, et les mises à jour impliquerait vient de charger un nouveau fichier Apk (puis de l'importer la majeure partie de code jar, afin de minimiser le transfert de données). Lorsque l'Apk est trop grand, de commencer à nouveau avec une petite Apk et tout migré vers un autre pot (import 2 pot de l'). Vous avez besoin d'équilibrer l'effort de codage, d'expérience utilisateur, de la maintenabilité, de prise en charge de la bande passante, android règles, magasin de jeu de règles (si ces mots existent même ;O)).

NOTE Dalvik est interrompu

Le successeur de Dalvik est Android Runtime (ART), qui utilise la même bytecode et .dex fichiers (mais pas .odex fichiers), avec la succession visant à des améliorations de performances transparente pour les utilisateurs finaux. Le nouvel environnement d'exécution a été inclus pour la première fois dans Android 4.4 "KitKat", comme un aperçu de la technologie, et de remplacer Dalvik entièrement dans les versions ultérieures; Android 5.0 "Lollipop" est la première version dans laquelle l'ART est la seule inclus l'exécution.

1voto

larsgrefer Points 1692

Vous pourriez essayer de construire plusieurs apk avec la même sharedUserId et le même processus.

C'est le plugin mécanisme utilisé par Threema

Edit: Plus sur Theema

Threema a une application principale et deux plugins:

Faire l'application principale n'a pas besoin d'autorisations pour accéder à la caméra ou le microphone

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X