Александр Горбач


программирование, админство

Модфицирование файлов проекта при сборке андроид приложения с помощью Gradle

без комментариев

В предыдущей статье рассматривал способ изменения поведения приложения при помощи проверки пакета на режим сборки, и там же упомянул способ модификации при помощи Gradle на этапе компиляции. Рассмотрим этот способ подробнее.

При сборке используются правила из файла build.gradle нашего приложения. Чем хорош Gradle, так это тем, что у него есть встроенный язык, похожий на питон и можем писать на этом языке прямо в конфиге приложения! Таким образом, модификация на этапе сборки сводится просто к определению типа текущей сборки и кодинг нужных действий. Рассмотрим небольшой пример, когда нам нужно модифицировать AndroidManifest.xml для дебага и релиза, чтобы подставлять ключ Google Map API для того сертификата, которым будет подписан результирующий apk-файл.

android {
  
    replaceInManifest = {variant, fromString, toString ->
        def buildtype = variant.buildType
        def manifestFile = "${buildDir}/manifests/${buildtype.name}/AndroidManifest.xml"
        println "from: ${buildDir}/manifests"
        println "fromString ${fromString}"
        println "toString ${toString}"
        def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll(fromString, toString)
        new File(manifestFile).write(updatedContent, 'UTF-8')
    }

    getGMapsKey = { buildType ->
        if (buildType.name == "debug") {
            return "debug_key"
        }

        if (buildType.name == "release") {
            return "release_key"
        }

    }

    android.applicationVariants.all { variant ->

        def buildType = variant.buildType
        variant.processManifest.doLast {
            replaceInManifest(variant,
                    'GMAPS_KEY',
                    getGMapsKey(buildType) )
        }
    }

}

Я оставил только ту часть, которая производит нужные нам действия. Разберем происходящее в этом файле.
Как мы знаем, при сборке android-приложения с помощью gradle генерируются дополнительные поля в файл манифеста, в которые попадают версия приложения, ее отображаемое имя и прочее. Эти генерированные промежуточные файлы записываются в папку build проекта. На событие окончания генерирования манифеста мы вешаем событие кодом:

android.applicationVariants.all { variant ->

        def buildType = variant.buildType
        variant.processManifest.doLast {
            replaceInManifest(variant,
                    'GMAPS_KEY',
                    getGMapsKey(buildType) )
        }
    }

т.е. после окончания генерирования файла AndroidManifest.xml мы вызываем функцию replaceInManifest и передаем ей тип сборки и что нам нужно заменить.
В самой функции мы в соответствующей типу сборке директории выберем файл и в нем подменяем строку — ‘GMAPS_KEY’ на нужную нам.

replaceInManifest = {variant, fromString, toString ->
        def buildtype = variant.buildType
        def manifestFile = "${buildDir}/manifests/${buildtype.name}/AndroidManifest.xml" 
        println "from: ${buildDir}/manifests"
        println "fromString ${fromString}"
        println "toString ${toString}"
        def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll(fromString, toString)
        new File(manifestFile).write(updatedContent, 'UTF-8')
    }

С помощью println — мы можем выводить отладочную или справочную информацию, которая будет отображаться во время сборки.
В зависимости от типа сборки возвращает нужный ключ сервисная функция getGMapsKey .

getGMapsKey = { buildType ->
        if (buildType.name == "debug") {
            return "debug_key"
        }

        if (buildType.name == "release") {
            return "release_key"
        }

    }

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

Автор Sash(k)a

Май 21st, 2014 at 2:07 пп

Оставьте комментарий

Яндекс.Метрика