В Android/Gradle, как определить задачу, которая запускается только при создании определенного buildType/buildVariant/productFlavor (v0.10+)

Плагин Android для Gradle генерирует задачу для каждого BuilType/Flavor/BuildVariant. Проблема в том, что эта задача будет генерироваться динамически и, следовательно, не будет доступна в качестве зависимости при определении такой задачи:

task myTaskOnlyForDebugBuildType(dependsOn:assembleDebug) {
    //do smth
}

Предлагаемый обходной путь из этого ответа будет таким:

task myTaskOnlyForDebugBuildType(dependsOn:"assembleDebug") {
    //do smth
}

или это

afterEvaluate {
    task myTaskOnlyForDebugBuildType(dependsOn:assembleDebug) {
        //do smth
    }
}

Но оба мне не подошли.


person Patrick Favre    schedule 30.03.2014    source источник


Ответы (3)


Вот полный пример того, как это сделать вдохновлен этим постом: (плагин для Android v.0.9.2 и gradle 1.11 на момент написания)

Мы собираемся определить задачу, которая запускается только при создании «debugCustomBuildType».

android {
    ...
    buildTypes {
        debugCustomBuildType {
            //config
        }
   }
}

Определите задачу, которая должна выполняться только для определенного встроенного типа/варианта/аромата

task doSomethingOnWhenBuildDebugCustom {
    doLast {
       //task action
    }
}

Динамически устанавливать зависимость, когда задачи добавляются по градиенту

tasks.whenTaskAdded { task ->
    if (task.name == 'generateDebugCustomBuildTypeBuildConfig') {
        task.dependsOn doSomethingOnWhenBuildDebugCustom 
    }
}

Здесь мы используем задачу «generateBuildConfig», но вы можете использовать любую задачу, которая вам подходит (см. также официальную документацию)

  • процессМанифест
  • helpCompile
  • рендерскрипт компилировать
  • объединить ресурсы.
  • объединить активы
  • процессРесурсы
  • генерироватьBuildConfig
  • javaCompile
  • процессJavaResources
  • собрать

Не забудьте использовать задачу buildTypeSpecific (generateBuildConfig против generateDebugCustomBuildTypeBuildConfig)

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

person Patrick Favre    schedule 30.03.2014
comment
Это нужно запускать из командной строки? Или Android Studio запускает их, когда вы нажимаете зеленую кнопку «Выполнить»? - person IgorGanapolsky; 17.10.2016
comment
В зависимости от типа сборки. Обычно зеленая кнопка «Выполнить» создает отладочный тип сборки, если вы настроили свои действия для этого типа сборки, он будет выполнен — нет необходимости в запуске из командной строки. - person Patrick Favre; 31.10.2016

Я добился этого следующим образом:

android {
    ext.addDependency = {
        task, flavor, dependency ->
            def taskName = task.name.toLowerCase(Locale.US)
            if (taskName.indexOf(flavor.toLowerCase(Locale.US)) >= 0) {
                task.dependsOn dependency
            }
    }

    productFlavors {
        production {
        }
        other
    }

    task theProductionTask << {
        println('only in production')
    }

    tasks.withType(JavaCompile) {
        compileTask -> addDependency compileTask, "production", theProductionTask
    }
}

Честно говоря, я не знаю, какая локаль используется для генерации имен для задач компиляции, поэтому toLowerCase(Locale.US) может быть контрпродуктивным.

person Juozas Kontvainis    schedule 02.12.2014
comment
Я не знаю ни одной задачи Android Gradle, которая включает символы, отличные от ascii, и если вы сохраните свои имена также простыми, исключив специальные символы toLowerCase (Locale.US), должно быть безопасно. - person Patrick Favre; 02.12.2014
comment
Это сработало и для меня, когда мне пришлось записывать значения в настраиваемый файл свойств вне каталога модуля. - person Andreas; 09.09.2015

Это единственное решение, которое сработало для меня:

afterEvaluate {
    if (project.hasProperty("preReleaseBuild")){
        tasks.preReleaseBuild.dependsOn bundleJSRelease
    } else {
        tasks.preDebugBuild.dependsOn bundleJSDebug
    }
}
person Lo - 3 chars required    schedule 11.10.2016