【Andrioid】在Gradle中编译一次生成不同的版本,动态设定应用标题,应用图标,替换常量

写项目的时候经常会遇到以下的情况:

1.需要生成测试版本和正式版本的apk

2.测试版本和正式版本的URL是不一样的

3.测试版本和正式版本的包名需要不一致,这样才能安装到同一部手机上面。

4.不同apk需要应用名不同,图标不同,某些常量不同....

如果你有以上的需求,看这篇文章就对了

When developing an app, you usually have many slightly different versions of this app. The most common example is probably the backend you want to use: production or staging.

当我们做开发的时候,经常会需要生成多个版本的app。最常见的就是测试版和正式版。

You usually define the base URLs with the other constants of the app. Switching from one environment to the other is done by (un)commenting the right lines:

我们经常需要在应用中定义一些常量,当应用正式发布的时候,常常是注释掉测试用的部分,放开正式的部分,就像下面一样:

public static String BASE_URL = "http://staging.tamere.be"
//public static String BASE_URL = "http://production.tamere.be"

The process is manual, boring and error prone but hey, changing one line is not that bad, is it?

Then you add more and more features that depends on the environment. You maybe want a different icon and then different input validation rules and then ...

That‘s where your build tool can help. Let‘s see how we can automate the process of generating different APKs for different environment with Gradle.

上面的步骤是烦躁,无味的,修改一个地方还好,代码写多了以后正过来整过去就egg_pain了,这个时候我们Gragle就闪亮登场了

Build variants

Gradle has the concepts of Build Types and Build Flavors. When combining the two, you get a Build Variant.

There two default build types: release and debug. We won‘t change them in our example but we will create two new flavors: production and staging.

Gradle默认有release和debug两个版本。我们这里增加了production 和staging.两两组合就是下面4个版本了。

As a result, we‘ll have four different variants:

  • ProductionDebug
  • ProductionRelease
  • StagingDebug
  • StagingRelease

Sample project 示例项目

The project is pretty simple but shows how you can define for each build variant:

  • an app name
  • an icon
  • constants (in our case a BASE_URL variable)

You can download the project on Github.

Here are two screenshots of the generated apps. Nothing really fancy:

示例项目很简单,在不同的版本中我们需要修改项目名称,项目图标,一些常量:url...,项目可以从Github 下载,效果图如下:

build.gradle file

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath ‘com.android.tools.build:gradle:0.5.+‘
    }
}
apply plugin: ‘android‘

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 18
    buildToolsVersion "18.0.1"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 18
    }

    productFlavors {
        production {
            packageName "be.tamere.gradlebuildtypesexample"
        }

        staging {
            packageName "be.tamere.gradlebuildtypesexample.staging"
        }
    }
}

dependencies {
    compile ‘com.android.support:appcompat-v7:18.0.0‘
}

The definition of the flavors is super simple, all the magic will happen in their folders.

修改很简单:核心配置是productFlavors,同时需要注意production和staging,它们需要与后面的目录结构名字一致

File structure 修改后的文件结构

In the src folder, we‘ve created two directories whose names must match the flavors. We will define all the flavor-specific values. Only
specific values are necessary.

修改也比较简单,在src下面(main同级的目录)新建和上面productFlavors中配置production和staging相同的目录,分别放入对应的Constants.java。这两个目录的属性和功能与系统默认创建的main是一样的。

总结一下就是:

1.production和staging两个目录,对应着各存放一份Constants.java

2.对于应用图标和应用名字信息配置在res目录下面的。这个地方针对staging重新配置了一份ic_launcher.png和string.xml。production没配置的话就是用默认main下面的res。这个比较容易理解哈。

The staging version defines new icons while both flavors defines a Constants.java. The app name is defined in the string.xml files.

├── main
│   ├── AndroidManifest.xml
│   ├── ic_launcher-web.png
│   ├── java
│   │   └── be
│   │       └── tamere
│   │           └── gradlebuildtypesexample
│   │               └── MainActivity.java
│   └── res
│       ├── drawable-hdpi
│       │   └── ic_launcher.png
│       ├── drawable-mdpi
│       │   └── ic_launcher.png
│       ├── drawable-xhdpi
│       │   └── ic_launcher.png
│       ├── drawable-xxhdpi
│       │   └── ic_launcher.png
│       ├── layout
│       │   └── activity_main.xml
│       ├── menu
│       │   └── main.xml
│       ├── values
│       │   ├── dimens.xml
│       │   ├── strings.xml
│       │   └── styles.xml
│       ├── values-v11
│       │   └── styles.xml
│       └── values-v14
│           └── styles.xml
├── production
│   └── java
│       └── be
│           └── tamere
│               └── gradlebuildtypesexample
│                   └── Constants.java
└── staging
    ├── java
    │   └── be
    │       └── tamere
    │           └── gradlebuildtypesexample
    │               └── Constants.java
    └── res
        ├── drawable-hdpi
        │   └── ic_launcher.png
        ├── drawable-mdpi
        │   └── ic_launcher.png
        ├── drawable-xhdpi
        │   └── ic_launcher.png
        ├── drawable-xxhdpi
        │   └── ic_launcher.png
        └── values
            └── string.xml

Android Studio

You can switch between the two flavors in the Build variants tab of the IDE. Android Studio has some trouble identifying the resources for
a non-active flavors.

We are using the production flavor, Studio does not understand that the staging folder
contains source code. Don‘t worry, it‘s normal, it will catch up when you switch to the staging variant.

Launch the app with the different flavors to see the result.

The app drawer shows the two icons:

References

原文地址:http://tulipemoutarde.be/2013/10/06/gradle-build-variants-for-your-android-project.html

时间: 2024-11-02 10:05:17

【Andrioid】在Gradle中编译一次生成不同的版本,动态设定应用标题,应用图标,替换常量的相关文章

CentOS环境中编译升级PHP至5.4版本记录

先备份 mv /data/server/php /data/server/php.5.2 mv /etc/init.d/php-fpm /etc/init.d/php-fpm.5.2 编译源码 首先先执行./buildconf  --force,为了防止出现 cp:cannot stat 'sapi/cli/php.1': No such file or directory ./buildconf --force ./configure --prefix=/data/server/php --w

使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中<meta-data>变量的值

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/49247815 文章出自:薛瑄的博客 你也能够查看我的其它同类文章.也会让你有一定的收货 关于使用Gradle来控制版本号和生成不同版本号的代码.我总结了三篇文章,网上关于这些知识,都比較零散.我在学习这些的之前.根本不知道还有这种方法.所以说不知道并不可怕,可怕的是不知道自己不知道.相信这三篇文章,会给你不少灵感 Gradle构建控制Log开关--BuildConfig\自己定义

在gradle中使用greenDao引发的多重编译错误

在Android Studio中使用greenDao,编译时会报错 Gradle抛出部分异常如下 com.android.dex.DexException: Multiple dex files define 使用: gradlew -q dependencies 可以看到greenDao中引用了support.v4,如果此版本和你当前使用的版本不一致即会引发该异常. 解决办法: 在build.gradle中指定greenDao去除部分依赖: compile('de.greenrobot:gre

VS2008中编译通过,但调试时出现“未使用调试信息生成二进制文件”的问题

.只要是“建立项目的时候不应建立空项目,而应当建立一个“win32控制台应用程序”.这样确实可以解决问题.只要你选择的是这个"win32控制台应用程序"则在附加选项里面选不选上“空项目”都可以. 其实问题在于,在空项目中不生成调试文件pdb,所以无法调试. 要让项目生成pdb文件,需要更改: 项目属性,configuration properties->linker->Generate Debug Info 从 no 改为 yes 但这样还是不够的,还需要更改: 项目属性,

Gradle的依赖方式——Lombok在Gradle中的正确配置姿势

写过java的都知道,lombok几乎在项目中处于不可或缺的一部分,但是lombok在Gradle的项目中配置并非人人都知道. 很多人在项目依赖中直接这样写 1 compile "org.projectlombok:lombok:1.18.4" 但这样的处理在Gradle 5.0以上被命令禁止了,在4.x的高级版本中编译时也会有对应的告警 12345 The following annotation processors were detected on the compile cla

在Gradle中使用jaxb的xjc插件

jaxb,全称为Java Architecture for Xml Binding,是一种将java对象与xml建立起映射的技术.其主要提供两个功能,一是将java对象映射为xml,二是将xml映射为java对象.JAXB有1.0版和2.0版.2.0版对应的JSR(Java specification request, java规格要求)是JSR 222.jaxb中的xjc工具能够将XML Schema转换为对应的java类.支持的XML类型包括XML DTD,XSD以及WSDL.而schema

gradle中使用嵌入式(embedded) tomcat, debug 启动

在gradle项目中使用embedded tomcat. 最开始部署项目需要手动将web项目打成war包,然后手动上传到tomcat的webapp下,然后启动tomcat来部署项目.这种手动工作通常还要指定端口,指定项目位置等,这些操作是重复的操作. 开发的时候,ide自然想到集成这些功能,于是都是server模块,设置好参数就可以run server,测试了.个人操作的时候确实挺方便的,然而当团队协作的时候,每个人都要手动去设置这些参数,而且大家或许还在使用着各种各样的idea.eclipse

QT中静态库的生成与使用

一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为"I'm in class MyWindow";    3. 编写项目文件: mywindow.pro       注意两点:       TEMPLATE = lib       CONFIG   += staticlib    4. 生成Makefile:       qmake    5.

linux中编译安装Apache、PHP、MySQL(上)

1.简介 在阿里云买了个云服务器,一直没时间折腾.过了近十天了吧,才有时间好好玩玩这个云服务器.自己是做Web开发的,所以我需要的开发环境是LAMP.之前打算是采用yum安装,不过yum安装apache可以安装到2.4版本,而PHP最高安装版本只能是5.4,这也是yum安装PHP的软肋,因此我这里主要涉及到的安装方式是源码安装.通过源码安装能够更好的管理这些软件,想安装到哪就放在哪. 云服务器: 阿里云CentOS 7.2 64位 阿帕奇版本:apache2.4 PHP版本:PHP5.6 主要的