gradle实现多渠道打包

Gradle应该都不陌生,熟悉android studio的应该都用过gradle,这篇文章主要内容有:

a.Gradle的基本认识

b.Gradle实现多渠道打包

本文原创,转载请注意在CSDN上的出处:

http://blog.csdn.net/kemeng7758/article/details/56673751

1、Gradle的认识

Gradle是一种基于Groovy的动态DSL,而Groovy语言是一种基于jvm的动态语言。如果对java语言比较熟悉的话,查看Groovy语言应该不难。我们如果纯粹使用Gradle去构建工程,可以不必深入了解Groovy,如果要做一些插件化的开发的话,需要比较深入的了解一下Groovy。

每个Module都有一个build文件,里面是相应module一些配置信息,在我们的主工程下面有一个全局的build,里面的配置信息为所有的Module所共享。下面我们看一下Android Studio下面的工程目录:


2、多渠道打包

2.1、在上面的工程目录中,我们可以看到选中部分为主工程下面的build文件,这个build文件里面的配置信息为所有的module所共享。下面我们看一下这个文件里面的内容,直接上代码

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
    }
}
def supportVersion ="25.0.1"
ext{
    COMPILESDKVERSION = 25
    BUILDTOOLSVERSION = "25.0.2"
    MINSDKVERSION = 17
    TARGETSDKVERSION = 25
    libSupportAppCompat="com.android.support:appcompat-v7:${supportVersion}"
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

在上面的代码中,我们可以看到在buildscript下的repositories使用的仓库是jcenter(),这个仓库类似于maven仓库,当然我们也可以使用其他的仓库,无论是远程的还是本地的。

ext下面的内容,为我们项目的共有部分,之所以将这一部分内容抽取出来是为了避免编译版本或者版本信息发生变化的时候,我们还要去逐个修改module下面的build文件,我们的这个全局build文件对应的对象就是rootProject,所以我们在其他module中引用的时候直接通过rootProject.ext.COMPILESDKVERSION这样的方式来引用,以后我们只要修改这一个地方就可以了。当然我们也可以将我们app这个module的build文件中dependencies下面依赖的库统一整理到这下面,为了便于修改版本号发生的变化。例如:

libSupportAppCompat="com.android.support:appcompat-v7:${supportVersion}"

2.2、下面我们看一下我们app module下面的build文件的内容

apply plugin: 'com.android.application'
apply from: rootProject.getProjectDir().getAbsolutePath() + "/utils.gradle"

android {
    compileSdkVersion rootProject.ext.COMPILESDKVERSION
    buildToolsVersion rootProject.ext.BUILDTOOLSVERSION
    defaultConfig {
        applicationId "com.guannan.gradlepractice"
        minSdkVersion rootProject.ext.MINSDKVERSION
        targetSdkVersion rootProject.ext.TARGETSDKVERSION
        versionCode VERSIONCODE.toInteger()
        versionName VERSIONNAME
        // dex突破65535的限制
        multiDexEnabled true
    }
    //签名的相关信息
    signingConfigs{
        debug{
            storeFile file(KEY_PATH)
            storePassword STORE_PASSWORD
            keyAlias KEY_ALIAS
            keyPassword STORE_PASSWORD

        }
        release{
            storeFile file(KEY_PATH)
            storePassword STORE_PASSWORD
            keyAlias KEY_ALIAS
            keyPassword STORE_PASSWORD
        }
    }

    buildTypes {
        release {
            //对签名信息的引用
            signingConfig signingConfigs.release
            minifyEnabled true
            //指向我们系统默认的系统混淆文件,我们可以对此修改
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug{
            signingConfig signingConfigs.debug
        }
    }

    //列出我们要打的那些渠道的包的名称
    productFlavors{
        wandoujia{}
        _360{}
        baidu{}
        xiaomi{}
    }
    //批量修改清单文件中的渠道号
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
}

task cleanApks {
    deleteTargetFile(file("$outputLocation").getAbsolutePath())
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile rootProject.ext.libSupportAppCompat
}
//这里定义了我们打好的包的输出的位置
android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.outputFile = file("$outputLocation/demo_${VERSIONNAME}_${variant.productFlavors[0].name}_${variant.buildType.name}.apk");
    }
}
app module下面的gradle.properties里面的配置信息

VERSIONCODE = 1
VERSIONNAME = 3.0
KEY_PATH=./myDemo.jks
STORE_PASSWORD=521kemeng
KEY_ALIAS=demoKey
outputLocation= ./guannan

2.3多渠道打包的步骤(这里以友盟统计为例)

(一)在AndroidManifest.xml文件中的application下面有这样一段代码

<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}"/>
我们在编译的时候希望能够改变UMENG_CHANNEL_VALUE这个值
(二)在build文件中设置productFlavors,动态修改manifestPaceholders的值

 //列出我们要打的那些渠道的包的名称
    productFlavors{
        wandoujia{}
        _360{}
        baidu{}
        xiaomi{}
    }
    //批量修改清单文件中的渠道号
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
或者使用

productFlavors{
        wandoujia{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
        _360{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
        }
        baidu{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }
        xiaomi{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
    }

(三)设置完了以后我们可以使用命令行或者android studio自带的方式一键打包

1.我们可以进入我们项目所在的目录,打开命令行,使用gradle assembleRelease或者gradle assembleDebug打出所有的Release和debug包,如果我们想只打出某一个市场上面的包,我们可以使用命令:gradle assembleBaidu这样的命令,这样就会在我们所修改的目录下面生成包

//这里定义了我们打好的包的输出的位置
android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.outputFile = file("$outputLocation/demo_${VERSIONNAME}_${variant.productFlavors[0].name}_${variant.buildType.name}.apk");
    }
}

如果我们不修改目录,默认会在app module下面的build下的outputs文件夹下面

2.或者使用android studio自带的方式一键打包,如图所示


我们只要双击我们想打的包就可以了,当然前提是你已经配置好了build文件,然后编译好了之后就会自动生成这些文件。


欢迎大家留言,指出不当的地方,大家一起学习!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值