Construya androide con gradle, substituya la cadena cada sabor del producto

Antes de que yo construya el proyecto de androide a dos diversa aplicación pagada y libre.

Cambié todos los valores y cadenas de manera que ayer cometí un gran error.

Por lo tanto, estoy laerning cómo utilizar gradle para construir mi aplicación.

Mi aplicación tiene algunas diferencias.

  1. Nombre de la aplicación (solo agrega el sufijo '-Free') -> values ​​/ string.xml

  2. Cambio de bandera en mi * .java

// signedConfigs es ommited.

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 construida no cambió nada en absoluto.

Lo que extrañé

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 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 un enum (que debe definirse en algún lugar de su código java):

 public enum MonetizationType { PAID, FREE } 

Ahora puede utilizar esto en cualquier lugar como este:

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

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

Utilice 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 (al igual que strings.xml), pero con sólo una cadena: la que desea ser diferente dependiendo del sabor. (No es necesario tener un apptitle.xml en el directorio main / 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 las cadenas de diferentes maneras, pero me gusta mantener las cadenas anuladas separadas del resto para mayor claridad.

La respuesta aceptada no está funcionando con las versiones más recientes de Gradle. Necesita 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" } 

}

TreesAreEverywhere's answer (así como nombre de usuario) está bien. Pero también es muy valioso saber que Android Studio simplificará en gran medida el proceso de crear archivos de recursos específicos de sabor o atributo.

En la ventana del proyecto AS, haga clic con el botón derecho en la carpeta res / values ​​y seleccione Nuevo> Valores del archivo de recursos. A continuación, el nombre (por ejemplo, "cadenas"), seleccione el conjunto de origen si no es el valor predeterminado, y seleccione cualquier cualificadores deseados (por ejemplo, ancho de pantalla = 800). Esta es la forma más sencilla de asegurarse de que está poniendo las anulaciones de recursos donde el compilador las quiere.

Así es como lo hice en mi proyecto. He creado múltiples tipos de construcción en lugar de sabores. Esta solución agregará un prefijo al nombre del paquete basado en el tipo de compilación que intenta ensamblar. Por ejemplo, para dev el nombre del paquete será com.sample.myapp.dev y de forma similar para el nombre del paquete beta se cambiará a com.sample.myapp.release. Puede ajustarlo para obtener prefijos gratuitos y pagados. 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 } } 
  • Android Studio Gradle androidTest vs instrumentTest
  • Android - Proguard con httpcore y httpmime con Android Studio y Gradle
  • No se encontró com.android.tools.build:gradle:3.0.0-alpha1 en el círculo ci
  • Android Studio 0.5.2 Gradle Refresh Project falló
  • ¿Cómo evitar que el estudio de Android use el camino absoluto?
  • Android gradle prueba sólo un sabor
  • Utilice un campo local.properties al declarar un archivo buildConfigField
  • Android Studio 0.8.2 "La sincronización del proyecto Gradle falló."
  • ¿Cuál es el alcance de dependencia por defecto en Gradle en Android?
  • Importar BaseGameUtils a Android Studio
  • Uso de SDK de Amazon Web Service para Android en Android Studio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.