versiones tutorial studio sistema quien productflavors operativo now must flavors flavor creo configurar belong all android gradle

tutorial - productflavors android studio



Crea android con gradle, reemplaza la cadena de cada sabor de producto (4)

Antes de construir el proyecto de Android para dos aplicaciones diferentes pagas y gratis.

Cambié cada valor y cuerda, así que ayer cometí un gran error.

Por lo tanto, estoy al tanto de cómo usar gradle para construir mi aplicación.

Mi aplicación tiene algunos diferentes.

  1. nombre de la aplicación (simplemente agregue el sufijo ''-Free'') -> values ​​/ string.xml

  2. cambiar la bandera en mi * .java

// signingConfigs se omite.

productFlavors{ free{ packageName "my.app.free" versionCode 20 signingConfig signingConfigs.freeConfing copy{ from(''/res''){ include ''**/*.xml'' } into ''build/res/'' filter{ String line -> line.replaceAll("android:label=/"@string/app_name/"", "android:label=/"@string/app_name_free/"") } } copy{ from(''/src''){ include ''**/*.java'' } into ''build/src/'' filter{ String line -> line.replaceAll("public static final Boolean IS_FULL_VER = true;", "public static final Boolean IS_FULL_VER = false;") } } } paid{ packageName "my.app.paid" versionCode 20 signingConfig signingConfigs.paidConfing } }

pero, la aplicación creada no cambió nada en absoluto.

¿Lo que me faltaba?


Consulte la documentación sobre los product flavors :

http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors

En su build.gradle , en cada sabor, puede definir los indicadores que se generarán en su archivo BuildConfig.java :

productFlavors { free { packageName "com.company.appfree" buildConfig "public final static com.company.common.MonetizationType monetizationType = com.company.common.MonetizationType.FREE;" } paid { packageName "com.company.apppaid" buildConfig "public final static com.company.common.MonetizationType monetizationType = com.company.common.MonetizationType.PAID;" } }

Este ejemplo utiliza una enumeración (que debe definir en algún lugar de su código Java):

public enum MonetizationType { PAID, FREE }

Ahora puede usar esto en cualquier lugar como este:

if (BuildConfig.monetizationType == MonetizationType.FREE) { ... }

Para anular los recursos, puede crear diferentes archivos de recursos en las carpetas de origen para cada sabor:

Usa la siguiente estructura

app/build.gradle app/ [.. some other files...] app/src/main/ app/src/main/java app/src/main/res app/src/main/assets app/src/main/AndroidManifest.xml app/src/free/res/values/apptitle.xml app/src/paid/res/values/apptitle.xml

apptitle.xml sería un archivo de recursos de cadena (como strings.xml), pero con una sola cadena: la que desea que sea diferente según el sabor. (No necesita tener un apptitle.xml en su directorio principal / res).

<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools"> <string name="app_title">App Title (or whatever you want)</string> </resources>

Es posible que pueda anular cadenas de diferentes maneras, pero me gusta mantener las cadenas reemplazadas separadas del resto para mayor claridad.


Así es como lo hice en mi proyecto. Creé varios tipos de compilación en lugar de sabores. Esta solución agregará un prefijo al nombre de su paquete en función del tipo de compilación que está intentando ensamblar. Por ejemplo, para dev, el nombre del paquete será com.sample.myapp.dev y, de forma similar, el nombre del paquete beta se cambiará a com.sample.myapp.release. Puede modificarlo para obtener prefijos gratuitos y pagos. Espero que ayude

buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro'' signingConfig signingConfigs.production applicationIdSuffix ''.release'' versionNameSuffix ''-RELEASE'' } dev { signingConfig signingConfigs.debug applicationIdSuffix ''.dev'' versionNameSuffix ''-DEV'' } beta { signingConfig signingConfigs.debug applicationIdSuffix ''.beta'' versionNameSuffix ''-BETA'' } debug { signingConfig signingConfigs.debug applicationIdSuffix ''.debug'' versionNameSuffix ''-DEBUG'' debuggable true } }


La respuesta de treesAreEverywhere (así como el nombre de usuario) es correcta. Pero también es muy valioso saber que Android Studio simplificará en gran medida el proceso de creación de sabor o atributos de archivos de recursos específicos.

En la ventana del proyecto AS, haga clic con el botón derecho en la carpeta res / values ​​y seleccione Nuevo> Archivo de recursos de valores. Luego, asígnele un nombre (por ejemplo, "cadenas"), seleccione el conjunto Fuente si no es el predeterminado y seleccione los calificadores que desee (por ejemplo, Ancho de pantalla = 800). Esta es la forma más fácil de asegurarse de que está reemplazando sus recursos donde el compilador los quiere.


La respuesta aceptada no funciona con las versiones más nuevas de Gradle. buildConfig reemplazar buildConfig con buildConfigField para obtener el mismo resultado:

productFlavors { free { packageName "com.company.appfree" buildConfigField "com.company.common.MonetizationType", "MONETIZATION_TYPE", "company.common.MonetizationType.FREE" } paid { packageName "com.company.apppaid" buildConfigField "com.company.common.MonetizationType", "MONETIZATION_TYPE", "company.common.MonetizationType.PAID" }

}