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

一、环境分离简介

每个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资源文件中定义服务器地址,然后在程序的入口处赋值给代码里的全局静态变量。

总结

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, app
, gradle
, 教程
, 开发环境
环境分离
android gradle、android build.gradle、android gradle下载、androidstudio gradle、android gradle 配置,以便于您获取更多的相关知识。

时间: 2024-10-31 13:45:31

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

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

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

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

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

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获取app应用程序大小的方法_Android

Android对这种方法进行了封装,我们没有权限去调用这个方法,所以我们只能通过AIDL,然后利用Java的反射机制去调用系统级的方法. 下面上代码:(注释比较详细) /** * 作用:-----获取包的大小----- * @param context 上下文 * @param pkgName app的包名 * @param appInfo 实体类,用于存放App的某些信息 */ public static void getPkgSize(final Context context, Strin

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桌面组件App Widget用法入门教程_Android

本文实例讲述了Android桌面组件App Widget用法.分享给大家供大家参考.具体如下: Android开发应用除了程序应用,还有App Widget应用.好多人会开发程序应用而不会开发App Widget应用.本帖子就是帮助大家学习如何开发App Widget应用的. 先简单说说App Widget的原理.App Widget是在桌面上的一块显示信息的东西,通过单击App Widget跳转到程序入口类.而系统自带的程序,典型的App Widget是music,这个Android内置的音乐

Android判断App前台运行还是后台运行(运行状态)_Android

本文通过图文并茂的方式给大家介绍android判断app状态的相关内容,具体详情如下所示: 要了解这块,首先需要明白一些概念,app,process,task 1.process就是进程,是linux的概念. 2.一般一个app拥有一个uid,运行在一个进程里,如果app中给service等定义不同的uid,那Service就运行在另外一个进程里,也就是说uid就相当于进程的id一样,一个uid就代表一个进程:也可以几个app定义一个uid,那他们就运行在一个进程里了. 3.task是andro

详解Android更改APP语言模式的实现过程_Android

一.效果图 二.描述 更改Android项目中的语言,这个作用于只用于此APP,不会作用于整个系统 三.解决方案 (一)布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" a