因为项目中存在多种环境,既要区分bebug与release版本,release又要区分测试环境与生产上线环境,每次打包都得浪费不少的等待时间;并且哪个版本有问题还得去切换环境一个个打包,关键是还得牢记每次切换环境需要修改的内容,尽管每次都检查仔细,但总有可能疏忽的时候,一旦有问题既浪费自己的时间又浪费测试人员的时间;因此不得不去研究一键切换环打包的功能

一、区别debug与release

首先在build.gradle中配置签名信息,为debug配置差异属性

  1. android {
  2.  
  3. defaultConfig {
  4. versionName "v2.2.2"
  5. versionCode
  6. }
  7.  
  8. signingConfigs {
  9. release {
  10. storeFile file('/Users/ram/WorkSpace/AndroidWorkSpace/....keystore')//签名key所在目录
  11. keyAlias '...'
  12. keyPassword '...'
  13. storePassword '...'
  14. }
  15. }
  16.  
  17. buildTypes {
  18. release {
  19. buildConfigField "Boolean", "isDebug", "false"//参数1:类型 参数2:变量名 参数3:变量值
  20. debuggable false
  21. minifyEnabled true //删除无用代码
  22. shrinkResources true//删除无用资源
  23. zipAlignEnabled true
  24. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  25. signingConfig signingConfigs.release//签名
  26. }
  27. debug {
  28. buildConfigField "Boolean", "isDebug", "true"//参数一:类型,参数二:变量名,参数三:变量值
  29. debuggable true // debug模式下,显示log
  30. versionNameSuffix "-debug" // 为版本名添加后缀
  31. minifyEnabled false
  32. zipAlignEnabled false
  33. shrinkResources false
  34. }
  35. }

签名文件及其他通用代码应该都会熟悉,这里主要区别定义的一个常量

buildConfigField "Boolean", "isDebug", "false"//参数一:类型,参数二:变量名,参数三:变量值

这是用于区别是否调试版本,用于是否打印log日志时所用,java中调用方式:

  1. public static final boolean isDebug = BuildConfig.isDebug;

在代码中就可以通过这个值判断是否需要开启Log;还有一个versionNameSuffix "-debug",这个是我的项目中需要显示版本号,在versionName后追加了一个名称,用以区分

二、多渠道区分,配置不同产品的差异属性

同样是在grdle中android{}目录里面添加

  1. productFlavors {//设置不同产品的特性
  2. uat {//测试环境
  3. buildConfigField "String", "HOST", "\".....\""
  4. versionName "v2.2.2.2"
  5. }
  6. prod {//正式上线环境
  7. buildConfigField "String", "HOST", "\".....\""
  8. versionName "v2.2.2"
  9. }
  10. }

这里配置两个不同产品渠道,根据自己的需求可增加删除,其中buildConfigField "String", "HOST", "\".....\""

同上面isDebug一样是根据环境差异增加的一个常量,我这里是用于访问服务器的地址更改;根据自己需求也可以增删改,这里要注意的是第三个参数字符串的双引号需要用转义字符;

同样在java中的调用方法:

  1. public static final String ROOTHOST = BuildConfig.HOST;
  2. 其中versionName是对版本号名称的重命名,这是我项目中对不同环境做版本号区分所用;

三、打包apk文件的重命名

继续在grdle中android{}目录里面添加

  1. //apk文件重命名
  2. applicationVariants.all { variant ->
  3. variant.outputs.all {
  4. def fileName = "xxx-" + versionName + ".apk"
  5. outputFileName = fileName
  6. // output -> output.outputFileName = "NYTalk_" + buildType.name + "_" + defaultConfig.versionName + "_" //+ new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC")) + ".apk"
  7. }
  8. }

这个是用于打包的时候根据自己的需求重命名apk,简单点就自己项目名称加版本号,需要时间等其他参数也可用注释掉的代码,或者自行个更改;需要注意的是defaultConfig.versionName调用的是开始默认的versionName,需要用自己后面修改过的versionName命名,不加defaultConfig即可;

四、assets资源目录做区分

前面主要做的区分都是一些java代码可调用的变量;那么原生assets资源目录如何根据环境做区分:

1.项目结构视图调整为project,在src目录下,mian的同级目录创建uat与prod文件夹(根据productFlavors自己定义的不同产品渠道创建),并创建assets资源目录,这里资源目录里就可以放置不同渠道的同名不同资源,例如:

2.然后继续在grdle中android{}目录里面根据flavors指向定义的资源目录

  1. sourceSets {
  2. assets.srcDirs = ['src/assets']
  3. uat{
  4. assets.srcDirs = ['src/ust/assets']
  5. }
  6. prod {
  7. assets.srcDirs = ['src/prod/assets']
  8. }
  9. }

差异的资源根据产品做区分存放,通用的assets资源按原来的存放方式不变

3.不过我的项目因为是以前的eclipse迁移过来的,src下直接存放是java代码,res与src是同级目录,所以我这里创建的uat与prod文件夹是与src、res同级的,然后在gradle中的配置如下:

  1. sourceSets {
  2. main {
  3. manifest.srcFile 'AndroidManifest.xml'
  4. java.srcDirs = ['src']
  5. resources.srcDirs = ['src']
  6. aidl.srcDirs = ['src']
  7. renderscript.srcDirs = ['src']
  8. res.srcDirs = ['res']
  9. assets.srcDirs = ['assets']
  10. jniLibs.srcDirs = ['libs']
  11. }
  12. uat{
  13. assets.srcDirs = ['uat/assets']
  14. }
  15. prod {
  16. assets.srcDirs = ['prod/assets']
  17. }
  18.  
  19. }

五、环境一键切换,更改Build variants中相应即可,运行手机上切换平台就行

六、一键打包不同平台的apk

Gradle---项目名称下的Tasks---build---assemble,也可以根据不同的assemble生成特定apk

编译生成的apk在build--outputs下查看:

打包好的apk可以自行验证assets资源是否是对应的平台资源,可直接解压apk文件查看

Android多渠道打包且根据不同产品打包不同的assets资源目录的更多相关文章

  1. vue-cli项目打包多个与static文件同级的静态资源目录(copy-webpack-plugin插件的使用)

    场景 业务要求能够直接通过 "域名+/file"的方式访问静态资源的html,然而产品绝对static暴露在url中不好看又不能直接将html放在static中.所以想到了既然st ...

  2. Android Studio在项目中添加assets资源目录

    第一步: 切换到"Project"视图,找到app --> src --> main目录 第二步: 右键点击main目录,New --> Directory -- ...

  3. Android之assets资源目录的各种操作

    第一种方法:       String path = file:///android_asset/文件名; 第二种方法:         InputStream abpath = getClass() ...

  4. Gradle 实现 Android 多渠道定制化打包

    Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...

  5. 更便捷的Android多渠道打包方式

    本文先回顾了以往流行的多渠道打包方式,随后引入的mcxiaoke的packer-ng-plugin项目,介绍该项目在实际应用(配合友盟统计)中如何解决更方便的Android多渠道打包问题 多渠道打包方 ...

  6. android 多渠道打包

    android 多渠道打包 原理 在manifest文件中,application标签内部设置不同的metadata标签即可,可以通过java api获取这个matedata内的值 友盟提供的多渠道打 ...

  7. 【Android】Android多渠道打包--Gradle打包

    Android多渠道打包--Gradle打包 前言 由于App一般都会在多个应用市场上架,为了分析App在每个不同渠道的具体的数据,一般都会对不同渠道打包不同的App.多渠道打包有多种方式,这里只介绍 ...

  8. 2014年最新720多套Android源码2.0GB免费一次性打包下载

    之前发过一个帖子,但是那个帖子有点问题我就重新发一个吧,下面的源码是我从今年3月份开始不断整理源码区和其他网站上的android源码,目前总共有720套左右,根据实现的功能被我分成了100多个类,总共 ...

  9. Android Studio环境下代码混淆+签名打包

    Android Studio环境下代码混淆+签名打包 作者 Mr_冯先生 关注 2016.08.21 01:10 字数 1040 阅读 734评论 5喜欢 34 注:本文使用的Android Stud ...

随机推荐

  1. C++入门经典-例6.10-将多维数组转换成一维数组

    1:代码如下: // 6.10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...

  2. MySQL 获取格林时间

    SELECT *FROM 表面WHERE DATE_SUB( NOW( ), INTERVAL 3 MINUTE ) <= CONVERT_TZ( 时间字段, @@SESSION.time_zo ...

  3. 2019java第十二周课程总结

    本周主要还是学习图形界面 各种容器使用方法 如下代码: package text10; import java.awt.*; import java.io.File; import javax.swi ...

  4. track-by的使用

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. Java: Integer用==比较时127相等128不相等的原因

    直接看问题吧 for (int i = 0; i < 150; i++) { Integer a = i; Integer b = i; System.out.println(i + " ...

  6. kolla-ansible-----常用命令

    常用命令 kolla-ansible prechecks -i multinode #部署前环境检测 kolla-genpwd #生成/etc/kolla/password.yml密码配置文件 kol ...

  7. 通过Precision/Recall判断分类结果偏差极大时算法的性能

    当我们对某些问题进行分类时,真实结果的分布会有明显偏差. 例如对是否患癌症进行分类,testing set 中可能只有0.5%的人患了癌症. 此时如果直接数误分类数的话,那么一个每次都预测人没有癌症的 ...

  8. rocketmq的一些内容

    分布式开放消息系统(RocketMQ)的原理与实践 作者 CHEN川 关注 2016.02.25 15:43* 字数 6784 阅读 122302评论 41喜欢 321赞赏 7 一年前为了一次内部分享 ...

  9. 查询处理Oracle锁表的问题

    --以下几个为相关表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * FROM v$proce ...

  10. centos7.5 安装python3.7

    一,官网下载最新版python安装包 二,解压并编译安装 ,解决依赖关系 yum -y install epel-release libffi-devel zlib* ,解压编译 .tgz cd Py ...