web-dev-qa-db-fra.com

Android Flavours de construction de Studio - Comment avoir les mêmes fichiers source dans diverses saveurs

J'ai besoin de créer une saveur de démonstration dans Android studio pour une application. Dans mon fichier gradle au niveau de l'application, j'ai créé une autre saveur appelée démo et la saveur par défaut de bien sûr. Cela ressemble à ceci:

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 22
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.example.uen229.myapplication"
        minSdkVersion 17
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {
        demo {
            applicationId "com.buildsystemexample.app.demo"
            versionName "1.0-demo"
        }
        full {
            applicationId "com.buildsystemexample.app.full"
            versionName "1.0-full"
        }
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.Android.support:appcompat-v7:22.2.0'
}

et voici une image de la structure de mon projet dans laquelle j'ai créé un répertoire de saveurs de démonstration:

enter image description here

Passons maintenant à la question. J'ai deux classes appelées Hello.Java. Les deux sont là-bas dans des saveurs respectives et impriment différentes choses. Je vais vous montrer les deux fichiers maintenant:

import Android.util.Log;

/** this is from demo flavor directory**/

public class Hello {

    Hello(){

        Log.v("","hello from demo");
    }

    public String getName();
        return "im from demo";

    };

}

Et voici l'autre bonjour:

package com.example.uen229.myapplication;

import Android.util.Log;


/** this is from full or main flavor directory**/
public class Hello {


    Hello(){

        Log.v("", "hello from main");
    }

    public String getName(){

        return "im from main";

    };
}

remarquez comment le premier hello.Java n'a pas de package, même si j'avais un package que le IDE ne compilera pas. regardez cette photo:

enter image description here

Maintenant, regardons enfin mainActivity.Java pour voir que lorsque je change de version, il ne fait que porter un toast pour "im from main" mais j'en ai besoin pour imprimer 'im from demo "si j'utilise la variante de construction demoDebug. Si je change la build variant to demoDebug il affiche toujours "im from main". Quelqu'un peut-il aider:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Hello h = new Hello();
        Toast.makeText(this, h.getName(), Toast.LENGTH_LONG).show();

    }
}

METTRE À JOUR

De stackoverflow il dit:

Si vous voulez avoir une version différente de la même classe dans les deux saveurs, vous devrez la créer dans les deux saveurs.

src/flavor1/Java/com/foo/A.Java

src/flavor2/Java/com/foo/A.Java

Et puis votre code dans src/main/Java peut faire:

import com.foo.A

selon la saveur choisie, la bonne version de com.foo.A est utilisé.

C'est ce que je veux accomplir avec la classe Hello

16
j2emanue

Je pense que vous ne pouvez pas avoir la même classe de saveur principale et votre autre saveur. vous devez simplement créer une autre saveur, puis déplacer votre classe Hello de la saveur principale vers cette nouvelle saveur. cette règle s'applique uniquement aux fichiers .Java. Je veux dire que vous pouvez avoir un fichier xml en version principale et une autre version dans votre version personnalisée, mais vous ne pouvez pas le faire avec les fichiers Java.

ici est un lien utile avec de plus amples explications.

14

Je conseillerais de créer 3 sets sources:

  • main - qui contiendrait des classes communes
  • démo - contient des classes spécifiques à la démo
  • pro - contient des classes pour les versions pro

et les déclarer en utilisant:

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        Java.srcDirs = ['src/main/Java']
        res.srcDirs = ['src/main/res']
        assets.srcDirs = ['src/main/assets']
    }
    pro {
        manifest.srcFile 'src/pro/AndroidManifestPro.xml'
        Java.srcDirs = ['src/main/Java', 'src/pro/Java']
    }
    demo {
        manifest.srcFile 'src/oldlite/AndroidManifestDemo.xml'
        Java.srcDirs = ['src/main/Java', 'src/demo/Java']        
    }
}

P.S. pas vraiment sûr de la syntaxe de Java.srcDirs contenu - veuillez vérifier vous-même

4
Barmaley Red Star

J'ai pu remplacer les classes mais la clé n'était pas d'inclure la classe dans mon dossier principal.

Ainsi, la variante de construction fullDebug (c'est-à-dire le dossier principal) ne sera jamais exécutée. Exécutez toujours une version et non le dossier principal. Le dossier principal ne sera utilisé que pour y conserver des éléments communs.

Dans mon cas, j'avais une démo pour les États-Unis et un autre pays (démo et demo_us) et j'avais besoin de deux saveurs. Je construirai toujours pour l'un des deux et ne construirai pas le principal.

enter image description here

À partir de l'image que vous pouvez voir, j'ai fait que tous les noms de mes packages soient identiques: comme com.example.******.myapplication. Puisqu'ils ont tous le même nom de package dans le MainActivity vous venez d'importer Hello.Java avec ce nom de package et il choisira la bonne variante au moment de la construction.

Pour les ressources, il semble que ce soit différent et il remplacera naturellement mais Java doivent le faire de cette façon.

2
j2emanue