文档章节

Android Gradle Plugin指南(三)----依赖关系,Android库和多项目设置

k
 kim366
发布于 2016/05/13 19:17
字数 2026
阅读 1
收藏 0
点赞 2
评论 0

原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Libraries-and-Multi-project-setup


4、Dependencies,Android Libraries and Multi-project setup(依赖关系,Android库和多项目设置)

Gradle项目可以依赖于其它组件。这些组件可以是外部二进制包,或者是其它的Gradle项目。

4.1 Dependencies on binary packages(依赖二进制包)

4.1.1 Local packages(本地包)

配置一个外部库的jar包依赖,你需要在compile配置中添加一个依赖。

[plain] view plain copy
  1. dependencies {  
  2.     compile files('libs/foo.jar')  
  3. }  
  4. android {  
  5.     ...  
  6. }  

注意:这个dependencies DSL标签是标准Gradle API中的一部分,所以它不属于android标签。


这个compile配置将被用于编译main application。它里面的所有东西都被会被添加到编译的classpath中,同时也会被打包进最终的APK。

以下是添加依赖时可能用到的其它一些配置选项:

    * compile:main application(主module)。

    * androidTestCompile:test application(测试module)。

    * debugCompile:debug Build Type(debug类型的编译)。

    * releaseCompile:release Build Type(发布类型的编译)。

因为没有可能去构建一个没有关联任何Build Type(构建类型)的APK,APK默认配置了两个或两个以上的编译配置:compile和 Compile.

创建一个新的Build Type将会自动创建一个基于它名字的新配置。


这对于debug版本需要使用一个自定义库(为了反馈实例化的崩溃信息等),但发布版本不需要,或者它们依赖于同一个库的不同版本时会非常有用。


4.2.2 Remote artifacts(远程文件)

Gradle支持从Maven或者Ivy仓库中拉取文件。

首先必须将仓库添加到列表中,然后必须在依赖中声明Maven或者Ivy声明的文件。

[plain] view plain copy
  1. repositories {  
  2.     mavenCentral()  
  3. }  
  4. dependencies {  
  5.     compile 'com.google.guava:guava:11.0.2'  
  6. }  
  7. android {  
  8.     ...  
  9. }  

注意:mavenCentral()是指定仓库URL的简单方法。Gradle支持远程和本地仓库。

注意:Gradle会遵循依赖关系的传递性。这意味着如果一个依赖本身依赖于其它东西,这些东西也会一并被拉取回来。


更多关于设置依赖关系的信息,请参考Gradle用户指南DSL文档



4.2 Multi project setup(多项目设置)


Gradle项目也可以通过使用多项目配置依赖于其它Gradle项目。

多项目配置的实现通常是在一个根项目路径下将所有项目作为子文件夹包含进去。

例如,给定以下项目结构:

[plain] view plain copy
  1. MyProject/  
  2.  + app/  
  3.  + libraries/  
  4.     + lib1/  
  5.     + lib2/  


我们可以定义3个项目。Gradle将会按照以下名字映射它们:

    :app

    :libraries:lib1

    :libraries:lib2


每一个项目都拥有自己的build.gradle文件来声明自己如何构建。

另外,在根目录下还有一个setting.gradle文件用于声明所有项目。

这些文件的结构如下:

[plain] view plain copy
  1. MyProject/  
  2.  | settings.gradle  
  3.  + app/  
  4.     | build.gradle  
  5.  + libraries/  
  6.     + lib1/  
  7.        | build.gradle  
  8.     + lib2/  
  9.        | build.gradle  

其中setting.gradle的内容非常简单:

[plain] view plain copy
  1. include ':app', ':libraries:lib1', ':libraries:lib2'  

这里定义了哪一个文件夹才是真正的Gradle项目。


其中:app项目可能依赖于这些库,这是通过以下依赖配置声明的:

[plain] view plain copy
  1. dependencies {  
  2.     compile project(':libraries:lib1')  
  3. }  


更多关于多项目配置的信息请参考这里


4.3 Library projects(库项目)

在上面的多项目配置中,:libraries:lib1和:libraries:lib2可能是一个Java项目,并且:app这个Android项目将会使用它们的jar包输出。

但是,如果你想要共享代码来访问Android API或者使用Android样式的资源,那么这些库就不能是通常的Java项目,而应该是Android库项目。

4.3.1 Creating a Library Project(创建一个库项目)

一个库项目与通常的Android项目非常类似,只是有一点小区别。

尽管构建库项目不同于构建应用程序,它们使用了不同的plugin。但是在内部这些plugin共享了大部分相同的代码,并且它们都由相同的com.android.tools.build.gradle.jar提供。

[plain] view plain copy
  1. buildscript {  
  2.     repositories {  
  3.         mavenCentral()  
  4.     }  
  5.     dependencies {  
  6.         classpath 'com.android.tools.build:gradle:0.5.6'  
  7.     }  
  8. }  
  9. apply plugin: 'android-library'  
  10. android {  
  11.     compileSdkVersion 15  
  12. }  

这里创建了一个使用API 15编译SourceSet的库项目,并且依赖关系的配置方法与应用程序项目的配置方法一样,同样也支持自定义配置。


4.3.2 Differences between a Project and a Library Project(普通项目和库项目之间的区别)

一个库项目的main输出是一个.aar包(它代表Android的归档文件)。它组合了编译代码(例如jar包或者是本地的.so文件)和资源(manifest,res,assets)。

一个库项目同样也可以独立于应用程序生成一个测试用的apk来测试。

标识Task同样适用于库项目(assembleDebug,assembleRelease),因此在命令行上与构建一个项目没有什么不同其余的部分,库项目与应用程序项目一样。它们都拥有build type和product flavor,也可以生成多个aar版本。记住大部分Build Type的配置不适用于库项目。但是你可以根据库项目是否被其它项目使用或者是否用来测试来使用自定义的sourceSet改变库项目的内容。


4.3.3 Referencing a Library(引用一个库项目)

引用一个库项目的方法与引用其它项目的方法一样:

[plain] view plain copy
  1. dependencies {  
  2.     compile project(':libraries:lib1')  
  3.     compile project(':libraries:lib2')  
  4. }  

注意:如果你要引用多个库,那么排序将非常重要。这类似于旧构建系统里面的project.properties文件中的依赖排序。


4.3.4 Library Publication(库项目发布)

一般情况下一个库只会发布它的release Variant(变种)版本。这个版本将会被所有引用它的项目使用,而不管它们本身自己构建了什么版本。这是由于Gradle的限制,我们正在努力消除这个问题,所以这只是临时的限制。

你可以控制哪一个Variant版本作为发行版:

[plain]view plaincopy

  1. android {  
  2.     defaultPublishConfig "debug"  
  3. }  

注意这里的发布配置名称引用的是完整的Variant版本名称.Relesae,debug只适用于项目中没有其它特性版本的时候使用。如果你想要使用其它Variant版本取代默认的发布版本,你可以:

[plain] view plain copy
  1. android {  
  2.     defaultPublishConfig "flavor1Debug"  
  3. }  

将库项目的所有Variant版本都发布也是可能的。我们计划在一般的项目依赖项目(类似于上述所说的)情况下允许这种做法,但是由于Gradle的限制(我们也在努力修复这个问题)现在还不太可能。

默认情况下没有启用发布所有Variant版本。可以通过以下启用:

[plain] view plain copy
  1. android {  
  2.     publishNonDefault true  
  3. }  


理解发布多个Variant版本意味着发布多个arr文件而不是一个arr文件包含所有Variant版本是非常重要的。每一个arr包都包含一个单一的Variant版本。

发布一个变种版本意味着构建一个可用的arr文件作为Gradle项目的输出文件。无论是发布到一个maven仓库,还是其它项目需要创建一个这个库项目的依赖都可以使用到这个文件。


Gradle有一个默认文件的概念。当添加以下配置后就会被使用到:

[plain] view plain copy
  1. compile project(':libraries:lib2')  


创建一个其它发布文件的依赖,你需要指定具体使用哪一个:

[plain] view plain copy
  1. dependencies {  
  2.     flavor1Compile project(path: ':lib1', configuration: 'flavor1Release')  
  3.     flavor2Compile project(path: ':lib1', configuration: 'flavor2Release')  
  4. }  


重要:注意已发布的配置是一个完整的Variant版本,其中包括了build type,并且需要像以上一样被引用。

重要:当启用非默认发布,maven发布插件将会发布其它Variant版本作为扩展包(按分类器分类)。这意味着不能真正的兼容发布到maven仓库。你应该另外发布一个单一的Variant版本到仓库中,或者允许发布所有配置以支持跨项目依赖。

本文转载自:http://blog.csdn.net/oyangyujun/article/details/47071005

共有 人打赏支持
k
粉丝 1
博文 129
码字总数 0
作品 0
朝阳
Jenkins+Gradle+android+SonarQube

一、环境 ubuntu14.04(64位) jdk 1.7 ant 1.9 jenkins 1.606 tomcat 7.0.5 android sdk gradle nexus sonarqube 二、安装 JDK环境变量 gradle环境变量 Jenkins环境变量 android sdk 环境变量......

蓝桥书生
2015/04/19
0
0
读书笔记--Android Gradle权威指南(下)

前言 最近看了一本书《Android Gradle 权威指南》,收获挺多,就想着来记录一些读书笔记,方便后续查阅。 本篇内容是基于上一篇:读书笔记--Android Gradle权威指南(上) 上一篇中我们讲了:...

请叫我大苏
05/27
0
0
读书笔记--Android Gradle权威指南(上)

最近看了一本书《Android Gradle 权威指南》,对于 Gradle 理解又更深了,但不想过段时间就又忘光了,所以打算写一篇读书笔记,将书中一些我个人觉得蛮有用的点记录、总结一下。 前言 首先,...

请叫我大苏
05/24
0
0
Android Gradle和Gradle插件区别

一、引言 1、什么是Gradle?什么是Gradle插件? build.gradle中依赖的classpath 'com.android.tools.build:gradle:2.1.2'和gradle-wrapper.properties中的distributionUrl=https://services.gr......

AwesomeQA
2017/10/22
0
0
Android Studio 升级到3.0后的gradle迁移(bing译文)

首先推荐按照官方版进行,如有疑问,评论中讨论; 官方步骤Migrate to Android Plugin for Gradle 3.0.0 英文水平高的可直接点击链接查看原文,以防翻译出错; Gradle 3.0.0 的 Android 插件...

我家有宝
2017/10/27
0
0
Android JNI学习(二)——实战JNI之“hello world”

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
05/09
0
0
认识Android Support Library

本文目的:认识Android Support Library 本文转载于官网 Android 支持库提供了诸多未内置于框架的功能。这些库提供向后兼容版本的新功能、框架中未包含的实用 UI 元素,以及应用可以利用的一...

lichuangnk
07/10
0
0
寄Android开发Gradle你需要知道的知识

初识Gradle Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。当前其支持的语言限于Java、Groovy和...

猴亮屏
05/22
0
0
Android studio gradle配置

Gradle 基本概念 首先我们学习几个gradle 的脚本语法,掌握了这几个语法,你就能非常简单的用gradle构建打包android项目了。 首先,我们来看下一个最简单android 。 build.gradle //设置脚本...

习惯_搬砖
2014/11/07
0
1
Gradle/Studio构建问题(Ant/Gradle)

> 使用Gradle遇到的问题及其他: Android Studio安装过程常见问题图解-- http://jingyan.baidu.com/article/fd8044fad5bdca5031137ab7.html 1. 将GitHub上的新项目导入Studio中 Pano360-mast......

shareus
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

rabbitmq学习记录(三)

工作队列:一个生产者,多个消费者,生产者直接将消息发送到rabbitmq的队列之中 默认采用的是轮询分配:即不管消费者处理信息的效率,队列给所有消费者轮流发送一条信息,直至消息发送完毕 ...

人觉非常君
19分钟前
0
0
Java 之 反射

反射,剖析 Java类 中的 各个组成部分,映射成 一个个 Java对象,多用于 框架和组件,写出复用性高的通用程序。 测试类代码如下: class Person { private String name; public St...

绝世武神
23分钟前
0
0
华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大

华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大!华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大! 在华为最新发布的nova 3手机上,抖音通过华为himedia SDK集成了60fps、超级...

华为终端开放实验室
28分钟前
0
0
多 SSH Key 实现同一台服务器部署多 Git 仓库

本文以以下需求为背景,介绍详细的做法: 需在同一台服务器同时部署两个不同的 Github 仓库(对 Bitbucket 等 git 服务同样适用) root 用户可在远程登录 SSH 后附上预期的 SSH Key 进行 gi...

yeahlife
31分钟前
0
0
003. es6数值的扩展

一、普通扩展 Number 方法,将字符串、数值转为十进制 : Number('0b111') Number.isFinite() 用来检查一个数值是否为有限的:Number.isFinite(15) Number.isNan() 用来检查一个值是否为NaN N...

秋季长青
45分钟前
0
0
C语言数组和指针的语法糖

对于C语言,我可以这样秀:比如当创建一个数组arr[n]之后,一般我们去遍历数组的时候是for (int i = 0; i < n; i++) { a[i]; }但是我知道下表访问符[]是个语法糖,也就是说a[i]在编译器看来是...

ustbgaofan
53分钟前
0
0
Call to undefined function bcmath()的解决方法

乐意黎的ECS主机环境,Centos7.2 + PHP7 由于使用了bcdiv()函数,运行时总在抛错。 Fatal error: Call to undefined function bcmath() in /usr/loca/apache/htdocs/... on line 4 一查得知:......

dragon_tech
59分钟前
0
0
css优先级

..

architect刘源源
今天
0
0
【转】Twitter的分布式自增ID算法snowflake

结构 snowflake的结构如下(每部分用-分开): 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以...

talen
今天
0
0
hive支持行级修改

Hive从0.14版本开始支持事务和行级更新,但缺省是不支持的,需要一些附加的配置。要想支持行级insert、update、delete,需要配置Hive支持事务。 一、Hive具有ACID语义事务的使用场景 1. 流式...

hblt-j
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部