How to run copy task with android studio into assets folder

走远了吗. 提交于 2019-11-27 08:16:34

This way I do custom copying of file assets in my android-gradle build system

preBuild.dependsOn copyFiles

Here is the module's build.gradle that I am using which successfully copies the files that I wanted as a pre-build task. The "into" is modelled after the File class in Java, so it should be familiar on how to use it. The two lines at the end is optional - it will run the copyFiles task when invoking 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

I had a very similar problem to yours and I was able to solve it as follows:

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"
}

The problem is, that Android Studio seems to call a specific assemble task like assembleDebug when you click on run, that's why you have to make sure to make all assemble tasks depend on your copy task.

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()
    }
}

Try this below your build.gradle:

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

In my case I manipulate some 'token' values inside res/values/strings.xml, and then copy it into ${project_root}/build/filtered-resources due to project cleaning issue.

To work correctly with this manipulated resource, android.sourceSets.res should be redefined to copied folder.

For your case copy assets folder with your www resource into ${PROJECT_ROOT}/build/your/desired/location, and asign android.sourceSets.assets point to it.

I use the following copy task in my project to copy strings into another directory:

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

Add this line to your build.gradle file:

assemble.dependsOn copyFiles
assemble.mustRunAfter copyFiles

where assemble can be any task.

Edit: I added the mustRunAfter bit to make sure the copyFiles task is run before any of the other assemble dependencies.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!