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:
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:
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();
}
}
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
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.
Je conseillerais de créer 3 sets sources:
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
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.
À 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.