web-dev-qa-db-fra.com

Comment exécuter la tâche de copie avec Android studio dans le dossier des ressources

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
26
Svikaren

De cette façon, je fais une copie personnalisée des fichiers dans mon système de construction Android-Gradle

preBuild.dependsOn copyFiles
19
AdamVe

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
11
Phileo99

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.

6
r4C9rAyrd6A1
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()
    }
}
3
KunMing Xie

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.

2
Intae Kim

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
1
luckyhandler