Создайте андроид с помощью gradle, замените строку на каждый вкус продукта
Прежде чем я создам проект Android для двух разных приложений, оплаченных и бесплатных.
Я изменил все значения и строки, поэтому вчера я совершил большую ошибку.
Итак, я занимаюсь тем, как использовать gradle для создания моего приложения.
У моего приложения несколько разностей.
//подписьConfigs ограничена.
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
}
}
но встроенное приложение ничего не изменило.
Что я пропустил?
Ответы
Ответ 1
Смотрите документацию на product flavors
:
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors
В вашем build.gradle
, в каждом вкусе вы можете определить флаги, которые будут сгенерированы в вашем файле 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;"
}
}
В этом примере используется перечисление (которое вам нужно определить где-то в вашем Java-коде):
public enum MonetizationType {
PAID, FREE
}
Теперь вы можете использовать это в любом месте:
if (BuildConfig.monetizationType == MonetizationType.FREE) { ... }
Для переопределения ресурсов вы можете создавать разные файлы ресурсов в папках источника для каждого аромата:
Используйте следующую структуру
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 будет строковым файлом ресурсов (как и strings.xml), но только с одной строкой: той, которую вы хотите различить в зависимости от вкуса.
(Вам не нужно иметь apptitle.xml в каталоге 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>
Возможно, вы сможете переопределить строки по-разному, но я хочу, чтобы переопределенные строки были отделены от остальных для ясности.
Ответ 2
Принятый ответ не работает с более новыми версиями Gradle.
Вам нужно заменить buildConfig
на buildConfigField
, чтобы получить тот же результат:
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"
}
}
Ответ 3
treeAreEverywhere ответ (а также имя пользователя). Но также очень важно знать, что Android Studio значительно упростит процесс создания атрибутов сборки или атрибутов конкретных файлов ресурсов.
В окне проекта AS щелкните правой кнопкой мыши папку res/values и выберите New > Values resource file. Затем назовите его (например, "строки" ), выберите "Источник", если не по умолчанию, и выберите любые требуемые квалификаторы (например, "Ширина экрана = 800" ). Это самый простой способ убедиться, что вы помещаете свои ресурсы переопределения там, где их компилятор хочет.
Ответ 4
Вот как я это сделал в своем проекте. Я создал несколько типов сборки вместо вкусов. Это решение добавит префикс к вашему имени пакета в зависимости от типа сборки, которую вы пытаетесь собрать. Например, для dev имя пакета будет com.sample.myapp.dev и аналогичным образом для имени бета-пакета будет изменено на com.sample.myapp.release. Вы можете настроить его, чтобы получить бесплатные и платные префиксы. Надеюсь, это поможет.
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
}
}