AndroidStudio多渠道打包

参考资料 博客: http://blog.csdn.net/mynameishuangshuai/article/details/51783303 http://stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ 视频: http://www.imooc.com/learn/752

假如AndroidManifest.xmlmeta-data>CHANNEL 是渠道的标准

1、在AndroidManifest.xml里设置动态渠道变量
<meta-data
            android:name="CHANNEL"
            android:value="${CHANNEL_VALUE}" />

上面的value值CHANNEL_VALUE就是渠道标识。我们的期望的就是在编译时候这个值能够自动变化以满足区分多渠道的需求。

2、在build.gradle设置productFlavors

这里假定我们需要打包的渠道为小米、百度

android {  
    productFlavors {
        xiaomi {
            manifestPlaceholders = [CHANNEL_VALUE: "xiaomi"]
        }
        baidu {
            manifestPlaceholders = [CHANNEL_VALUE: "baidu"]
        }
    }  
}

如果打包的渠道比较多我们还可以批量修改

    //多渠道打包
    productFlavors {
        xiaomi {}
        baidu {}
    }

    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
    }

所谓ProductFlavors其实就是可定义的产品特性,配合 manifest 使用的时候就可以达成在一次编译过程中产生多个具有自己特性配置的版本。上面这个配置的作用就是,为每个渠道包产生不同的 CHANNEL_VALUE 的值。如果两者设置的值不一样就会出现以下的异常

动态渠道变量设置不一致导致的异常

3、在build.gradle文件中配置签名信息
 signingConfigs {
        release {
            storeFile file("wxkey")
            storePassword '123456'
            keyAlias '1'
            keyPassword '123456'
        }
        debugConfig {
            storeFile file("wxkey")      
            storePassword "123456"
            keyAlias "1"
            keyPassword "123456"
        }
    }
4、执行打包命令 ./gradlew assembleRelease

在AndroidStudio窗口左下角打开Terminal面板,widnow输入gradlew assembleRelease Mac或者Linux输入./gradlew assembleRelease命令可以一次性打包出所有的签名渠道包

执行打包命令

打包成功后会提示BUILD SUCCESSRUL并在app>build>outputs>apk目录生成签名的apk

5、单独分别打bug或者release渠道包

1、如果我们想打xiaomi渠道的release版本,执行如下命令:

./gradlew assemblexiaomiRelease

2、如果我们想打xiaomi渠道的bug版本,执行如下命令:

 ./gradlew assemblexiaomiDebug

3、如果我们想打xiaomi渠道的release版以及bug版,则执行如下命名:

 ./gradlew assemblexiaomi

4、打全部Release版本:

 ./gradlew assembleRelease

5、打全部Debug版本:

 ./gradlew assembleDebug
6、自定义所打APK包名称

当我们的渠道包版本比较多时,可以自定义所打APK包名称,用以区分

// 自定义输出配置
applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                // 输出apk名称为JPay_0.0.1_xiaomi.apk
                def fileName = "JPay_${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
                output.outputFile = new File(outputFile.parent, fileName)
        }
    }
}

执行打包命令./gradlew assemblexiaomiRelease 我们发现输出的apk以及修改为了我们自定义的名称

自定义输入apk的名称

7、完整示例的配置
apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"
    defaultConfig {
        applicationId "mayihuijia.com"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "0.0.1"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    signingConfigs {
        release {
            storeFile file("wxkey")
            storePassword '123456'
            keyAlias '1'
            keyPassword '123456'
        }
        debugConfig {
            storeFile file("wxkey")
            storePassword "123456"
            keyAlias "1"
            keyPassword "123456"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
            // 自定义输出配置
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        // 输出apk名称为JPay_0.0.1_xiaomi.apk
                        def fileName = "JPay_${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
        debug {
            signingConfig signingConfigs.debugConfig
        }
    }
    lintOptions {
        abortOnError false
    }
    //多渠道打包
    productFlavors {
        xiaomi {}
        baidu {}
    }

    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [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:24.2.1'
    testCompile 'junit:junit:4.12'
    compile 'com.javen205.jpay:jpaysdk:0.0.1'
}
 

安利时间: JPay是对微信App支付、支付宝App支付的二次封装,对外提供一个相对简单的接口以及支付结果的回调

极速开发微信公众号是对微信公众平台接口的二次封装。包括开发者模式、事件回调监听、微信模板消息、微信客服消息、自定义菜单、微信支付、素材管理等

如遇到问题欢迎留言交流

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

三分钟构建高性能 WebSocket 服务 | 超优雅的 SpringBoot 整合 Netty 方案

这是个开源的框架。通过它,我们可以像spring-boot-starter-websocket一样使用注解进行开发,只需关注需要的事件(如OnMessage)。...

30620
来自专栏Ryan Miao

SpringCloud学习5-如何创建一个服务提供者provider

14530
来自专栏北京马哥教育

Python大法之告别脚本小子---信息资产收集类脚本编写

在采集到URL之后,要做的就是对目标进行信息资产收集了,收集的越好,你挖到洞也就越多了............当然这一切的前提,就是要有耐心了!!!由于要写工具...

22400
来自专栏Debian社区

使用apt-get时出现 “no public key available” 的解决方法

在 Debian 和 Ubuntu 下运行 apt-get update 刷新更新源的时候,经常遇到 “There is no public key avail...

14220
来自专栏bboysoul

扫描检测你的局域网中是不是还有EternalBlue漏洞(ETERNAL SCANNER)

好久没有写过关于工具的博客了,今天介绍的是EternalBlue漏洞扫描工具,支持扫描单个主机和一整个ip段 废话不多说,安装使用体验一下

22320
来自专栏轻扬小栈

ubuntu pogoplug openwrt 编译全过程

20130
来自专栏杨建荣的学习笔记

两条报警信息的分析(第二篇)(r6笔记第71天)

还是继续分析报警信息的关联,下面两个看似没有直接联系的报警信息其实很有关联。 下面是主库的报警的信息,查看v$dataguard_status得到了最新的错误信...

36570
来自专栏编程思想之路

Android6.0锁屏源码分析之界面布局分析

大致先介绍一下锁屏界面 Android的锁屏界面可以分为两级, 一级锁屏界面暂且称之为锁屏界面LockScreen,即平常用到的无需任何输入和验证,只需滑动解锁...

43380
来自专栏pangguoming

使用AndroidStudio编译NDK的方法及错误解决方案

参考资料: 【android ndk】macos环境下Android Studio中利用gradle编译jni模块及配置:http://demo.netfouc...

799120
来自专栏SpringBoot 核心技术

第三十二章:如何获取SpringBoot项目的applicationContext对象

321110

扫码关注云+社区

领取腾讯云代金券