web-dev-qa-db-ja.com

Android studioをアセットフォルダーにコピーしてタスクをコピーする方法

これまでのところ、「build.gradle」の最後に以下を追加しました

task copyFiles(type: Copy)

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

Androidソースをコンパイルする前に)毎回このタスクを実行する方法についていくつかの助けが必要です。コマンドラインから手動でコピータスクを実行できますが、実行させたいですAndroidスタジオで[実行]をクリックすると、.

以下の提案の助けを借りて、私は追加しました

clean.dependsOn copyFiles
clean.mustRunAfter copyFiles

この追加により、rebuild-> runを実行して、コピータスクを実行できます。何もないよりはましですが、再構築ステップをスキップするのがいいでしょう。

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

この方法で、Android-gradleビルドシステムでファイルアセットのカスタムコピーを実行します

preBuild.dependsOn copyFiles
19
AdamVe

これは、私が使用しているモジュールのbuild.gradleで、ビルド前のタスクとして必要なファイルを正常にコピーします。 「into」はJavaのFileクラスをモデルにしているため、その使用方法はよく知っているはずです。末尾の2行はオプションです。gradlecleanを呼び出すと、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
11
Phileo99

私はあなたと非常によく似た問題を抱えていて、次のようにしてそれを解決することができました。

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がrunをクリックすると、assembleDebugのような特定のアセンブルタスクを呼び出すように見えることです。そのため、すべてのアセンブルタスクがコピータスクに依存していることを確認する必要があります。

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

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にコピーし、Android.sourceSets.assetsがそれを指すように割り当てます。

2
Intae Kim

プロジェクトで次のコピータスクを使用して、文字列を別のディレクトリにコピーします。

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