如何使用 android studio 将复制任务运行到资产文件夹中

Posted

技术标签:

【中文标题】如何使用 android studio 将复制任务运行到资产文件夹中【英文标题】:How to run copy task with android studio into assets folder 【发布时间】:2013-06-17 06:51:51 【问题描述】:

到目前为止,我已将以下内容添加到“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

【问题讨论】:

这些答案是否解决了您的问题? 这些答案都没有,还有许多其他人在 Android Studio 1.4 上工作过(mac osx,我也有一个 windows 盒子即将上线,我打算仔细检查一下)即使有记录的方式也没有将文件夹复制或同步到文件夹...如果我发现其他情况,我会更新它。 【参考方案1】:
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()
    

【讨论】:

【参考方案2】:

这是我正在使用的模块的 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

【讨论】:

你为什么有from file?那是一个目录! @IgorGanapolsky 你说得对,我删除了“文件”关键字,感谢您指出这一点。 我收到一个错误:在项目 ':app' 上找不到属性 'preBuild'。【参考方案3】:

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

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

build.dependsOn copyStringsUniversal

【讨论】:

【参考方案4】:

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

preBuild.dependsOn copyFiles

【讨论】:

什么定义了“preBuild”我认为这是一个到处都是答案,但它对我从来没有用。如果有区别,我正在使用 Android Studio 1.4。 我想通了。我想。我的环境没有定义 preBuild,所以我定义了自己的环境并使用它来确保任务 copyFiles 被触发。 什么是preBuild?这是 Android Studio 中 Gradle 生命周期的一部分吗? 这对我有用。 preBuild 任务应该由 Android Studio 自动定义。 那条线去哪儿了?【参考方案5】:

我遇到了和你非常相似的问题,我能够解决它如下:

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

    tasks.getByPath(":$project.name:assemble$buildType.name.capitalize()").dependsOn "$buildType.nameCopyFiles"

问题是,当您单击运行时,Android Studio 似乎调用了一个特定的组装任务,例如 assembleDebug,这就是为什么您必须确保所有组装任务都依赖于您的复制任务。

【讨论】:

当我尝试使用您的添加进行构建时出现此错误(可能是因为 2013 年和 2020 年之间的更改):> 项目 ':app' 中找不到路径为 ':app:assembleDebug' 的任务。 【参考方案6】:

在你的build.gradle下面试试这个:

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

就我而言,我在res/values/strings.xml 中操作了一些“令牌”值,然后由于项目清理问题将其复制到$project_root/build/filtered-resources

要正确使用这个被操纵的资源,android.sourceSets.res 应该被重新定义为复制的文件夹。

对于您的情况,将带有www 资源的assets 文件夹复制到$PROJECT_ROOT/build/your/desired/location,并指定android.sourceSets.assets 指向它。

【讨论】:

感谢您的回答。目前我无法对其进行测试,因为该项目已经发展/降级,目前在 Android Studio 中根本无法运行。 今天设法尝试了这个。但不幸的是,它对我不起作用。我没有更改 android.sourceSets.assets 或我的复制任务的目的地。这与任务运行相关吗?我知道我的复制任务已经按我的意愿工作了。我只需要它实际被调用。 这似乎对我有用。我将条件更改为if (task.name == 'assembleRegularRelease') ... 。对于每种组装任务类型,我基本上都有不同的复制任务。 出于某种原因,这对我不起作用。我最终使用了assembleDebug.dependsOn copyFiles assembleRelease.dependsOn copyFiles 小心assembleassemble 取决于 assembleDebugassembleRelease。如果您再添加一个依赖项(即assembleDebug 的兄弟),则在复制文件时可能已经生成了 APK。 assemble* 来不及将资源/资产放入 APK。【参考方案7】:

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

assemble.dependsOn copyFiles
assemble.mustRunAfter copyFiles

assemble 可以是任何任务。

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

【讨论】:

我已经尝试过您对 assemble 任务和“b​​uild”任务的建议,但我的 copyFiles 任务似乎并没有运行。但是,通过将它放在“干净”任务上,我可以通过首先进行重建然后启动来运行我的 copyFiles。 T 这对我不起作用。我将这两行添加到我的 build.gradle 中,但看起来我的复制任务从未运行过。

以上是关于如何使用 android studio 将复制任务运行到资产文件夹中的主要内容,如果未能解决你的问题,请参考以下文章

如何复制项目 Android Studio 以进行备份

如何在 android studio 中使用我的 android 项目作为其他项目中的库? [复制]

我如何将PDF复制到内部存储中? -Android studio

是否可以使用 Android Studio 将 Kotlin 转换为 Java? [复制]

如何将我的 Android Studio 项目导出为 APK 文件? [复制]

如何将图像导入或复制到 Android Studio 中的“res”文件夹?