47 votes

Android - plusieurs versions personnalisées de la même application

Quel est le meilleur moyen de déployer plusieurs versions personnalisées d'une application Android?

Actuellement, j'ai un script pour échanger le dossier de ressources pour obtenir une version personnalisée de mon application. Il fonctionne très bien, mais toutes les versions personnalisées ont toujours le même nom du paquet dans le AndroidManifest.xml. Par conséquent, il n'est pas possible d'installer deux versions personnalisées de l'application en même temps.

C'est une solution pour ce problème, mais ce qui doit être fait à la main

Pouvez-vous penser à un plus de solution facile, ou comment cela pourrait-il être intégré dans un skript?

(btw: il n'est pas pour un porno/spam/quel que soit l'application, pas même un payée)

24voto

larham1 Points 2088

Peut-être intégré dans Android "bibliothèque" ce concept n'était pas entièrement cuit au four au moment de la post original, mais il est peut-être la méthode préférée de 2011. Suivez ces étapes pour un ant:

À partir d'un travail d'application (appelons-le répertoire "myOrigApp", package com.foo.myapp), il suffit d'ajouter cette ligne à "par défaut.les propriétés" pour en faire une bibliothèque:

android.library=true

Maintenant, créez une nouvelle application à un frère ou une sœur répertoire de la manière que vous préférez (appelons-le répertoire "frère", package com.foo.myVariant). À l'aide de Intellij Idea, par exemple, créer un projet à partir de zéro " avec le répertoire 'frère' et il va créer tous les fichiers/répertoires dont vous auriez besoin.

Dans cette nouvelle, frère, sœur répertoire modifier "par défaut.propriétés" pour ajouter la dépendance:

android.library.reference.1=../myOrigApp

Copiez le Manifeste à partir de l'original dir:

cd sibling
cp ../myOrigApp/AndroidManifest.xml  ../myOrigApp/local.properties ../myOrigApp/build.properties  .

Modifier cette copie du fichier de Manifeste de changer son nom pour votre nouvelle variante, "com.foo.myVarient"; c'est le seul changement.

Si vous venez d'exécuter les scripts ant, vous avez peut-être fait. (J'ai eu un peu de configurer les clés de signature.)

Si vous souhaitez configurer un IDE comme Idée d'avoir le projet de bibliothèque en tant que dépendant de la variante du projet, suivez ces étapes pour ajouter un projet de bibliothèque pour la variante du projet (ce qui suppose que vous avez déjà un projet mis en place pour les deux):

  • Ouvrez le projet d'origine, les Paramètres du Projet, sélectionnez votre Facette et cochez la case "Est du Projet de Bibliothèque" et enregistrer.
  • Ouvrir la variante du projet, les Paramètres du Projet, sélectionnez les Modules
  • Ajouter un module
  • Sélectionnez "Importer un module existant"
  • Naviguez vers le répertoire d'Origine (myOrigApp) et sélectionnez son .iml fichier (IntelliJ projet fichier source)
  • Cliquez Sur "Terminer". (Le projet de bibliothèque est ajouté sous la forme d'un module à l'intérieur de la variante du projet.)
  • Dans la liste des modules, cliquez sur la Variante de projet pour le sélectionner.
  • Sur le côté droit, sélectionnez "Dépendances" de l'onglet.
  • Cliquez Sur "Ajouter..."
  • Choisissez le Module "dépendance..." (la liste doit apparaître qui inclut le nom du module/de la bibliothèque que vous avez précédemment ajouté au projet, peut-être la seule entrée dans la liste).
  • Sélectionnez le projet de bibliothèque que vous avez ajouté et appuyez sur OK. (Il sera ajouté à la liste des dépendances de votre projet.)
  • Appuyez sur OK pour terminer la configuration du projet. (Vous devriez voir 2 modules, avec les ressources de la bibliothèque et les classes disponibles et reconnu dans la Variante du projet.)

6voto

Prashast Points 4064

Ce que j'ai fait pour quelque chose de similaire, c'est simplement utiliser une tâche antlib, puis parcourir tous les fichiers java et xml pour remplacer mon ancienne chaîne de package par la nouvelle chaîne de package. Peu importait que les fichiers ne soient pas dans le bon chemin src selon le paquet. Faire juste un remplacement de regex pour tous les fichiers était suffisant pour que cela fonctionne ...

Par exemple, pour le remplacer dans tous vos fichiers Java sous le répertoire src:

  <replaceregexp flags="g" byline="false">
    <regexp pattern="old.package.string" /> 
    <substitution expression="new.package.string" />
    <fileset dir="src" includes="**/*.java" /> 
 </replaceregexp>
 

6voto

Devin Crane Points 115

Je conseille Gradle saveurs.

Cela semble expliquer toutes les notions de base vraiment bien. Je viens de terminer la conversion à l' Gradle aujourd'hui, et il fonctionne très bien. Application personnalisée, des icônes, des noms, et les chaînes de caractères, etc.

Le site explique, le but de ce modèle était de la rendre plus dynamique et plus facilement permettre à plusieurs Apk être créé avec essentiellement le même code, ce qui semble similaire à ce que vous êtes en train de faire.

J'ai probablement ne l'explique pas le meilleur, mais ce site fait un assez bon travail.

2voto

figofuture Points 71

Soutenir plusieurs partenaires Préparer config.xml

Projet de construction pour partenaire différent

 <!--partner.dir, pkg.name, ver.code, ver.name are input from command line when execute 'ant' -->

<!-- set global properties for this build -->
<property name="build.bin" location="bin"/>
<property name="build.gen" location="gen"/>
<property name="src" location="src"/>
<property name="res" location="res"/>

<target name="preparefiles" description="Prepare files for different partner" >
    <delete dir="${build.bin}" />
    <delete dir="${build.gen}" />

    <copy todir="${res}" overwrite="true" />
        <fileset dir="${partner.dir}/res" /> 
    </copy>

    <!-- change the import in all Java source files -->
    <replaceregexp file="AndroidManifest.xml"
        match='android.versionCode="(.*)"'
        replace='android.versionCode="${ver.code}"'
        byline="false">

    <replaceregexp file="AndroidManifest.xml"
        match='android.versionName="(.*)"'
        replace='android.versionName="${ver.name}"'
        byline="false">

    <replaceregexp file="AndroidManifest.xml"
        match='package="(.*)"'
        replace='package="${pkg.name}"'
        byline="false">

    <!-- change the package name in AndroidManifest -->
    <replaceregexp flags="g" byline="false">
        <regexp pattern="import(.*)com.myproject.com.R;" /> 
        <substitution expression="import com.${pkg.name}.R;" />
        <fileset dir="${src}" includes="**/*.java" /> 
    </replaceregexp>

    <replaceregexp flags="g" byline="false">
        <regexp pattern="(package com.myproject.com;)" /> 
        <substitution expression="\1&#10;import com.${pkg.name}.R;" />
        <fileset dir="${src}" includes="**/*.java" /> 
    </replaceregexp>
</target>
 

Préparer les fichiers $ ant -f config.xml -Dpartner.dir = "xxx" -Dpkg.name = "xxx" -Dver.code = "xxx" -Dver.name = "xxx" preparefiles

Créer build.xml Construire $ ant debug ou $ ant release

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