Android Studio construir sabores – Cómo tener archivos de la misma fuente en diversos sabores

Tengo que crear un sabor demo en el estudio de Android para una aplicación. En mi nivel de aplicación gradle archivo he creado otro sabor llamado demo y el sabor predeterminado de por supuesto. Se parece a esto:

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' } 

Y aquí está una imagen de mi estructura de proyecto en la que he creado un directorio demo de sabor:

Introduzca aquí la descripción de la imagen

Ahora en el tema. Tengo dos clases llamadas Hello.java. Ambos están en sus respectivos sabores e imprimen diferentes cosas. Te mostraré los dos archivos ahora:

 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"; }; } 

Y aquí está el otro Hola:

 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"; }; } 

Observe cómo el primer hello.java no tiene paquete, incluso si yo tenía un paquete que el IDE no compilará. mira esta foto:

Introduzca aquí la descripción de la imagen

Ahora, vamos a mirar a mainActivity.java para ver que cuando cambie las variantes de construcción sólo hace un brindis por "im de main", pero lo necesito para imprimir "im de demo" si uso la variante de demoDebug build. Construir la variante de demoDebug todavía imprime "im from main". ¿Alguien puede ayudar:

 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(); } } 

ACTUALIZAR

De stackoverflow dice:

Si quieres tener una versión diferente de la misma clase en los dos sabores, necesitarás crearlo en ambos sabores.

 src/flavor1/java/com/foo/A.java src/flavor2/java/com/foo/A.java 

Y entonces su código en src/main/java puede hacer:

 import com.foo.A 

Dependiendo del sabor seleccionado, se utiliza la versión correcta de com.foo.A

Esto es lo que quiero lograr con la clase Hello

Creo que no se puede tener la misma clase en sabor principal y su otro sabor. Usted debe apenas crear otro sabor, después mueve su clase de Hello del sabor principal a ese nuevo sabor. Esta regla es sólo para archivos .java. Quiero decir que usted puede tener un archivo xml en sabor principal y otra versión en su sabor personalizado, pero no se puede hacer esto con archivos java.

Aquí es un enlace útil con más explicación.

Yo recomendaría crear 3 conjuntos de fuentes:

  • Principal – que contendría clases comunes
  • Demo – contiene clases específicas de demostración
  • Pro – contiene clases para versiones pro

Y declararlos utilizando:

 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'] } } 

PS no realmente seguro acerca de la sintaxis de java.srcDirs contenido – por favor, doble control de sí mismo

Podía anular clases pero la clave era no incluir la clase en mi carpeta principal.

Por lo tanto, la variante de compilación fullDebug (es decir, la carpeta principal) nunca se ejecutará. Siempre ejecute un sabor y no la carpeta principal. La carpeta principal sólo se utilizará para mantener las cosas comunes en ella.

En mi caso tuve una demo para USA y otro país (demo y demo_us) y necesitaba dos sabores. Siempre voy a construir para cualquiera de los dos y no se construirá principal.

Introduzca aquí la descripción de la imagen

De la imagen que usted puede ver hice que todos mis nombres del paquete sean iguales: com.example.******.myapplication . Dado que todos tienen el mismo nombre de paquete en MainActivity , sólo importa Hello.java con ese nombre de paquete y seleccionará la variante correcta en el momento de la compilación.

Para los recursos parece que es diferente y se anulará naturalmente, pero los archivos de clase java tienen que hacer de esta manera.

  • ¿Cómo ocultar el teclado sólo con un toque fuera de un edittext?
  • La pantalla del emulador de Android llena sólo una parte de fracción de la pantalla del emulador de Android actual
  • ¿Existe la opción "Guardar como" en el menú del archivo de Android Studio?
  • Cardview con separadores en ella
  • No se puede abrir DDMS en Android Studio. Aparece el misterioso error de Eclipse
  • Prueba de vibración de Android emulador?
  • Cómo activar Instant Run en AndroidStudio 2.0
  • Diferencia entre TextInputLayout y TextInputEditText
  • No se puede iniciar AVD en el emulador Android Studio
  • Android @NonNull utilidad
  • Carpetas orientables de Android Studio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.