如何使用 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
小心assemble
! assemble
取决于 assembleDebug
和 assembleRelease
。如果您再添加一个依赖项(即assembleDebug
的兄弟),则在复制文件时可能已经生成了 APK。 assemble*
来不及将资源/资产放入 APK。【参考方案7】:
将此行添加到您的build.gradle
文件中:
assemble.dependsOn copyFiles
assemble.mustRunAfter copyFiles
assemble
可以是任何任务。
编辑:我添加了 mustRunAfter
位以确保 copyFiles 任务在任何其他组装依赖项之前运行。
【讨论】:
我已经尝试过您对 assemble 任务和“build”任务的建议,但我的 copyFiles 任务似乎并没有运行。但是,通过将它放在“干净”任务上,我可以通过首先进行重建然后启动来运行我的 copyFiles。 T 这对我不起作用。我将这两行添加到我的 build.gradle 中,但看起来我的复制任务从未运行过。以上是关于如何使用 android studio 将复制任务运行到资产文件夹中的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android studio 中使用我的 android 项目作为其他项目中的库? [复制]
我如何将PDF复制到内部存储中? -Android studio
是否可以使用 Android Studio 将 Kotlin 转换为 Java? [复制]