Jusqu'à présent, j'ai ajouté ce qui suit à la fin de mon "build.gradle"
task copyFiles(type: Copy)
copyFiles {
description = 'Copies html5 files from the common library...'
from '../../www'
into 'assets/www'
include('**/*')
}
Maintenant, j'ai juste besoin d'aide pour savoir comment exécuter cette tâche à chaque fois (avant) la compilation de la source Android. Je peux exécuter la tâche de copie manuellement à partir de la ligne de commande, mais j'aimerais qu'elle soit exécutée lorsque je clique sur "exécuter" dans Android studio.
Avec l'aide de la suggestion ci-dessous, j'ai ajouté
clean.dependsOn copyFiles
clean.mustRunAfter copyFiles
Et avec cet ajout, je peux exécuter ma tâche de copie en faisant reconstruire -> exécuter. C'est mieux que rien mais ce serait bien de sauter l'étape de reconstruction.
Voici tout le build.gradle que j'utilise avec Android studio.
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
De cette façon, je fais une copie personnalisée des fichiers dans mon système de construction Android-Gradle
preBuild.dependsOn copyFiles
Voici le build.gradle du module que j'utilise qui copie avec succès les fichiers que je voulais comme tâche de pré-construction. Le "into" est modélisé d'après la classe File en Java, il devrait donc être familier sur la façon de l'utiliser. Les deux lignes à la fin sont facultatives - il exécutera la tâche copyFiles lors de l'appel de 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
J'ai eu un problème très similaire au vôtre et j'ai pu le résoudre comme suit:
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"
}
Le problème est que Android Studio semble appeler une tâche d'assemblage spécifique comme assembleDebug lorsque vous cliquez sur Exécuter, c'est pourquoi vous devez vous assurer que toutes les tâches d'assemblage dépendent de votre tâche de copie.
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()
}
}
Essayez ceci sous votre build.gradle
:
tasks.whenTaskAdded { task ->
if (task.name == 'assemble') {
task.dependsOn copyFiles
}
}
Dans mon cas, je manipule des valeurs de "jeton" à l'intérieur de res/values/strings.xml
, puis copiez-le dans ${project_root}/build/filtered-resources
en raison d'un problème de nettoyage du projet.
Pour fonctionner correctement avec cette ressource manipulée, Android.sourceSets.res
doit être redéfini dans le dossier copié.
Pour votre cas, copiez le dossier assets
avec votre ressource www
dans ${PROJECT_ROOT}/build/your/desired/location
et asign Android.sourceSets.assets
pointez-le.
J'utilise la tâche de copie suivante dans mon projet pour copier des chaînes dans un autre répertoire:
task copyStringsUniversal(type: Copy) {
from 'src/main/res/values'
include 'strings.xml'
include 'array.xml'
into 'src/universal/res/values'
}
build.dependsOn copyStringsUniversal