创建预构建事件以将文件复制到 Android 应用程序中的资产文件夹

Create pre build event to copy files to assets folder in Android application

我有这个项目结构: ProjectFolder/IosFolder,Android文件夹,CommonFolder 现在 android 应用程序使用其资产文件夹中的文件。 但是我们决定为相同的文件创建 Common 文件夹。

你能帮我做一个函数 将从 Common 文件夹复制文件(这个文件夹在我的项目下,所以在 Android Studio 我看不到)到 android assets 文件夹,然后再构建应用程序?

在 Common 文件夹中会有一些 .json 文件和字体文件。

据我了解,我需要在 build.gradle 文件中编写此函数 类似的东西:

task copyFiles(type: Copy)

    copyFiles {
        description = 'Copy files'
        from 'Common/'
        into 'Android/{projectName}/app/src/main/assets'
    }

这是我的文件:

apply plugin: 'com.android.application'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "amc.amc_mobile_promo2"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        //For Flurry
        multiDexEnabled = true
    }
    //For Flurry
    /*compileOptions {
        //noinspection GroovyAssignabilityCheck
        sourceCompatibility JavaVersion.VERSION_1_7
        //noinspection GroovyAssignabilityCheck
        targetCompatibility JavaVersion.VERSION_1_7
    }*/
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile 'com.android.support:support-v4:23.1.1'
    compile 'com.android.support:appcompat-v7:23.1.1'

    compile 'com.facebook.android:facebook-android-sdk:4.7.0'
    compile 'com.mcxiaoke.volley:library:1.0.19'
    compile 'joda-time:joda-time:2.8.2'
    compile 'com.github.orangegangsters:swipy:1.2.0@aar'

    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.squareup.okhttp:okhttp:2.6.0'
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.6.0'

    /*compile 'com.android.support:multidex:1.0.1'
    compile 'com.google.android.gms:play-services-ads:8.3.0'
    compile 'com.google.android.gms:play-services-identity:8.3.0'
    compile 'com.google.android.gms:play-services-gcm:8.3.0'*/
}

你能告诉我在 Gradle 控制台中哪里可以看到执行方法的结果吗?

我需要使用什么路径以及在 build.gradle 文件中的什么位置放置此方法?

希望你能帮助我。

你能试试这个配置吗:

gradle.projectsEvaluated {
     preBuild.dependsOn(copyFiles)
}

更新: 复制任务可以为您执行许多命令。来自此处文档的示例:

task anotherCopyTask(type: Copy) {
// Copy everything under src/main/webapp
from 'src/main/webapp'
// Copy a single file
from 'src/staging/index.html'
// Copy the output of a task
from copyTask
// Copy the output of a task using Task outputs explicitly.
from copyTaskWithPatterns.outputs
// Copy the contents of a Zip file
from zipTree('src/main/assets.zip')
// Determine the destination directory later
into { getDestDir() }

}

如果您只想从一个源目录复制到另一个源目录,您可以这样做:

task copyFiles(type: Copy) {
    from 'pathToMyAssets'
    into 'AndroidStudioAssetsFolderPath'
}

UPDATE 在您应用的 build.gradle 最底部执行此操作:

task copyFiles(type: Copy) {
    from 'Users/kostya/repo_amc_mobile_promo/Common/'
    into 'Users/kostya/repo_amc_mobile_promo/Android/AMC_Mobile_Promo2/app/src/main/assets'
}

preBuild.dependsOn(copyFiles)

根据 documentation 下面是如何通过 gradle 复制文件:

task myCopyTask(type: Copy) {
    from file("${buildDir}/reports/my-report.pdf")
    into file("${buildDir}/toArchive")
}

要在构建之前执行此操作,您必须添加以下行:

preBuild.dependsOn(myCopyTask)

可以使用absoluterelative路径,可能会用到一些project properties。为确保项目属性的路径,请毫不犹豫地使用以下方式打印它:

println file('${buildDir}')