comment construire une APK et séparer les bibliothèques que l'application charge dynamiquement

le résumé court est: comment construire une APK et des bibliothèques séparées (par lesquelles je veux dire des ensembles de classes (et idéalement, des ressources aussi) sous une forme quelconque, tels que des fichiers JAR, AAR ou DEX), mais ne pas inclure ces bibliothèques dans L'APK; au lieu de cela, l'application Les charge au moment de l'exécution?

détail

donc ma question principale est de savoir comment construire une telle application (par exemple configuration Gradle). Comment spécifier quelles classes vont dans quels fichiers JAR ou DEX? Puis-je créer un Android Module Studio pour chaque fichier DEX avec lequel je veux finir?

une question étroitement liée est de savoir comment le code Java doit ensuite charger les bibliothèques externes et accéder à leurs classes au moment de l'exécution. Pour ce dernier, j'espère que l'approche montrée à accéder aux classes d'application à partir du fichier dex par classloader fonctionnerait.

j'ai essayé les instructions à https://developer.android.com/studio/projects/android-library.html , mais qui construit une APK que fait inclure la bibliothèque de dépendances.

j'ai aussi essayé Multidex ( https://developer.android.com/studio/build/multidex.html ), mais cela ne semble pas laisser au développeur le contrôle sur les classes dans lesquelles DEX file, et en outre, les empaquette tous dans une seule APK. AFAICT il n'y a aucun moyen de contrôler le chargement de ces fichiers DEX au moment de l'exécution.

arrière-plan

il y a une possibilité de " x-y problem " ici, donc je ferais mieux d'expliquer le contexte.

je construis une application pour un client. Il ne sera pas distribué via une app store, donc il n'aura pas accès au mécanisme normal pour les mises à jour. Au lieu de cela, le client veut que l'application soit en mesure de se mettre à jour en téléchargeant de nouveaux composants pour remplacer les anciens composants, sans avoir besoin de sideload manuellement une nouvelle APK. La raison principale ici est que les mises à jour doivent être faciles pour les utilisateurs non techniques. Si l'application peut contrôler le processus de mise à jour, il peut le rendre lisse et guider l'utilisateur.

de plus, l'application sera utilisée dans les zones où l'accès à internet est rare et coûteux, de sorte que le client veut être en mesure de publier des mises à jour de l'application en petits morceaux (par exemple 2 Mo) plutôt que de forcer l'utilisateur à télécharger à nouveau l'application dans son intégralité pour recevoir une petite mise à jour.

un aspect des exigences que je devrais mentionner, au cas où cela serait important, est que les bibliothèques à charger à l'exécution sont supposées vivre sur une carte microSD. Cela peut également faciliter la distribution de 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.

31
demandé sur Community 2016-08-27 00:58:43

2 réponses

ce tutoriel est un bon début pour le chargement externe de fichiers DEX. Seulement trois petits fichiers de source (MainActivity.java, LibraryInterface.java, LibraryProvider.java) et il copie secondary_dex.jar à partir du dossier assets, vers le stockage d'application interne [outdex/dex] (l'internet est également indiqué comme possible dans le tutoriel). Vous devez le construire avec ant , parce qu'il utilise des étapes de construction personnalisées. 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é sur Android Studio gradle (pas besoin de ant). https://github.com/timrae/custom-class-loader

testé ok . Copies com.exemple.toastlib.jar de la SDcard en interne stockage de l'application [outdex/dex],(pas du dossier des actifs). (vous devez me lire le README.md fichier dans le projet de le construire).

Q: Comment ajouter une activité, Je ne peux pas l'ajouter au manifeste ?

A: Utiliser 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 pouvoir fusionner ses ressources du projet les ressources propres (R.).

: Hacks sont disponibles, les Données de fichier...

Emballage Android fichiers de ressources au sein d'une distribuable fichier Jar

Q: le fichier externe a de mauvaises permissions.

: l'Importer.

Q: je dois ajouter uses-permission.

a: utiliser API23 vous pouvez ajouter par programmation utilisations-permissions (mais ils doivent encore être déclaré dans le Manifeste, de sorte que le nouveau modèle de permissions n'est probablement pas très utile pour nous).

cette section est pour les utilisateurs plus généraux (@LarsH a des exigences plus spécifiques sur les mises à jour), l'exemple ci-dessus est 17KB apk et 1KB jar. Vous pouvez mettre le gros de votre code dans le bocal unique, et les mises à jour impliqueraient simplement de charger un nouvel Apk (et ensuite d'importer les code jar, pour minimiser le transfert de données). Lorsque L'Apk devient trop grand, recommencez avec une petite Apk et tout a migré dans un autre bocal (importer 2 pots). Vous devez équilibrer l'effort de codage, l'expérience de l'utilisateur, la maintenabilité, la soutenabilité, la bande passante, les règles android, les règles play store (si ces mots existent ;O)).

NOTE Dalvik est discontinué

le successeur de Dalvik est Android Runtime( ART), qui utilise le même bytecode et .fichiers dex (mais pas .odex), avec la succession visant à des améliorations de performance transparentes 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 a remplacé Dalvik entièrement dans les versions ultérieures; Android 5.0 "Lollipop" est la première version dans laquelle ART est la seule exécution incluse.

6
répondu Jon Goodwin 2017-05-23 12:33:45

vous pouvez essayer de construire plusieurs apk avec le même sharedUserId et le même process .

c'est le mécanisme de plugin utilisé par Threema

Edit: en savoir 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 microphone

1
répondu larsgrefer 2016-09-02 10:29:54