ProductFlavor in Android Studio / Gradle

I have an Android app that has the following products:

productFlavors {
    local {

    }

    development {


    }

    production {

    }
}

then at the bottom of mine build.grade:

File crashlyticsProperties = new File("${project.projectDir.absolutePath}/fabric.properties")
android.applicationVariants.all { variant ->
    def variantSuffix = variant.name.capitalize()
    def generateResourcesTask = project.tasks.getByName("fabricGenerateResources${variantSuffix}")
    def generatePropertiesTask = task("fabricGenerateProperties${variantSuffix}") << {
        Properties properties = new Properties()
        properties.put("apiSecret", WHAT_GOES_HERE)
        properties.put("apiKey", WHAT_GOES_HERE)
        PropertiesUtils.injectPropertyInFile(crashlyticsProperties, properties, "")
    }
    generateResourcesTask.dependsOn generatePropertiesTask
}

I am trying to install api secret/keyfor crashlytics, but I need to install them depending on the taste of the product I create.

properties.put("apiSecret", WHAT_GOES_HERE)
properties.put("apiKey", WHAT_GOES_HERE)

How can I set / get these variables?

Update # 1

I added the following to build.gradle

productFlavors {
    local {
        buildConfigField "String", "CRASHLYTICS_API_SECRET", "1234"
        buildConfigField "String", "CRASHLYTICS_API_KEY", "1234"
    }

    development {
        buildConfigField "String", "CRASHLYTICS_API_SECRET", "1234"
        buildConfigField "String", "CRASHLYTICS_API_KEY", "1234"
    }

    production {
        buildConfigField "String", "CRASHLYTICS_API_SECRET", "1234"
        buildConfigField "String", "CRASHLYTICS_API_KEY", "1234"
    }
}

Then at the bottom of the file build.gradleI have:

File crashlyticsProperties = new File("${project.projectDir.absolutePath}/fabric.properties")
android.applicationVariants.all { variant ->
    def variantSuffix = variant.name.capitalize()
    def generateResourcesTask = project.tasks.getByName("fabricGenerateResources${variantSuffix}")
    def generatePropertiesTask = task("fabricGenerateProperties${variantSuffix}") << {
        Properties properties = new Properties()
        println "...copying apiSecret for ${variant.name}"
        properties.put("apiSecret", BuildConfig.CRASHLYTICS_API_SECRET)
        println "...copying apiKey for ${variant.name}"
        properties.put("apiKey", BuildConfig.CRASHLYTICS_API_KEY)
        PropertiesUtils.injectPropertyInFile(crashlyticsProperties, properties, "")
    }
    generateResourcesTask.dependsOn generatePropertiesTask
}

This, however, does not compile and does not give me:

Error: (334, 1) Execution failed for task ': app: fabricGeneratePropertiesDevelopmentDebug'. Could not find the 'BuildConfig' property for task ': app: fabricGeneratePropertiesDevelopmentDebug'.

+4
source share
4 answers

:

: (334, 1) ': app: fabricGeneratePropertiesDevelopmentDebug'. 'BuildConfig' ': app: fabricGeneratePropertiesDevelopmentDebug'.

, :

variant.mergedFlavor.buildConfigFields["CRASHLYTICS_API_SECRET"].value

, , BuildConfig . , , , .

EDIT:

, :

File crashlyticsProperties = new File("${project.projectDir.absolutePath}/fabric.properties")
android.applicationVariants.all { variant ->
    def variantSuffix = variant.name.capitalize()
    def generateResourcesTask = project.tasks.getByName("fabricGenerateResources${variantSuffix}")
    def generatePropertiesTask = task("fabricGenerateProperties${variantSuffix}") << {
        Properties properties = new Properties()
        println "...copying apiSecret for ${variant.name}"
        properties.put("apiSecret", variant.mergedFlavor.buildConfigFields.get("CRASHLYTICS_API_SECRET").value)
        println "...copying apiKey for ${variant.name}"
        properties.put("apiKey", variant.mergedFlavor.buildConfigFields.get("CRASHLYTICS_API_KEY").value)
        PropertiesUtils.injectPropertyInFile(crashlyticsProperties, properties, "")
    }
    generateResourcesTask.dependsOn generatePropertiesTask
}
+1

buildConfigFields , .

:

local { buildConfigField "String", "KEY", '"abcKey' } 
development { buildConfigField "String", "KEY", '"xyzKey' } 

java

properties.put("apiSecret", BuildConfig.KEY)
+1

:

applicationVariants.all { variant ->
    variant.outputs.all { output -> 
        def flavor = variant.productFlavors[0].name.capitalize()

        if (flavor == "Local") {
             buildConfigField "string", "CRASHLYTICS_API_SECRET", "1234"
             buildConfigField "string", "CRASHLYTICS_API_KEY", "5678"
        }

        if (flavor == "Development") {
             buildConfigField "string", "CRASHLYTICS_API_SECRET", "1234"
             buildConfigField "string", "CRASHLYTICS_API_KEY", "5678"
        }

        if (flavor == "Production") {
            buildConfigField "string", "CRASHLYTICS_API_SECRET", "1234"
            buildConfigField "string", "CRASHLYTICS_API_KEY", "5678"
        }
    }
}

productFlavors. BuildConfig.CRASHLYTICS_API_SECRET .

0

, , , BuildConfig - Java, Gradle. BuildConfig Java.

Gradle.

:

/app
    /src
        /main
            /java
            /res
            /assets
            ...

"fabric.properties" Gradle, Gradle /src ( , Gradle), :

/app
    /src
       /main
            /java
            /res
            /assets
            ...
       /local
           /fabric.properties
       /development
           /fabric.properties
       /production
           /fabric.properties

Gradle.

Read more about source sets at https://developer.android.com/studio/build/build-variants.html#sourcesets

0
source

Source: https://habr.com/ru/post/1694533/


All Articles