【问题标题】:Create pre build event to copy files to assets folder in Android application创建预构建事件以将文件复制到 Android 应用程序中的资产文件夹
【发布时间】:2016-03-23 21:49:42
【问题描述】:

我有这个项目结构: ProjectFolder/IosFolder,AndroidFolder,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 Console 中哪里可以看到执行方法的结果吗?

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

希望你能帮助我。

【问题讨论】:

    标签: android android-studio gradle build.gradle pre-build-event


    【解决方案1】:

    你能试试这个配置吗:

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

    在您应用的最底部的 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)
    

    【讨论】:

    • 你能帮助我在方法中需要的文件夹路径吗? task copyFiles(type: Copy) copyFiles { description = 'Copy files' from 'Common/' into '{project}/app/src/main/assets/' include('*/') } gradle.projectsEvaluated { preBuild.dependsOn(copyFiles) }
    • 我更新了我的答案。你是要我给你找路吗?或者这足以让你继续前进吗?
    • 是的,请您帮我确定这些文件的路径,因为我的 Common 文件夹不在项目文件夹中。我用路径尝试了你的最后一个变体:从 '{projectRepository}/Common' 到 '{projectRepository}/Android/{projectName}/app/src/main/assets' 但它不会复制文件。还有一个问题:当我构建和运行应用程序时,我可以在 Android Studio 的 assets 文件夹中看到这个复制的文件吗?
    • 你能给出commons文件夹的路径吗?确切的路径?
    • 是的,当然,我在 Mac 上,所以:Macintosh HD ▸ 用户 ▸ kostya ▸ repo_amc_mobile_promo - 有 Common 文件夹;项目资产文件夹的路径:Macintosh HD ▸ Users ▸ kostya ▸ repo_amc_mobile_promo ▸ Android ▸ AMC_Mobile_Promo2 ▸ app ▸ src ▸ main
    【解决方案2】:

    根据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}')
    

    【讨论】:

      猜你喜欢
      • 2012-09-16
      • 2014-09-10
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多