Подтвердить что ты не робот

Создайте андроид с помощью gradle, замените строку на каждый вкус продукта

Прежде чем я создам проект Android для двух разных приложений, оплаченных и бесплатных.

Я изменил все значения и строки, поэтому вчера я совершил большую ошибку.

Итак, я занимаюсь тем, как использовать gradle для создания моего приложения.

У моего приложения несколько разностей.

  • имя приложения (просто добавьте суффикс "-Free" ) → values ​​/string.xml

  • Изменить флаг в моей *.java

//подпись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
    }
}

но встроенное приложение ничего не изменило.

Что я пропустил?

4b9b3361

Ответ 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
    }
}