在开发Android过程中,常常需要构建不同环境的Apk,比如我们有可能会需要有三个环境

  • 开发环境
  • 测试环境
  • 线上环境

三种环境对应不同的服务器地址:

   public static final String DEV_URL = "http://dev.domain.com/";public static final String TEST_URL = "http://test.domain.com/";public static final String RELEASE_URL = "http://www.domain.com/";复制代码

可以使用一个变量配置使用不同的环境:

    //0  dev//1  test//2  releasepublic static final int ENV_SETTING = 0;复制代码

定义一个获取不同环境url的方法,默认为dev环境:

    public static String getBaseUrl() {switch (ENV_SETTING) {case 1:return TEST_URL;case 2:return RELEASE_URL;default:return DEV_URL;}}复制代码

这样可以通过设置ENV_SETTING构建不同的Apk:

  • 开发的时候使用默认dev环境
  • 测试的时候给test环境
  • 发布的时候使用release环境

但是这样做却有一些问题,就是每次必须修改ENV_SETTING的值,每次更改都会导致版本库变动,产生新的提交,如果提交之后的话,其他的开发者不一定会知道版本库的变动,导致环境不同产生错误,还有可能环境不对,生产出了错误环境的Apk. 有没有办法解决以下问题呢?

  1. 可以构建不同环境的Apk
  2. 不需要修改代码
  3. 可以使用不同的签名
    利用gradle可以解决上面的三个问题,下面就看下如何使用gradle解决上面的问题吧!

buildConfigField

buildConfigField是gradle的一个方法,他的作用是可以给BuildConfig添加变量,赋值等。它的使用:

buildConfigField("int", "ENV_SETTING", "0")

这样就给BuildConfig中新增加了一个变量EN_SETTING,新增的代码如下:

// Fields from build type: debugpublic static final int ENV_SETTING = 0;复制代码

在代码中使用BuildConfig新增的变量EN_SETTING:

    //0  dev//1  test//2  releasepublic static final int ENV_SETTING = BuildConfig.ENV_SETTING;复制代码

buildConfigField通过BuildConfig类可以把gradle里的配置传递给Java代码。只是传递给了Java值还不能解开始说的三个问题。下面再看下如何在gradle中配置不同的环境。

buildTypes

虽然通过gradle中可以配置ENV_SETTING变量,通过buildConfigField可以让java代码获取到设置的值。但是在buildTypes中只能设置两个变量releasedebug:

buildTypes {release {signingConfig signingConfigs.releasebuildConfigField("int", "ENV_SETTING", "2")}debug {buildConfigField("int", "ENV_SETTING", "0")}}复制代码

buildTypes中只有两种配置,在build的时候只能生产出两个Apk:debugrelease,需要第三种环境的Apk,就需要定义一种新的buildTypes,用来构建测试环境的Apk. 新增加一种buildTypes

 buildTypes {release {signingConfig signingConfigs.releasebuildConfigField("int", "ENV_SETTING", "2")}debug {buildConfigField("int", "ENV_SETTING", "0")}releaseTest.initWith(buildTypes.release)releaseTest {buildConfigField("int", "ENV_SETTING", "1")}}复制代码

新增加buildTypes叫做releaseTest(注意不能使用test开头)。 它继承了buildTypes.release的配置,可以通过buildConfigFieldENV_SETTING重新赋值,它会覆盖buildTypes.release的配置。 这样就有了三种不同的build配置。

assmble*

gradle通过assmble*命令可以打包不同buildTypes的Apk,在右侧的gradle工具栏里面的build菜单栏里面可以看到三种不同的assemble:

  • assembleDebug
  • assembleRelease
  • assembleReleaseTest

这样就可以根据需要构建不同的Apk,不需要更改代码就可以构建不同环境的Apk,而且生成的Apk的名字也能区分出不同的环境,通过上面的配置可以构建出三种Apk:

  • app-debug.apk
  • app-release.apk
  • app-releaseTest.apk

还可以根据上面的配置需要设置不同的Apk签名,通过signingConfig进行设置。

Android-构建不同环境的Apk相关推荐

  1. Android应用构建:3:Android Studio 3.5.3: apk文件构建与验证

    这篇文章介绍一下如何使用Android Studio进行缺省的APK文件生成,以及将此APK文件安装到安卓模拟器上进行结果验证. APK文件种类 根据使用用途和是否有签名的区别,使用Android S ...

  2. 关于Android 构建

    在简书上面有系列关于Android 的文章,还不错,部分同学可以在开发过程中阅读和学习:www.jianshu.com/collection/3fde3b545a35 关于Android 构建,看到这 ...

  3. React Native Android端多环境自动打包

    文章目录 1.技术环境搭建 2.配置Android构建参数. 3.编辑复制文件到指定位置的脚本 4.Jenkins创建工程 5.下载nginx,配置相关参数.HTTPS证书 6.写iOS下载配置文件p ...

  4. win8下cocos2dx3.2移植android平台及代码打包APK

      cocos2dx程序不能只在VS2012下运行,迟早是要搬运到Android和IOS上的.Windows下移植IOS平台先搁下不说比较困难,而且只有越狱的苹果机才可以运行,而且毕竟IOS高端.小众 ...

  5. 第2章:Android的编译环境--build系统

    2.0 build简介 Android的build系统基于GNU Make 和shell 构建的一套编译环境.这套系统定义了大量的变量和函数,无论编写一个产品的配置文件还是一个模块的Android.m ...

  6. Unity2018导出Android工程并自行生成apk(总)

    https://docs.unity3d.com/2018.4/Documentation/Manual/android-gradle-overview.html 以下内容都是在unity2018.4 ...

  7. Android编译及编译脚本、Android构建基础学习笔记

    Android编译及编译脚本.Android构建基础学习笔记 Android编译及编译脚本 概述 Android.mk转换成Android.bp 例子(简单Android.mk文件转Android.b ...

  8. Android直接用手机打包apk!

    你没有看错,用手机浏览器访问Jenkins,就可以打包apk,并生成下载二维码,发送邮件通知测试人员下载,从此解放双手,告别打包测试.先上本人手机邮箱收到的打包成功通知效果图: 废话少说,开干! 本人 ...

  9. Android Studio开发环境及第一个项目

    1. 在你的电脑上搭建Android平台开发环境. 2. 新建项目,实现以下基本内容: (1) 修改默认的APP的名称和图标(任意的,非默认的). (2) 显示个人信息,包括:照片.专业.姓名.学号等 ...

最新文章

  1. python实现glove,gensim.word2vec模型训练实例
  2. Scikit-Learn 常用函数
  3. pt-osc原理、限制、及与原生online-ddl比较
  4. qpython3可以调用哪些库_Python3 如何使用asyncio库在调用第三方模块(存在IO等待)的情况下实现协程?...
  5. mysql一些基本sql操作_MySql数据库的一些基本操作---------------SQL语法
  6. Mybatis_接口编程
  7. html 显图片宽度100,HTML – 如何显示内联几个 100%宽度?
  8. mysql的面试2_mysql数据库面试题(2)
  9. 工具:帆软FineBI使用指南
  10. Vs2015常见错误码:error LNK2019: 无法解析的外部符号;error C2011:类型重定义;
  11. 正交表的查询地址汇总
  12. 打印机显示rpc服务器,win10打印机出现RPC服务器不可用的处理办法
  13. 关于《微习惯》的记录
  14. 外边框HTML代码,HTML代码-边框篇
  15. Kingbase8开发版,启动提示FATAL: XX000: max_connections should be less than orequal than 10
  16. guzzle php,PHP HTTP 客户端 - Guzzle
  17. hr员工数据分析(实战)
  18. oracle是java代码块,Oracle中施行java代码
  19. DDR Layout使用技巧
  20. 读《主角》笔记,摘记秦腔皇后忆秦娥的半生浮沉

热门文章

  1. linux如何导入安装包,linux下安装pip以及导入第三方包
  2. Notebook响应式扁平化后台UI框架模板
  3. DTS-SHOP微信小程序多店铺商城平台java源码
  4. PHP源码-2021来客多商户在线客服系统
  5. .NET 4.0新增命名空间:System.Collections.Concurrent
  6. Bootstrap 3 与 Foundation 5 的区别
  7. iPad iPhone程序增加和删除启动画面
  8. 如何写一个Jquery 的Plugin插件
  9. call_user_func和call_user_func_array的用法
  10. node.js——麻将算法(二)赖子玩法