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

19

我有这样的项目结构: ProjectFolder/IosFolder,AndroidFolder,CommonFolder 现在安卓应用程序使用来自其assets文件夹的文件。 但我们决定为相同的文件创建Common文件夹。

你能帮我编写一个函数,它可以将文件从Common文件夹(此文件夹在我的项目下,因此在Android Studio中看不到)复制到安卓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文件的哪个位置使用什么路径来调用这个方法?

希望你能帮助我。

2个回答

17

你可以尝试这个配置:

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)

我更新了我的回答。你是在让我为你获取路径吗?还是这样就足够让你开始了? - j2emanue
是的,请问您能否帮我处理这些文件的路径,因为我的Common文件夹不在项目文件夹中。我尝试了您上次提供的路径变量:从'{projectRepository}/Common'到'{projectRepository}/Android/{projectName}/app/src/main/assets',但它没有复制文件。还有一个问题:当我构建和运行应用程序时,我能在Android Studio的assets文件夹中看到这些复制的文件吗? - vlasentiy
你能给出 commons 文件夹的路径吗?确切的路径是什么? - j2emanue
我更新了我的答案。由于某种原因,preBuild不会运行复制命令,但它确实执行了。非常奇怪。我使用了一个shell脚本来完成任务。 - j2emanue
非常感谢!它起作用了。只需在路径前加上“/”,它就可以工作了!感谢您的帮助!我很感激你! - vlasentiy
显示剩余4条评论

3
根据文档,以下是通过gradle复制文件的步骤:
task myCopyTask(type: Copy) {
    from file("${buildDir}/reports/my-report.pdf")
    into file("${buildDir}/toArchive")
}

在构建之前,您必须添加以下行:

preBuild.dependsOn(myCopyTask)

你可以使用绝对路径或相对路径,这些路径可能会使用项目属性中的某些内容。为确保项目属性的路径正确,请使用以下命令进行打印:
println file('${buildDir}')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接