Cómo ejecutar una tarea de copia con el estudio de Android en la carpeta de activos

Hasta ahora he agregado lo siguiente al final de mi “build.gradle

task copyFiles(type: Copy) copyFiles { description = 'Copies html5 files from the common library...' from '../../www' into 'assets/www' include('**/*') } 

Ahora solo necesito ayuda sobre cómo hacer que esta tarea se ejecute cada vez (antes) comstackndo la fuente de Android. Puedo ejecutar la tarea de copia manualmente desde la línea de comandos, pero me gustaría ejecutarla cuando hago clic en “ejecutar” en el estudio de Android.

Con la ayuda de la sugerencia a continuación, he agregado

 clean.dependsOn copyFiles clean.mustRunAfter copyFiles 

Y con esta adición puedo ejecutar mi tarea de copia haciendo reconstruir -> ejecutar. Es mejor que nada, pero sería bueno omitir el paso de reconstrucción.

Aquí está todo el build.gradle que uso con 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 esta manera hago una copia personalizada de los archivos activos en mi sistema de comstackción android-gradle

 preBuild.dependsOn copyFiles 

Aquí está el build.gradle del módulo que estoy usando que copia exitosamente los archivos que quería como una tarea previa a la construcción. El “en” se modela después de la clase de archivo en Java, por lo que debe ser familiar sobre cómo usarlo. Las dos líneas al final son opcionales: ejecutará la tarea copyFiles cuando invoque 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 

Tuve un problema muy similar al tuyo y pude resolverlo de la siguiente manera:

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

El problema es que Android Studio parece llamar a una tarea de ensamblaje específica como assembleDebug cuando haces clic en ejecutar, es por eso que debes asegurarte de que todas las tareas de ensamblaje dependan de tu tarea de copiado.

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

Pruebe esto debajo de su build.gradle :

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

En mi caso, manipulo algunos valores ‘token’ dentro de res/values/strings.xml , y luego los copio en ${project_root}/build/filtered-resources debido al problema de limpieza del proyecto.

Para trabajar correctamente con este recurso manipulado, android.sourceSets.res debe redefinir a la carpeta copiada.

Para su caso, copie la carpeta de assets con su recurso www en ${PROJECT_ROOT}/build/your/desired/location , y asigne android.sourceSets.assets a él.

Utilizo la siguiente tarea de copia en mi proyecto para copiar cadenas en otro directorio:

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

Agregue esta línea a su archivo build.gradle :

 assemble.dependsOn copyFiles assemble.mustRunAfter copyFiles 

donde assemble puede ser cualquier tarea.

Editar: agregué el bit mustRunAfter para asegurarme de que la tarea copyFiles se ejecuta antes que cualquiera de las demás dependencias de ensamblaje.