资讯专栏INFORMATION COLUMN

「Do.014」Android 实战项目(5)—— gradle 配置release与debug环境

helloworldcoding / 599人阅读

摘要:当时觉得很省事儿的就是,这些东西以及签名的和密码也都可以直接在中进行配置。切换为目录结构。如图根目录下创建一个的文件并在该文件中配置提到上文的等信息以及我们会用的依赖信息。

首发公众号: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_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同时运行在手机上并且有着不同的名字。

本文源码在这:
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」在中国,原创到底有多难?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14479.html

相关文章

  • Do.021」一文了解AndroidStudio3.4的全部更新

    摘要:而且是持续的关注。配置主要可以针对项目中每个的和三块儿内容进行了配置。默认启动在一步中集成了脱糖,压缩,混淆,优化和转文件,从而显着提高了构建性能。是在插件中引入的,现在为使用插件及更高版本的应用和库项目默认启用。 showImg(https://segmentfault.com/img/remote/1460000018969196); 首发公众号:Android程序员日记作者:贤榆...

    A Loity 评论0 收藏0
  • Do.016」AndroidStudio不用编译,阅读Android源码

    摘要:不过在尝试了很多次之后,我也完美的搭好了阅读源码的环境。下面我就告诉大家如何做到不用编译就能导入阅读源码。当然你也可以不同步直接使用来检出里面的源码项目。那么在这里之所以不用编译,不是真的无需编译。 showImg(https://segmentfault.com/img/remote/1460000016830248); 首发公众号:Android程序员日记作者:贤榆的榆如果你觉得有...

    flyer_dev 评论0 收藏0
  • Do.018」接私活儿,是否有必要?

    摘要:对于接这样的私活儿,我个人的看法是因人而异的。对于这一类私活儿我个人的态度是有非常必要的。这就是我说的接技术以外的私活儿是有必要的,尽管你自己都不曾意识到这是在接私活儿。 showImg(https://segmentfault.com/img/remote/1460000017714596?w=1280&h=720); 首发公众号:Android程序员日记作者:贤榆的榆如果你觉得有帮...

    arashicage 评论0 收藏0
  • Do.023」为啥用XML定义的虚线显示成了实线

    摘要:由于启用硬件加速所需的资源增加,您的应用程序将消耗更多。之所以虚线会在大部分手机上绘制成实现是因为就是因为的方法不支持硬件加速。其实通过上表可以看到,在级别以后,就可以不用关闭硬件加速也可以绘制定义的虚线了。 showImg(http://image-ronny.test.upcdn.net/2019/06/21/15610336160649.jpg); 首发公众号:Android程序...

    William_Sang 评论0 收藏0
  • Gradle实战Android多渠道打包方案汇总

    摘要:美团自动化之旅生成渠道包美团自动化之旅适配渠道包实现参考实现参考深入学习系列教程六多渠道打包产品研发五多渠道打包更便捷的多渠道打包方式打包系列多渠道快速打包 原文地址:http://blog.csdn.net/u0108184... Gradle实战系列文章: 《Gradle基本知识点与常用配置》《Gradle实战:不同编译类型的包同设备共存》《Gradle实战:发布aar包到mav...

    gitmilk 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<