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:
- Continúa el informe de cobertura de código jacoco después de un caso de prueba fallido
- Android Studio: "nuevo módulo -> importar proyecto existente" vs. "importar módulo"
- Cómo cambiar el nombre del proyecto en Android Studio
- Android Studio obtiene una advertencia obsoleta incluso con @SuppressWarnings ("deprecation")
- Layout-xlarge es ignorado usando el emulador Nexus 10 en Android Studio 1.4.1
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:
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
- Excepción de Android Studio generada durante la reproducción
- Cómo poner TODO comentarios en xml?
- Errores del emulador después de la actualización a Studio 1.4
- Crashlytics android studio gradle build fallado
- ¿Por qué Android Studio no me permite crear clases Java?
- ¿Cuál es la manera correcta de insertar una actividad en otro proyecto?
- ¿Cómo puedo añadir las fuentes en el editor de Android Studio
- Sabores de Gradle para Android con conjuntos de fuentes personalizadas - ¿Cómo deberían ser los archivos de gradle?
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.
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 hacer referencia a un atributo de tema en un estilo?
- ¿El registro reduce la velocidad de una aplicación de producción de Android?