web-dev-qa-db-fra.com

Plusieurs fichiers Android Package d'application .apk à partir du code source unique

Je voudrais qu'une Android procédure système de génération, ligne de commande ou Eclipse, génère plusieurs fichiers .apk à partir d'une base de code source unique. Quelques raisons courantes à cela - avoir des versions spécifiques pour des marchés avec des exigences une version gratuite et payante.

Cette question IS [~ # ~] pas [~ # ~] À PROPOS:

Google dit "vous devez probablement créer des projets Android Android pour chaque APK que vous souhaitez publier afin de pouvoir les développer séparément de manière appropriée. Vous pouvez le faire en dupliquant simplement votre projet existant et lui donner un nouveau nom. "Ensuite, ils suggèrent gentiment d'utiliser des bibliothèques, ce que je comprends. Ensuite, ils mentionnent en passant exactement ce que je veux:" un système de build qui peut générer différentes ressources en fonction de la configuration de build "

  • Je sais que pour effectuer une compilation conditionnelle en Java , on peut désactiver une variable 'final statique public'. Il y a exemple d'ajustement une telle valeur dans build.xml. Un exemple plus complet d'une configuration de build Android Ant pour ceci ou un lien vers un projet OSS qui le fait maintenant, s'il vous plaît? BTW, build.xml est généré automatiquement, mais j'ai vu des gens pirater , alors comment ça marche?

  • Avec le nom du package déclaré dans Manifest.xml comme package = "com.example.appname", si l'on a besoin d'émettre plusieurs .apks qui varient ce nom, est-on coincé avec un projet distinct pour chacun?

49
Walter K

Je génère 2 APK différents (démo et production) à partir d'une seule arborescence source avec 3 petites modifications:

1) J'ai public static final DEMO=true; //false; dans ma classe Application et en fonction de cette valeur, j'ai utilisé pour basculer le code entre les fonctionnalités de démonstration/production

2) Il y a 2 activités principales, comme:

package mypackage;
public class MyProduction extends Activity 
{
    //blah-blah
}

package mypackage.demo;
public class MyDemoActivity extends mypackage.MyProductionActivity
{
    //blah-blah
}

3) Et au final 2 _ AndroidManifest.xml fichiers qui pointent vers différentes activités de lancement en fonction du commutateur de démonstration/production

Je bascule manuellement entre 2 APK, mais je ne vois rien de difficile à écrire une petite tâche ANT pour basculer automatiquement entre eux

11
barmaley

Une façon de le faire serait de gérer deux AndroidManifest.xml distincts, un pour chaque configuration. Vous pouvez basculer entre les deux manuellement (copie) ou automatiquement (script de génération).

[modifier] Cette personne ici a un système pour faire ce genre de chose: http://blog.elsdoerfer.name/2010/04/29/Android-build-multiple-versions-of-a-project/

10
Emmanuel

La réponse à ce hurle Gradle, comme expliqué sur ce site Web . Il est officiellement intégré à Android Studio et est encouragé.

C'est incroyable; J'ai construit 3 applications distinctes en utilisant le même code source, avec du texte et des graphiques personnalisés, sans aucun codage spécial. Juste un répertoire et une configuration de Gradle sont nécessaires, et d'autres messages à moi peuvent être trouvés avec des réponses aux deux.

Cela semble vraiment bien expliquer toutes les bases. Pour la réponse à votre question spécifique, recherchez la section Product Flavors sous Build Variants, où il décrit la spécification de différentes saveurs.

Comme l'explique le site Web, une partie de l'objectif de cette conception était de la rendre plus dynamique et de permettre plus facilement la création de plusieurs fichiers APK avec essentiellement le même code, ce qui ressemble exactement à ce que vous faites.

Je ne l'ai probablement pas expliqué le mieux, mais ce site Web fait un très bon travail.

5
craned

Malgré votre insistance sur le fait qu'il ne s'agit pas d'empaqueter du code partagé dans des bibliothèques Android, c'est en quelque sorte le cas. Vous avez déclaré que les marchés peuvent avoir des exigences différentes ou avoir une version gratuite et payante. Dans chaque de ces exemples, vos deux fichiers APK de sortie finaux ont un comportement et/ou des ressources différents. Vous pouvez placer la grande majorité de votre code dans une bibliothèque partagée Android, puis conserver les différences dans vos projets réels). .

Par exemple, j'ai travaillé sur des applications où elles doivent être publiées sur le marché Android et Amazon AppStore. L'Amazon AppStore exige que si vous vous connectez à une page de marché pour l'application, il doit s'agir d'Amazon (par opposition à la page Android Market). Vous pouvez stocker une URL dans une ressource de la bibliothèque et l'utiliser dans votre code, puis remplacer cette ressource dans le projet Amazon pour pointer vers l'URL Amazon appropriée.

Si vous le structurez correctement, vous pouvez faire des choses similaires dans le code car votre point de départ est votre objet Application avec lequel vous pouvez sous-classer et faire différentes choses.

Cela dit, si vous souhaitez ajouter une étape Ant qui modifie le nom du package dans le manifeste, il est juste XML. Cela ne devrait pas être difficile à modifier comme étape de précompilation.

3
kabuko

Cet article a une bonne procédure pas à pas avec des exemples de modification de fichiers de configuration au moment de la construction; voir en particulier le Personnalisation de la construction et Utilisation d'un fichier de configuration Java Java . Notez que certaines des informations sur build.xml et ant sont un peu obsolètes maintenant .

2
Graham Borland

J'ai eu le même problème mais emballer le tout dans un même projet avec des drapeaux n'est pas une solution pour moi. J'ai écrit un exemple comment faire cela avec Maven:

Comment créer plusieurs Android à partir d'une base de code organisée par un projet multi-module Maven.

2
Bevor

Mon équipe construit 2 versions différentes en utilisant une base de code unique + du code supplémentaire. Comme Android build est basé sur le script ant, j'utilise le script ant pour faire ce travail.

J'ai utilisé xmltask pour manipuler le fichier XML manifeste et de nombreuses tâches ant (regexp, copie ..) pour éditer le code source.

J'ai préparé un modèle de projet de modèle (y compris build.xml, default.properties, local.properties) et copié le nouveau code source dans ces modèles de projet. une fois la copie terminée, exécutez build.xml en parallèle pour raccourcir le temps de génération. une fois la construction terminée, j'obtiens plusieurs fichiers apk.

1
kingori

Il est facile d'atteindre votre objectif en utilisant Android Variantes de build Studio qui utilisent graddle comme système de build.

Vérifiez ici pour des informations plus détaillées.

1
alijandro

Voici notre situation: nous avons une base de code unique à partir de laquelle nous publions pour plusieurs clients. Chacun d'eux a différentes exigences concernant les titres, les arrière-plans et autres ressources dans l'application (sans parler des noms de package).

La construction est gérée par un script Ruby qui modifie AndroidManifest, copie/remplace certaines ressources des dossiers spécifiques au client, puis passe à la routine de construction standard d'Android. Une fois la génération terminée , le script réinitialise les fichiers modifiés à leur état d'origine par défaut.

Eh bien ... Peut-être que ce n'est pas optimal et certainement pas spécifique à Android, mais c'est comme ça que nous le faisons.

1
Ash

Je pense que le meilleur moyen reste d'utiliser libray pour les sources communes et deux différents projets Android pour la démo et le package de production. Ceci parce que dans Java c'est très simple) pour effectuer une ingénierie inverse de l'apk vers les sources. Si vous utilisez les mêmes sources pour la démonstration et la production, quelqu'un pourrait pirater votre apk en téléchargeant le package de démonstration, en extrayant les Java sources et déverrouillez les sources en changeant le variable pour l'utiliser comme version de production. Avec la bibliothèque, vous pouvez conserver une partie des sources dans le package de production, de cette façon, il n'y a aucun moyen d'utiliser le package de démonstration comme package de production.

0
Enrico Serretti