首发公众号: 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环境分离也算其中一个吧。
好了,话不多少,先看一下效果图吧!
正如上图大家看到,我们最终需要的效果是可以在同一台手机上同时运行我们的正式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.android
def libraries =rootProject.ext.dependencies
android {
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=123456
DEBUG_KEY_PASSWORD=debug123456
RELEASE_KEY_PASSWORD=123456
DEBUG_KEY_ALIAS=debug
RELEASE_KEY_ALIAS=release
4、在上文中动态配置了app_name
和app_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同时运行在手机上并且有着不同的名字。
本文源码在这:
https://github.com/luorenyu/n...
最后,如果想要了解更多关于gradle的实用和实战可在我的公众号回复「gfa」(英文书名的首字母)获取下面这本介绍gradle的电子书
书名:Gradle for Android 中文版
作者:凯文·贝利格里姆斯著(美)
译者:余小乐译
北京:电子工业出版社
豆瓣评分:8.8
推荐阅读
系列文章
- 「Do.006」Android实战项目(1)——我想说“开始吧”
- 「Do.007」Android实战项目(2)——使用Github进行版本管理
- 「Do.008」Android实战项目(3)——Git 分支管理模型
- 「Do.009」Android实战项目(4)——AndroidStudio插件推荐(磨刀)
其他
- 「Do.011」你是主动选择还是被动接受
- 「Do.002」有道云笔记--好用但不安全
- 「Do.013」在中国,原创到底有多难?