配置Gradle构建
这篇文章建立在 “构建系统概述” 和 “构建和运行Android Studio”之上,向你展示如何在product flavors和build types基础上使用build variants。
构建基础配置
Android Studio包含一个顶级的构建文件和每个模块的构建文件。构建文件被称为 build.gradle,它是一个纯文本文件,它使用Groovy语法来配置由Android Gradle插件提供的元素。在大多数情况下,你只需要编辑模块级别的构建文件。例如,BuildSystemExample项目的app模块的构建文件是像这样的:
apply plugin:'com.android.application' |
apply plugin:'com.android.application' 是应用Android Gradle插件来构建。这样添加Android特定的构建任务到顶级构建任务中,并且使用 android{…}中的元素来指定Android特定的构建项。
android{….} 配置所有的Android特定构建项:
compileSdkVersion 项指定编译的目标。
buildToolsVersion 项指定使用什么版本的构建工具。使用SDK管理器来安装多个版本的构建工具。
注意:请始终使用其主要版本号高于或等于您的编译目标SDK的版本。
defaultConfig 元素动态的配置在AndroidManifest.xml中的设置。在defaultConfig的值将覆盖manifest文件中的值。配置在defaultConfig的值将应用于所有的构建变种(build variants),除非构建变种的配置覆盖了这些值。
buildType元素控制如何构建和打包你的应用。默认的构建系统定义了两个构建类型:debug和release。debug构建类型包含debugging符号,并且使用了debug key签名。release构建类型默认没有被签名。在这个例子中构建文件配置了release版本,使用了ProGuard。
dependencies元素是在android元素外面的,并且在android元素后面。这个元素声明了这个模块的依赖。在一下的章节中都有依赖的内容。
注:当你在你的项目中改变了构建文件,Android Studio为了导入改变了构建配置而要求项目同步。点击黄色通知栏中的”Sync Now”按钮来同步改变的内容。
<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="图片_x0020_1" o:spid="_x0000_i1027" type="#_x0000_t75" alt="http://developer.android.com/images/tools/as-gradlesync.png" style='width:415.2pt; height:70.2pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\SUNNYA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png" o:title="as-gradlesync"/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
图一. 同步 Android Studio中的项目。
声明依赖
这个例子的应用模块声明了3个依赖:
... dependencies { // Module dependency compile project(":lib") // Remote binary dependency compile 'com.android.support:appcompat-v7:19.0.1' // Local binary dependency compile fileTree(dir:'libs', include:['*.jar']) } |
每个依赖在下面给出描述。构建系统添加所有类型为”compile”的依赖到编译路径中,并且最终将他们打到最终的包中。
Module dependencies
app模块依赖于lib模块。因为像在”Open an Activity from a Library Module”中描述的,MainActivity登录LibActivity1.
compile project(":lib") 声明了依赖lib模块。当你构建app模块的时候,构建系统将会集合lib模块。
运程二进制依赖
app和lib模块都使用了来自Android支持库的ActionBarActivity类,所有这些模块都依赖它。
compile 'com.android.support:appcompat-v7:19.0.1' 通过指定Maven坐标来声明了对Android支持库19.0.1版本的依赖。在Android SDK的仓库包中Android的支持库是可用的。如果你安装的SDK没有这个包,通过使用SDK管理工具下载安装它。
Android Studio默认使用了Maven的中央仓库来配置项目。(这个配置在项目的顶级构建文件中)。
本地二进制依赖
一些模块不使用任何的本地系统二进制依赖。如果你有依赖本地二进制依赖的模块,拷贝JAR文件到<moduleName>/libs目录下。
compile fileTree(dir: 'libs', include: ['*.jar']) 告诉构建系统将 app/libs目录下面的JAR文件依赖包含到编译路径,并且最终在最终的包中。
有关在Gradle更多的依赖信息,请查看Gradle的用户指南(Dependency Management Basics )。
运行ProGuard
构建系统运行ProGuard,以达到在构建过程中混淆你的代码的目的。在BuildSystemExample中,为了release构建运行ProGuard修改app模块的构建文件:
... android { ... buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro' } } } ... |
getDefaultProguardFile('proguard-android.txt') 从安装的Android SDK中获取默认的ProGuard设置。你可自定义ProGuard规则,Android Studio 将会加模块根部的proguard-rules.pro文件添加到模块特定的规则中。
包的标识:Application ID
在Android构建系统中,applicationId属性是唯一标示发行应用包。Application ID在build.gradle文件的android节点中设置。
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" } |
注: applicationID只能在build.gradle文件中被指定,不能再AndroidManifest.xml文件中。
当使用build variants,构建系统可以让你为每个product flavors和build types指定包的唯一标示。在build type中的Application ID被添加到product flavors作为后缀。
productFlavors { pro { applicationId ="com.example.my.pkg.pro" } free { applicationId ="com.example.my.pkg.free" } } buildTypes { debug { applicationIdSuffix ".debug" } } .... |
包名依然需要在manifest文件中指定。它在你的源码中用来涉及你的R class和解决相关activity/service注册问题。
package="com.example.app"> |
注:如果你有多个manifests(比如,一个product flavor指定的manifest和一个build type的manifest),包名在这些manifests中是可选的。如果它再这些manifests中被指定,那报名必须和src/main目录下的manifest的包名一致。
有关更多的关于构建文件和构建过程信息,请看 Build System Overview。
配置签名设置
debug和release版本的app在是否能在安全设备调试和如何进行签名是有区别的。构建系统使用一个默认的key来签名debug版本,并且为了在构建过程中不出现密码提示,使用了已知的证书。构建系统不会签名release版本,除非你明确定义了签名配置。如果你没有一个release的key,你可以安装”Signing your Applications”中描述的进行生成。
使用build variants工作
这个章节描述构建系统如何帮助你在一个项目中的同一个应用创建不同的版本。当时有一个demo和paid版本的时候,这是有用的,或者是你想在Google Play上为不同配置的设备发布多个APK。
构建系统使用 product flavors为你的应用创建不同的版本。每个版本有可能有不同的特性和设备要求。构建系统也应用 build types到不同的构建中,并且打包配置到每个版本中。 每个product flavor和build type的组合形成了一个build variant。构建系统为每个build variant生成了不同的APK。
Build variants
这个项目例子包含了两个默认的build types(debug 和release),还有两个product flavors(demo和full)。更多关于使用build variants的高级信息,查看”Build System Overview”。
Product flavors
为你的应用创建不同的版本:
<!--[if !supportLists]-->1、<!--[endif]-->在构建文件中定义product flavors
<!--[if !supportLists]-->2、<!--[endif]-->为每个flavor创建附加的源码路径
<!--[if !supportLists]-->3、<!--[endif]-->添加flavor特定的源码到你的项目中
接下来的章节带你了解 BuildSystemExample项目中的每个细节。在BuildSystemExample应用中创建两个Flavor。一个demo flavor和一个full flavor。两个flavors共享 MainActivity,MainActivity中有一个按钮跳转到一个新的activity—SecondActivity.对于两个flavor来说SecondActivity是不同的,因此你应该模拟这样的情况:full flavor中的Activity的特性要比demo flavor中的Activity多。在练习的最后,你将得到不同flavor的不同APK。
在构建文件中定义product flavors
为app模块中的构建文件定义两个product flavors:
... android { ... defaultConfig {...} signingConfigs {...} buildTypes {...} productFlavors { demo { applicationId "com.buildsystemexample.app.demo" versionName "1.0-demo" } full { applicationId "com.buildsystemexample.app.full" versionName "1.0-full" } } } ... |
这个项目的flavor定义支持使用defualtConfig相同的配置。所有flavors相同都配置都定义在defaultConfig中,每个flavor可以覆盖任何默认的值。上面的构建文件使用了 applicationId属性来分配给每个flavor:自从每个flavor创建了不同的app,他们应该需要不同的包名。
注:在Google Play中,为使你的应用可以拥有多APK支持。给你的所用variants分配相同的包名,并且给每个viant不同的versionCode. 为了再Google Play中区分不同的variants,你应该分配不同的包名给每个variant。
为每个flavor添加额外的源码目录
现在你应该创建源码目录,并且将SecondActivity添加到不同的flavor中。为demo flavor创建源码目录结构:
<!--[if !supportLists]-->1、<!--[endif]-->在Project模板中,展开BuildSystemExample,并且展开app目录
<!--[if !supportLists]-->2、<!--[endif]-->右键src目录,选择New>Directory
<!--[if !supportLists]-->3、<!--[endif]-->使用”demo”作为目录的名字
<!--[if !supportLists]-->4、<!--[endif]-->同样的创建如下目录:
app/src/demo/java
app/src/demo/res
app/src/demo/res/layout
app/src/demo/res/values
目录的结构看起来像图1:
<!--[if gte vml 1]><v:shape id="图片_x0020_2" o:spid="_x0000_i1026" type="#_x0000_t75" alt="http://developer.android.com/images/tools/as-demoflavordirs.png" style='width:150pt;height:162.6pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\SUNNYA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image003.png" o:title="as-demoflavordirs"/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
图一:demo flavor的目录
添加不同的activity到不同的flavor中:
添加SecondActivity到demo flavor中:
<!--[if !supportLists]-->1、<!--[endif]-->在Project模板中,右键app模块,选择New>Activity。
<!--[if !supportLists]-->2、<!--[endif]-->选择 Blank Activity,点击Next
<!--[if !supportLists]-->3、<!--[endif]-->输入activity名字: SecondActivity
<!--[if !supportLists]-->4、<!--[endif]-->输入包名”com.buildsystemexample.app”
<!--[if !supportLists]-->5、<!--[endif]-->在app/src/demo目录中右键java目录选择New>Package。
<!--[if !supportLists]-->6、<!--[endif]-->输入com.buildsystemexample.xapp
<!--[if !supportLists]-->7、<!--[endif]-->将SecondActivity拖拽到app/src/demo/java中
<!--[if !supportLists]-->8、<!--[endif]-->接受默认的Refactor
为demo flavor添加SecondActivity的布局文件和资源文件
<!--[if !supportLists]-->1、<!--[endif]-->从ap/src/main/res/layout中将activity_second.xml文件拖拽到app/src/demo/res/layout中
<!--[if !supportLists]-->2、<!--[endif]-->接受默认的提示
<!--[if !supportLists]-->3、<!--[endif]-->将strings.xml从app/src/main/res中拷贝到app/src/demo/res中
<!--[if !supportLists]-->4、<!--[endif]-->替换string.xml文件中的内容,如下:
<!--[if !supportLists]-->5、<!--[endif]--><?xml version="1.0" encoding="utf-8"?> <resources> <stringname="hello_world">This is the full version!</string> </resources> |
注:从现在开始,你可以为每个flavor单独开发SecondActivity. 比如,你可以为full flavor的activity添加更多的属性。
为了让指定的flavor文件工作,点击IDE窗口邮编的Build Variants,并且选择你想使用的flavor,就像图2. Android Studio可能会展示其他flavor的错误,但是这并不影响输出内容的构建。
<!--[if gte vml 1]><v:shape id="图片_x0020_3" o:spid="_x0000_i1025" type="#_x0000_t75" alt="http://developer.android.com/images/tools/as-buildvariants.png" style='width:210pt;height:113.4pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\SUNNYA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image005.png" o:title="as-buildvariants"/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
图2
从MainActivity登入到指定flavor的activity
SecondActivity在所有的flavors中都有相同的包名,你可以同main activity中登入。编辑mainActivity:
<!--[if !supportLists]-->1、<!--[endif]-->编辑 activity_main.xml,添加一个按钮:
<LinearLayout ...> ... <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button2" android:onClick="onButton2Clicked"/> </LinearLayout> |
<!--[if !supportLists]-->2、<!--[endif]-->为按钮添加text标题,和按钮事件onButton2Clicked
<!--[if !supportLists]-->3、<!--[endif]-->在MainActivity中添加如下代码:
publicvoid onButton2Clicked(View view){ Intent intent =newIntent(this,SecondActivity.class); startActivity(intent); } |
<!--[if !supportLists]-->4、<!--[endif]-->编辑manifest文件
<manifest ...> <application ...> ... <activity android:name="com.buildsystemexample.app.SecondActivity" android:label="@string/title_activity_second"> </activity> </application> </manifest>
|
Build types
Build types表现为为每个app包构建包版本。默认的debug和release被提供:
... android { ... defaultConfig {...} signingConfigs {...} buildTypes {...} productFlavors {...} buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro' } debug { debuggable true } } } ... |
注:尽管在build.gradle文件中默认只有release构建类型,当时release和debug构建类型都被应用的每个构建中。
在这个例子中,product flavors和build types创建了一下的build variants:
demoDebug
demoRelease
fullDebug
fullRelease
为这个例子构建,可以点击Android Studio的Build菜单,或者在命令行中执行 assemble命令。
注:Build>Make Project会编译项目中所有的源码。Build>Rebuild Project选项重新编译所有的源码。
会为不同的build variant创建不同的输出目录。
相关推荐
在构建现代化的Java应用时,Spring Boot框架与Gradle构建工具的组合是常见的选择。本资源包"使用Gradle构建Spring Boot工程系列项目源码"是针对一系列教程的配套源代码,旨在帮助开发者深入理解如何利用Gradle有效地...
我们将围绕“Gradle构建(war) web项目示例”这一主题展开,讨论Gradle的基本概念,构建过程,以及如何配置和运行项目。 首先,理解Gradle的核心概念至关重要。Gradle基于Groovy语言,采用领域特定语言(DSL)进行...
我们讨论了下载 Spring 源码、配置 Gradle 环境、下载和安装 Gradle、导入 Spring 源码到 IDEA 和编译和构建 Spring 源码等步骤。通过这些步骤,我们可以成功地搭建 Spring 源码环境,并深入学习 Spring 源码。
**基于Gradle构建的项目详解** Gradle是一种现代的、强大的构建自动化工具,它以其灵活性、性能优化和高度可扩展性赢得了开发者的喜爱。相比于传统的Maven,Gradle提供了更丰富的配置选项,允许开发者根据项目的...
在实际开发中,你可能需要配置Gradle构建脚本以引入这三个框架的依赖,设置Struts2的配置文件(struts.xml)以定义Action和结果,编写Spring的配置文件(如applicationContext.xml)以声明bean,以及使用Hibernate的...
2. **配置Gradle构建脚本**: - 创建`build.gradle`文件,并添加以下内容来配置JavaFX插件和依赖: ```groovy plugins { id 'application' id 'org.openjfx.javafxplugin' version '0.0.13' } repositories...
### 使用IDEA与Gradle构建Vert.x项目的详细指南 #### 一、简介 在现代软件开发过程中,选择合适的技术栈对于提升开发效率至关重要。其中,Java作为一种广泛应用的编程语言,其生态系统提供了丰富的工具和框架来...
7. **持续集成和部署**:配置Gradle构建脚本,以便与CI/CD工具如Jenkins、GitLab CI/CD等配合,实现自动化构建、测试和部署。 8. **版本控制**:将整个项目放入版本控制系统(如Git),便于团队协作和版本管理。 ...
总结来说,"Gradle 构建仓库3"是一个学习Gradle构建技巧和实践的资源,通过分析其中的项目和脚本,开发者可以提升对Gradle的理解,掌握更高效的构建流程。无论是对于初学者还是经验丰富的开发者,这都是一个宝贵的...
在这里,我们有一个使用IDEA搭建的、基于Gradle构建系统和Spring Boot 2的项目,其中包含了增删改查的基本示例。 首先,让我们深入了解一下Spring Boot 2的关键特性: 1. 自动配置:Spring Boot通过“@...
**基于Gradle构建的JavaWeb项目** 在现代的软件开发中,构建工具是不可或缺的一部分,它们帮助开发者自动化构建、测试和部署项目。本项目利用了Gradle作为构建工具,结合IntelliJ IDEA(IDEA)这个强大的Java集成...
本文将详细介绍如何在Android Studio中使用新的Gradle构建工具配置NDK环境,以便进行原生代码(C/C++)的开发。 首先,NDK是Android Native Development Kit的缩写,它允许开发者使用C和C++编写性能关键部分的代码...
在Eclipse中利用Gradle构建系统,不仅可以享受到Groovy语言带来的便利,还能充分利用Gradle的强大功能,如依赖管理、插件机制和灵活的脚本编写。对比Ant和Maven,Gradle在保持灵活性的同时,简化了构建过程,降低了...
本示例聚焦于“Gradle构建Java项目”,它展示了如何利用Gradle这一强大的构建工具将Java项目打包成可执行的JAR文件。下面我们将深入探讨Gradle和Java的相关知识点。 Gradle是一款现代的、基于Groovy和Kotlin DSL的...
在本话题中,我们将详细探讨如何为Android Studio配置Gradle插件版本2.3.1,并了解其中涉及到的pom和jar文件的作用。 首先,我们需要理解Gradle的工作原理。Gradle基于领域特定语言(DSL)——Groovy,允许开发者...
标题“用Gradle构建和测试项目”指出了文章的主题是关于Gradle这一强大的构建自动化工具。Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。与Maven相比,Gradle拥有更加灵活的构建脚本,它使用...
- **构建脚本**:Gradle构建脚本(build.gradle)定义了项目的配置、依赖和构建过程,是理解项目构建流程的关键。 通过研究这个版本的Spring源码和Gradle构建脚本,开发者不仅可以深入了解Spring的工作原理,还能...
使用Gradle构建Android项目时,它会执行一系列任务,如编译源码、生成资源、打包APK等。开发者可以通过自定义Gradle任务来扩展构建流程。 7. **版本升级**: 随着时间的推移,Gradle会发布新版本,提供新的特性、...
本文将深入探讨Gradle构建仓库及其目录结构,以帮助您更好地理解和应用Gradle。 首先,我们需要理解Gradle的核心概念:项目(Project)和任务(Task)。一个项目可以包含多个子项目,每个项目都有自己的构建逻辑,...
本篇文章将深入探讨如何使用Gradle这一现代、灵活的构建工具来构建简单的Java程序。Gradle以其强大的插件生态系统和基于Groovy的DSL(领域特定语言)而闻名,使得构建过程变得更为简洁易懂。 首先,让我们理解什么...