gradle打包自动执行任务

如题,我想在多渠道打包之前替换一些资源。 例如下面的gradle配置:


android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "com.lxw.gradletest"
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    signingConfigs {
        release {
            storeFile new File("C:\\Users\\Administrator\\Desktop\\work\\zkjt.jks")
            storePassword 'zcareze'
            keyAlias 'zkjt'
            keyPassword 'zcareze'

        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        debug {
            applicationIdSuffix '.debug'
        }
    }

    productFlavors {
        google {
        }
        xiaomi {
        }
        _360 {
        }
    }

我想在执行google 渠道的时候复制一个图片到资源目录, 然后打开APP背景就是google的,而其他的也是对应的。是复制文件, 也就是在执行每个渠道之前,执行一个自定义的task。

阅读 4.2k
1 个回答

你的需求不一定要用自定义的 task 实现,我想到其他两种方式来实现你的需求

1.自定义 task

//将文件拷到 assets 目录下
//Google
task chGoogleRes(type : Copy) {
    from "/Users/yanggu/Desktop/untitled.txt"
    into "src/main/assets"
}

//Xiaomi
task chXiaomiRes(type : Copy) {
    from "/Users/yanggu/Desktop/helper/untitled.txt" 
    into "src/main/assets"
}

project.afterEvaluate {
    //Xiaomi
    tasks.matching {
        it.name.startsWith('compile') && (it.name.endsWith('XiaomiReleaseSources'))
    }.each { task ->
        task.dependsOn(chXiaomiRes)  // 任务依赖:执行task之前需要执行dependsOn指定的任务
    }

    //Google
    tasks.matching {
        it.name.startsWith('compile') && (it.name.endsWith('GoogleReleaseSources'))
    }.each { task ->
        task.dependsOn(chGoogleRes)  // 任务依赖:执行task之前需要执行dependsOn指定的任务
    }
}

2.依赖 modle

//一个渠道新建一个 modle,不同的的渠道依赖不同的 modle,把不同的资源放在不同的mudle,适合有多个资源不同的情况(资源名得一样,比如有三张背景图片分别放在三个 modle 下,但它们的名字得一样)
dependencies {
    googleCompile project(':googlereslib')
    xiaomiCompile project(':xiaomireslib')
    _360Compile project(':_360reslib')
}

3.代码判断当前的渠道

//把所有的图片都放到工程下,根据代码判断当前的渠道来设置不同的图片,适合一张图片不一样的情况(名字得不一样)
switch (BuildConfig.FLAVOR) {
            case "google":
                //TODO
                break;
            case "xiaomi":
                //TODO
                break;
            case "_360":
                //TODO
                break;
        }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题