Android Gradle多渠道打包

Android打包方式也是很多的,使用工具或者脚本等,咱今主要看一看自带的Gradle多渠道打包,原理无非就是利用gradle通过manifestPlaceholder换渠道进行处理:

准备工作

前提:把你的各种debug、release环境密钥等等都配置好。
在AndroidManifest.xml修改,这里我们以友盟为例:

 <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />

在build.gradle中这样处理:

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

        /*   更简洁方式如下
        xiaomi {}
         _360 {}
         baidu {}
         wandoujia {}
         */
    }
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }

生成各种渠道包

1.Android studio下部的终端,terminal,如图所示:
这里写图片描述
2.输入assembleRelease,有时候没有反应,此时我们应该配置下gradle 的环境变量,找到gradle的bin目录,复制当前路径,添加到环境变量中,此时继续执行assembleRelease,就可以生成所有渠道的包
tips:gradles 环境变量目录:

C:\Users\hackangel\.gradle\wrapper\dists\gradle-2.14.1-all\8bnwg5hd3w55iofp58khbp6yv\gradle-2.14.1\bin

3.当然有时候遇到以下几个小问题:

*Exceptionis:org.gradle.api.tasks.TaskExecutionException:Executionfailedfortask’:app:compileXXXReleaseJavaWithJavac’.`这主要是javac 环境出问题了,javac环境配置如下:

系统变量->新建->变量名:JAVA_HOME 变量值:(C:\Program Files\Java\jdk1.7.0_03)(这只是我的JDK安装路径)
系统变量->编辑->变量名:Path 在变量值的最前面加上:(%JAVA_HOME%\bin;)
系统变量->新建->变量名:CLASSPATH 变量值:(.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;)//tools.jar很关键,有时候会报这个错误

有时候我们输入assembleRelease后,可能会下载一些gradle包,稍微等一会就好了,没关系

更改输入名称

比如说我们要打包后,输出的名称为输出apk名称为testname_v1.0_2017-01-15_wandoujia.apk
我们就可以在build.gradle中配置一些设置如下:

  applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        // 输出apk名称为testname_v1.0_2017-01-15_wandoujia.apk
                        def fileName = "testname_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }

releaseTime()函数我们定义为:

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

在build.gradle中的完整配置如下:

apply plugin: 'com.android.application'

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

android {
    signingConfigs {
        debug {
            keyAlias 'key'
            keyPassword '123456'
            storeFile file('C:/AndroidStudioWorkSpace/appkey/keystore.jks')
            storePassword '123456'
        }
        release {
            keyAlias 'key'
            keyPassword '123456'
            storeFile file('C:/AndroidStudioWorkSpace/appkey/keystore.jks')
            storePassword '123456'
        }
    }
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
    defaultConfig {
        applicationId "com.redluo.view_1"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]
    }
    lintOptions {
        abortOnError false
    }

    buildTypes {
        release {

            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            debuggable false
            signingConfig signingConfigs.release
            zipAlignEnabled true

            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        // 输出apk名称为testname_v1.0_2015-01-15_wandoujia.apk
                        def fileName = "testname_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
        debug {
            debuggable true
            signingConfig signingConfigs.debug
            minifyEnabled false
            zipAlignEnabled false
        }
    }
    productFlavors {
        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
        _360 {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
        }
        baidu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }
        wandoujia {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }

        /*   更简洁
        xiaomi {}
         _360 {}
         baidu {}
         wandoujia {}
         */
    }
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:23.4.0'
    testCompile 'junit:junit:4.12'
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值