Как запустить задачу копирования с помощью Android-студии в папку с ресурсами

До сих пор я добавил следующее в конец моего "build.gradle"

task copyFiles(type: Copy)

copyFiles {
    description = 'Copies html5 files from the common library...'
    from '../../www'
    into 'assets/www'
    include('**/*')
}

Теперь мне просто нужна помощь в том, как сделать эту задачу выполняемой каждый раз (до) компиляции источника android. Я могу запустить задачу копирования вручную из командной строки, но Id нравится запускать ее, когда я нажимаю "run" в android studio.

С помощью предложения ниже я добавил

clean.dependsOn copyFiles
clean.mustRunAfter copyFiles

И с этим дополнением я могу запустить задачу копирования, выполнив команду rebuild → run. Это лучше, чем ничего, но было бы неплохо пропустить шаг восстановления.

Вот весь build.gradle, который я использую с помощью студии android.

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}


apply plugin: 'android'

dependencies {
    compile files('/libs/acra-4.3.0.jar')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 17
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src','libs']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        instrumentTest.setRoot('tests')
    }
}


task copyFiles(type: Copy)

copyFiles {
    description = 'Copies html5 files from the common library...'
    from '../../www'
    into 'assets/www'
    include('**/*')
}

clean.dependsOn copyFiles
clean.mustRunAfter copyFiles

Ответ 1

Таким образом, я делаю заказное копирование файлов в моей системе сборки android-gradle

preBuild.dependsOn copyFiles

Ответ 2

Вот модуль build.gradle, который я использую, который успешно копирует файлы, которые я хотел в качестве задачи предварительной сборки. "В" моделируется после класса "Файл" на Java, поэтому он должен знать, как его использовать. Две строки в конце являются необязательными - она ​​запускает задачу copyFiles при вызове gradle clean:

android {
.....
}

task copyFiles(type: Copy) {
    description = 'copying some file(s)....'
    from 'src/main'
    into project(':Path:To:ModuleFrom:Settings.gradle').file('./res')
    include 'file1.suffix'
    include '**/*.html'
}

project.afterEvaluate {
    preBuild.dependsOn copyFiles
}

clean.dependsOn copyFiles
clean.mustRunAfter copyFiles

Ответ 3

У меня была очень похожая проблема с твоей, и я смог ее решить следующим образом:

android.buildTypes.all{ buildType ->    
    task "${buildType.name}CopyFiles" (type: Copy)
    "${buildType.name}CopyFiles" {
        description = 'Copies html5 files from the common library...'
        from '../../www'
        into 'assets/www'
        include('**/*')
    }

    tasks.getByPath(":${project.name}:assemble${buildType.name.capitalize()}").dependsOn "${buildType.name}CopyFiles"
}

Проблема заключается в том, что Android Studio, похоже, вызывает конкретную задачу сборки, например assembleDebug, когда вы нажимаете кнопку "Run", поэтому вы должны убедиться, что все задачи сборки зависят от вашей задачи копирования.

Ответ 4

task myCopyToAssets(type: Copy) {
    def toDir = rootProject.file('app/assets')
    from (rootProject.file('app/usb')) {
        include 'libhotplug.so'
    }
    into toDir
}



tasks.whenTaskAdded { task ->
    //println task.getName()
    if (task.name == 'assembleDebug' || task.name == 'assembleRelease') {
        println 'myCopy'
        myCopyToLibs.execute()
        myCopyToAssets.execute()
    }
}

Ответ 5

Попробуйте это ниже build.gradle:

tasks.whenTaskAdded { task ->
    if (task.name == 'assemble') {
        task.dependsOn copyFiles
    }
}

В моем случае я манипулирую некоторыми значениями "токена" внутри res/values/strings.xml, а затем скопируйте его в ${project_root}/build/filtered-resources из-за проблемы очистки проекта.

Чтобы правильно работать с этим управляемым ресурсом, android.sourceSets.res следует переопределить в скопированную папку.

Для вашего случая скопируйте папку assets с вашим ресурсом www в ${PROJECT_ROOT}/build/your/desired/location, а asign android.sourceSets.assets укажите на него.

Ответ 6

Я использую следующую задачу копирования в моем проекте для копирования строк в другой каталог:

task copyStringsUniversal(type: Copy) {
    from 'src/main/res/values'
    include 'strings.xml'
    include 'array.xml'
    into 'src/universal/res/values'
}
build.dependsOn copyStringsUniversal

Ответ 7

Добавьте эту строку в свой build.gradle файл:

assemble.dependsOn copyFiles
assemble.mustRunAfter copyFiles

где assemble может быть любой задачей.

Изменить: я добавил бит mustRunAfter, чтобы убедиться, что задача copyFiles запущена до того, как какая-либо из других собирает зависимости.