博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「Do.014」Android 实战项目(5)—— gradle 配置release与debug环境分离
阅读量:6102 次
发布时间:2019-06-20

本文共 6003 字,大约阅读时间需要 20 分钟。

首发公众号:
Android程序员日记
作者:
贤榆的榆
如果你觉得有帮助欢迎
关注、赞赏、转发
阅读时间:4750字 9分钟

对于Android 实战项目这个系列,我已经写了项目入门搭建、git项目管理、git分支管理及As实用插件,文末有对应的链接。这前面都是一些不可或缺的准备工作。那么今天我给大家分享通过gradle来配置项目的release和debug的环境分离。

从Android Studio 1.5开始我就开始使用Android Studio 做Android 开发了。当时觉得很省事儿的就是,applicationId 、minSdkVersion 、targetSdkVersion 、versionCode 、versionName 这些东西以及签名的key和密码也都可以直接在build.gradle中进行配置。从Eclipse 过渡到Android Studio 我个人觉得还是受到了AS的不少好处。而将release和debug环境分离也算其中一个吧。

好了,话不多少,先看一下效果图吧!

Wechat2345IMG91

正如上图大家看到,我们最终需要的效果是可以在同一台手机上同时运行我们的正式app和测试app,它们有不同的图标、不同的报名,还有就是测试换请求的服务器地址与正式环境也是不一样的!

配置环境分离

1、配置config.gradle

其实这不是配置环境分离的必要条件,但是创建一个config.gradle文件,可以方便我们统一管理一些module下gradle文件用的变量,便于我们开发和维护。

  • 切换为project目录结构。如图

  • 根目录下创建一个config.gradle的文件
  • 并在该文件中配置提到上文的applicationId等信息以及我们会用的依赖信息。具体配置如下:

    ext {    supportLibrary = "27.1.0"    android = [            compileSdkVersion: 27,            minSdkVersion    : 16,            targetSdkVersion : 26,            buildToolsVersion: "27.0.3",            versionCode      : 1,            versionName      : "2.3.0.0"    ]     //配置数据服务器的host地址    url = [            "debug"  : "https://test.com",            "release": "https://release.com"    ]    //配置图片服务器的host地址    imgUrl = [            "debug"  : "http://test.image.com/picture",            "release": "https://release.image.com/picture"    ]    //统一配置依赖库    dependencies = [            "multidex"     : "com.android.support:multidex:1.0.1",            "cardview"     : "com.android.support:cardview-v7:${supportLibrary}",            "constraint"   : "com.android.support.constraint:constraint-layout:1.0.2",            "recyclerview" : "com.android.support:recyclerview-v7:${supportLibrary}",            "suppoutDesign": "com.android.support:design:${supportLibrary}"    ]}

2、主项目的build.gradle中引入config.gradle

//这里将config.gradle文件引用进来,app的gradle才能使用到里面的配置项。apply from: "config.gradle"    buildscript {    repositories {        google()        jcenter()    }    dependencies {        classpath 'com.android.tools.build:gradle:3.1.3'    }}allprojects {    repositories {        google()        jcenter()    }}task clean(type: Delete) {    delete rootProject.buildDir}

3、在module下的build.gradle中配置环境分离

apply plugin: 'com.android.application'def cfg = rootProject.ext.androiddef libraries =rootProject.ext.dependenciesandroid {    compileSdkVersion 27    defaultConfig {        applicationId cfg.appId        minSdkVersion cfg.minSdkVersion        targetSdkVersion cfg.targetSdkVersion        versionCode cfg.versionCode        versionName cfg.versionName    }    //配置签名    signingConfigs {        debug {            storeFile file("../app/androidBook")            storePassword KEYSTORE_PASSWORD            keyAlias DEBUG_KEY_ALIAS            keyPassword DEBUG_KEY_PASSWORD        }        release {            storeFile file("../app/androidBook")            storePassword KEYSTORE_PASSWORD            keyAlias RELEASE_KEY_ALIAS            keyPassword RELEASE_KEY_PASSWORD        }    }    buildTypes {        debug {            //是否压缩资源            shrinkResources false            //是否混淆            minifyEnabled false            //混淆配置文件            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'            //签名配置            signingConfig signingConfigs.debug            //在release包名后面添加了一个后缀形成了debug的包名            applicationIdSuffix '.inhouse'            //在AndroidManifest.xml中配置的app名称,在这里实现了动态配置            resValue "string", "app_name", "@string/app_name_debug"            //该数组的值都可以在AndroidManifest.xml文件中配置。            manifestPlaceholders = [                    //这里也是在AndroidManifest.xml中配置的app图标,同样在这里写了了不同的资源文件,从而实现了动态配置                    app_icon: "@drawable/app_logo_debug",            ]            //通过配置buildConfig来动态配置请求的host服务器和图片服务器            buildConfigField "String", "HostUrl", "\"${url["release"]}\""            buildConfigField "String", "ImageUrl", "\"${imgUrl["release"]}\""        }        release {            shrinkResources true            minifyEnabled true            resValue "string", "app_name", "@string/app_name_release"            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'            signingConfig signingConfigs.release            manifestPlaceholders = [                    app_icon: "@drawable/app_logo",            ]            buildConfigField "String", "HostUrl", "\"${url["uat"]}\""            buildConfigField "String", "ImageUrl", "\"${imgUrl["debug"]}\""        }    }}dependencies {    implementation fileTree(dir: 'libs', include: ['*.jar'])    testImplementation 'junit:junit:4.12'    androidTestImplementation 'com.android.support.test:runner:1.0.2'    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'    //引用了config.gradle中配置的库文件,从而实现在config.gradle实现版本的统一管理管理    implementation libraries.supportV7    implementation libraries.constraint    implementation libraries.supportDesign    implementation libraries.recyclerview    implementation libraries.cardview}

注:

1、提醒看上文中的注解
2、上文中的签名文件大家可以自行生成,build-->Generate Signed Apk即可
3、signingConfigs中的签名配置是放到了gradle.properties文件中,这样比较直接写在build.gradle中安全(配置如下)

KEYSTORE_PASSWORD=123456DEBUG_KEY_PASSWORD=debug123456RELEASE_KEY_PASSWORD=123456DEBUG_KEY_ALIAS=debugRELEASE_KEY_ALIAS=release

4、在上文中动态配置了app_nameapp_icon最后需要将这两个值配置在AndroidManifest.xml文件中(如下)

……

5、同上一步配置app_icon,AndroidManifest中其他的需要动态配置变量也可以通过对manifestPlaceholders数组配置相应的键值对来实现,比如通过下面的代码可以动态配置正式和测试环境所需要的appId、appKey等值

manifestPlaceholders = [            JPUSH_PKGNAME: "com.xianyu.app",            JPUSH_APPKEY : "1234567890asdfghhjk", //JPush上注册的包名对应的appkey(托盘).正式Key            JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.    ]

4、运行我们的应用

好了,基本上配置工作就暂且做完。至于网络环境如如何动态切换,我们这先不讲,后面封装网络的时候会踢到。那么,下面我们通过AS左下角的Build Variants 中app的release和deubug 打两个包到手机上看一下效果,如下图

这里是我运行两两个包后,查看后台的截图,我们可以看到两个app同时运行在手机上并且有着不同的名字。

本文源码在这:

最后,如果想要了解更多关于gradle的实用和实战可在我的公众号回复「gfa」(英文书名的首字母)获取下面这本介绍gradle的电子书

书名:Gradle for Android 中文版
作者:凯文·贝利格里姆斯著(美)
译者:余小乐译
北京:电子工业出版社
豆瓣评分:8.8

推荐阅读

系列文章

其他

欢迎大家关注我的公众号

转载地址:http://hqiza.baihongyu.com/

你可能感兴趣的文章
P127、面试题20:顺时针打印矩阵
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
【FJOI2015】金币换位问题
查看>>
数学之美系列二十 -- 自然语言处理的教父 马库斯
查看>>
Android实现自定义位置无标题Dialog
查看>>
面试总结
查看>>
Chrome浏览器播放HTML5音频没声音的解决方案
查看>>
easyui datagrid 行编辑功能
查看>>
类,对象与实例变量
查看>>
HDU 2818 (矢量并查集)
查看>>
【转】php字符串加密解密
查看>>
22. linux 常用命令
查看>>
ASP.Net 使用GridView模板删除一行的用法
查看>>
(十六)字段表集合
查看>>
JPGraph
查看>>
实验二 Java面向对象程序设计
查看>>
------__________________________9余数定理-__________ 1163______________
查看>>