Android实现APP环境分离(利用Gradle)

一、环境分离简介

每个App项目,至少都会有两个环境:测试环境和生产环境。多的甚至有四个环境:开发环境、测试环境、预生产环境和生产环境。开发人员经常需要在环境之间切换,测试人员也同样。经常出现测试人员今天需要测试环境的最新版本,叫App开发人员打包一个给她,明天需要切换到生产版本,再叫App开发人员打包一个生产环境的给她。我们知道,一个App,在一台手机上要么只能是测试环境的,要么只能是生产环境的。测试人员要测试两个环境,只能不断替换不同环境的同个App,这实在太麻烦了。为了解决此问题,最好的方案就是环境分离,不同环境有不同的App。

但对于Android App来讲,相同包名的apk在同一个设备上只能存在一个。所以我们无法做到在同一个设备上同时安装生产环境和测试环境的安装包,这对于日常的开发工作和测试人员的测试工作极不方便。总不能将整个工程复制一份,再通过修改包名的方式打包出另一个apk吧。所以在这种情况下,以往常见的做法就是在app中提供一个隐形的入口,供内部人员切换服务器地址,然后通过以下代码重启App:

private void restartApp(){ Intent intent = getContext().getPackageManager().getLaunchIntentForPackage(getContext().getPackageName()); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); }

显然,这种做法也只是一种缓兵之计,多少还是有些不尽人意。然而,值得庆幸地是,进入Android Studio时代后,Google开始使用引入Gradle构建系统,applicationId的出现使得环境分离的问题迎刃而解。

二、package 与 applicationId

在使用Eclipse开发Apk或旧版本的Gradle构建系统中,应用的包名由AndroidManifest.xml文件中package属性决定。同时,这个package还被用来定义命名被引用的资源类R文件。

但是在新的Android Gradle构建系统中,package属性的两大作用得到了解藕:applicationId作为应用的唯一标识符(包名),用于区分不同应用;package属性定义资源类R文件,用于引用。

applicationId存在于app/build.gradle文件中的defaultConfig配置下,新建项目时默认使用package属性值初始化,所以如果没有特殊的需求,一般我们不会在意和修改这个值:

apply plugin: 'com.android.application' android { compileSdkVersion 19 buildToolsVersion "19.1" defaultConfig { applicationId "com.example.my.app" minSdkVersion 15 targetSdkVersion 19 versionCode 1 versionName "1.0" } ...

所以,要实现Apk的环境分离,也就是在同一设备上安装同一应用的不同版本,从本质上我们要修改applicationId的值,构建打包出不同包名的apk安装文件。Gradle构建系统提供了两种方式供开发人员修改applicationId的值,productFlavors和buildTypes,通过这两个方式我们可以轻松实现apk的打包定制,或者说Build Variants(构建变种)。

三、Build Variants

项目的productFlavors和buildTypes配置可以在app/build.gradle代码文件或者Project Structure上修改,作用是一样的。

四、productFlavors

项目可以通过定义多个不同的productFlavors来实现应用的不同定制版本,每一个Flavor与buildTypes配合产出对应的一种输出类型的apk文件,新建的项目初始化只有一个默认的Flavor:defaultConfig

注意:默认的defaultConfig为新建的productFlavors提供基本的配置,也就说,productFlavors的配置会覆盖defaultConfig中相同的属性,从而实现产品的不同定制版输出。对于环境分离,这里可以通过定义新的applicationId属性来实现。

五、buildTypes

默认情况下,项目的buildTypes包含debug和release两个构建版本,其中release版本的执行需要手动设置签名文件。对于环境分离,与productFlavors不同的是,buildTypes通过定义applicationIdSuffix来实现的,即添加后缀名:

除了这些可配置的属性外,productFlavors和buildTypes都会通过各自的sourceSet来提供代码和资源,默认的路径为:src/flavorName和src/typeName。利用这个特性,我们可以实现不同定制版本的apk显示不同的应用名称和桌面图标,以便从设备上进行区分。

productFlavors和buildTypes配合产出各种格式为“flavorName + typeName”的Build Variants,以打包出不同版本的apk。当你没有自定义flavors,默认的defaultConfig也会与buildTypes形成对应的Build Variants,只是没有名字,所以显示为debug和release。比如这段配置:

android { ... productFlavors{ beta{ applicationId 'com.yifeng.mdstudysamples.beta' } production{ applicationId 'com.yifeng.mdstudysamples' } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { applicationIdSuffix '.debug' } } }

我们配置了beta和production两种productFlavors,release和debug两种buildTypes。所以,对应的Build Variants就有四种,分别为:betaDebug、betaRelease、productionDebug和productRelease。可以在Build Variants窗口查看并选择对应的构建类型运行应用:

注意:前面提到,buildTypes通过添加后缀的方式修改applicationId(包名)的,换句话说,就是在productFlavors的基础上修改包名的。所以,在上面这个例子中,betaRelease构建类型打包出的apk文件的包名是:com.yifeng.mdstudysamples.beta.debug。

五、实现方式

通过上面这些介绍,基本上大家能够知道在Android上如何实现app的环境分离了。我们可以选择使用productFlavors和buildTypes这两种方式在同一个设备上来安装同一个应用的不同版本。他们道理上是一样的,只是相比之下,使用buildTypes不用新建productFlavors,更为方便。这里我就buildTypes为例简单描述一下环境分离的实现。

1.对于一个默认productFlavors和buildTypes配置的项目,我们修改debug配置的applicationIdSuffix属性,设为".debug"(名字可以随意设置),release版本不用变动。

android { ... buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { applicationIdSuffix '.debug' } } }

有了这一步,已经能够将debug版本和release的apk安装在同一个设备上了。还可以做到更好,比如修改debug版本的桌面图标、应用名称等,便于区分。

2.我们在src目录下新建一个debug目录,将main目录下的res目录复制一份到debug目录下,修改各个分辨率下的桌面Icon和strings.xml文件中的应用名称,加个debug标识。目录结构如图所示:

在构建打包时,debug目录下的res资源采用叠加的方式合并到main里面去,并替换相同的内容,而这个例子只需要修改桌面Icon和应用名称,所以这里我只复制了res目录下的相关文件,其他文件并未复制。

3.修改代码里的服务器接口地址,选择对应的Build Variants类型,运行即可。其实也可以在debug和main目录下的string.xml资源文件中定义服务器地址,然后在程序的入口处赋值给代码里的全局静态变量。

总结

以上就是这篇文章的全部内容了,希望能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

时间: 2024-09-20 01:05:11

Android实现APP环境分离(利用Gradle)的相关文章

Android实现APP环境分离(利用Gradle)_Android

一.环境分离简介 每个App项目,至少都会有两个环境:测试环境和生产环境.多的甚至有四个环境:开发环境.测试环境.预生产环境和生产环境.开发人员经常需要在环境之间切换,测试人员也同样.经常出现测试人员今天需要测试环境的最新版本,叫App开发人员打包一个给她,明天需要切换到生产版本,再叫App开发人员打包一个生产环境的给她.我们知道,一个App,在一台手机上要么只能是测试环境的,要么只能是生产环境的.测试人员要测试两个环境,只能不断替换不同环境的同个App,这实在太麻烦了.为了解决此问题,最好的方

Android studio利用gradle打jar包并混淆的方法详解

本文主要介绍了Android studio利用gradle打jar包并混淆的方法,下面话不多说,来看看详细的介绍吧. 首先打jar包的配置很简单,使用jar的task,可以参考gradle官方文档,具体代码如下: task buildJar(type: Jar, dependsOn: ['assembleRelease']) { destinationDir = file('build/outputs/jar/') appendix = "" baseName = "&quo

图文详解Android Studio搭建Android集成开发环境的过程_Android

有很长一段时间没有更新博客了,最近实在是太忙了,没有时间去总结,现在终于可以有时间去总结一些Android上面的东西了,很久以前写过这篇关于使用Android Studio搭建Android集成开发环境,不过一直没有发表出来,写这篇文章的目的是记录一下Android开发环境的搭建过程,这篇文章写得一般般,主要是记录了整个搭建过程,没什么技术含量,觉得有帮助的朋友就看一下! 一.Android Studio简单介绍 2013年GoogleI/O大会首次发布了Android Studio IDE(A

史上最详细的Android原生APP中添加ReactNative进行混合开发教程

背景 React Native出来已经一段时间了,相对来说也算稳定了,在很多的企业中都实际使用他们,混合开发已经是未来的一种趋势,混合开发中使用的技术很多,不外乎Html5.JS框架通过一定的技术和原始交互,目前主流混合开发React Native.Cordova.APICloud.MUI.AppCan.Sencha Touch.jQuery Mobile等等(其他的小伙伴们自己收集),目前网上写教程的人很多,但是React Native更新速度很快,根据他们的教程,中间会遇到各种问题,今天我和

C#之Android手机App开发_Android

目前Android在全世界市场上大约有75%的占有率,国人Android手机的持有比例更甚,甚至达到90%以上.因此搞计算机的一听说手机应用开发,一个个都像着了魔似的,既然有那么多人对它感兴趣,那咱也跟着玩一玩.但是,本模块不是介绍如何用Java开发,而是全部用C#去实现. 为什么用C#去实现?原因很简单,目前手机市场经过多年的你争我斗,现在就剩下Android.iOS.Windows Phone还能互相斗狠,其他的统统都被打趴下找不着北了.但是,学Android应用开发要用Java.学iOS应

Android天气预报app改进版_Android

最近总是有人来和我说我以前写的一个小app无法正常获取数据~Android简易版天气预报app 今天就又运行了下来查找问题,发现或许是接口有限制吧,不能在多台手机使用同个apikey 然后,发现了我写的代码实在乱七八糟,界面也实在不好看,就又重写了一遍,小小地修改了一遍,开发环境改为了Android Studio 最终效果图如下   工程图如下 一.获取地区信息 做这么一个天气预报app,首先就要获取到国内地区列表 (在我的另一篇博客有介绍:向任意网址发起数据请求) 中国天气网开放有天气预报接口

《Android应用开发与系统改造实战》——1.4节Android SDK开发环境配置

1.4 Android SDK开发环境配置Android应用开发与系统改造实战 1.4.1 安装已下载的软件(1)建立一个开发环境的文件夹,例如D:/delvelop文件夹. (2)解压Eclipse到一个delvelop文件夹下. (3)解压ADT到develop文件夹下. (4)解压SDK到develop文件夹下. 1.4.2 本地安装ADT(1)打开Eclipse应用程序. (2)然后进入Help→Install New Software项,如图1.17所示. 点击"Install New

C#之Android手机App开发

目前Android在全世界市场上大约有75%的占有率,国人Android手机的持有比例更甚,甚至达到90%以上.因此搞计算机的一听说手机应用开发,一个个都像着了魔似的,既然有那么多人对它感兴趣,那咱也跟着玩一玩.但是,本模块不是介绍如何用Java开发,而是全部用C#去实现. 为什么用C#去实现?原因很简单,目前手机市场经过多年的你争我斗,现在就剩下Android.iOS.Windows Phone还能互相斗狠,其他的统统都被打趴下找不着北了.但是,学Android应用开发要用Java.学iOS应

在Eclipse下利用gradle构建系统

简介:构建系统时候常常要用到 Ant, Maven 等工具,对于初学者来说,它们还是过于复杂,上手还 是需要时间的.本文将向读者介绍一种全新的构建项目的方式 gradle,它简单.上手快,能大大节省项 目的时间和成本. 在 eclipse 下利用 gradle 构建系统 基本开发环境 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是 Linux 的,请选择下载对 应版本的其他工具,包括开发工具.Java EE 服务器.Apache Ant.SoapUI