Ответ 1
Таким образом, я делаю заказное копирование файлов в моей системе сборки android-gradle
preBuild.dependsOn copyFiles
До сих пор я добавил следующее в конец моего "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
Таким образом, я делаю заказное копирование файлов в моей системе сборки android-gradle
preBuild.dependsOn copyFiles
Вот модуль 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
У меня была очень похожая проблема с твоей, и я смог ее решить следующим образом:
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", поэтому вы должны убедиться, что все задачи сборки зависят от вашей задачи копирования.
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()
}
}
Попробуйте это ниже 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
укажите на него.
Я использую следующую задачу копирования в моем проекте для копирования строк в другой каталог:
task copyStringsUniversal(type: Copy) {
from 'src/main/res/values'
include 'strings.xml'
include 'array.xml'
into 'src/universal/res/values'
}
build.dependsOn copyStringsUniversal
Добавьте эту строку в свой build.gradle
файл:
assemble.dependsOn copyFiles
assemble.mustRunAfter copyFiles
где assemble
может быть любой задачей.
Изменить: я добавил бит mustRunAfter
, чтобы убедиться, что задача copyFiles запущена до того, как какая-либо из других собирает зависимости.