Gradle: манипулирование названием версии и кодом версии на основе их типов сборки

Я ищу из других вопросов, связанных с BuildConfig. Я не могу найти подходящих ответов для моей проблемы.

Я хочу создавать apks с разными именами версий и кодами, основываясь на их вариантах.

Например:

Flavor1Debug.apk 
  versionName  = 1000
  versionCode  = 1000

Flavor1Release.apk 
  versionName  = 1001
  versionCode  = 1001

Flavor2Debug.apk 
  versionName  = 4000
  versionCode  = 4000

Flavor2Release.apk 
  versionName  = 4001
  versionCode  = 4001

Я создал файл, в котором хранилась моя версия. "version.properties"

flavor1VersionCode=1000
flavor1VersionName=1000

flavor2VersionCode=4000
flavor2VersionName=4000

Структура проекта

/Projectroot
---/src
---/assets
---/res
---/jni
---/libs
---/flavor
----/flavor1
----/flavor2

Вот мой пример сценария Gradle

build.gradle

android {
      def versionPropsFile = file('version.properties')
      def Properties versionProps = new Properties()

       versionProps.load(new FileInputStream(versionPropsFile))

       flavor1VersionCode = versionProps['flavor1VersionCode'].toInteger()
       flavor1VersionName = versionProps['flavor1VersionName'].toString()
       flavor2VersionCode = versionProps['flavor2VersionCode'].toInteger()
       flavor2VersionName = versionProps['flavor2VersionName'].toString()

    productFlavors {
       productFlavor1 {
         versionCode = flavor1VersionCode
         versionName = flavor1VersionCode
       }
       productFlavor2 {
         versionCode = flavor2VersionCode
         versionName = flavor2VersionCode
       }
    }

    buildTypes {
        debug {
        }
        release {
        }
    }
}

1 ответ

Прошло семь месяцев, у меня есть ответ на мой вопрос.

После двух недель исследований и проб и ошибок. Я наконец выяснил, как Gradle обрабатывает файлы при сборке приложения.

Вот что я сделал.

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

def outputs = variant.getOutputs()

и использовать эту реализацию для обновления каждого файла.

def manifestFile = "$buildDir/intermediates/manifests/full/${flavor.name}/${buildtype.name}/AndroidManifest.xml"
        def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll(i[0].toString(), i[1].toString())
        new File(manifestFile).write(updatedContent, 'UTF-8')
Другие вопросы по тегам