30

到目前为止,我已将以下内容添加到“build.gradle”的末尾

task copyFiles(type: Copy)

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

现在我只需要一些关于如何让这个任务在每次(之前)编译 android 源代码时执行的帮助。我可以从命令行手动运行复制任务,但是当我在 android studio 中单击“运行”时,我希望它运行。

在以下建议的帮助下,我添加了

clean.dependsOn copyFiles
clean.mustRunAfter copyFiles

通过这个添加,我可以通过重新构建 -> 运行来运行我的复制任务。总比没有好,但跳过重建步骤会很好。

这是我与 android studio 一起使用的整个 build.gradle。

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
4

7 回答 7

21

这样我可以在我的 android-gradle 构建系统中自定义复制文件资产

preBuild.dependsOn copyFiles
于 2013-09-14T09:13:36.713 回答
13

这是我正在使用的模块的 build.gradle,它成功复制了我想要作为预构建任务的文件。“into”是仿照Java中的File类,所以应该熟悉如何使用它。最后的两行是可选的——它会在调用 gradle clean 时运行 copyFiles 任务:

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
于 2016-02-17T20:25:02.880 回答
7

我有一个与您的问题非常相似的问题,我能够按如下方式解决它:

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,这就是为什么您必须确保所有组装任务都依赖于您的复制任务的原因。

于 2013-08-24T21:16:37.437 回答
3
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()
    }
}
于 2016-10-11T09:03:21.507 回答
2

在你的下面试试这个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/locationandroid.sourceSets.assets

于 2013-07-24T06:55:19.637 回答
1

我在我的项目中使用以下复制任务将字符串复制到另一个目录中:

task copyStringsUniversal(type: Copy) {
    from 'src/main/res/values'
    include 'strings.xml'
    include 'array.xml'
    into 'src/universal/res/values'
}
build.dependsOn copyStringsUniversal
于 2016-01-12T15:38:52.347 回答
-1

将此行添加到您的build.gradle文件中:

assemble.dependsOn copyFiles
assemble.mustRunAfter copyFiles

哪里assemble可以是任何任务。

编辑:我添加了mustRunAfter一点以确保 copyFiles 任务在任何其他组装依赖项之前运行。

于 2013-07-16T10:52:52.833 回答