Gradle笔记_3-依赖管理

hackernew
发布于 2021-3-1 16:46
浏览
0收藏

Gradle笔记_3-依赖管理


《Gradle for Android 中文版》笔记

 

Gradle文档

build.gradle 文件中添加一行依赖代码,Gradle 将会从远程仓库下载依赖库,项目中就可以使用其中的类了。

 

3.1 依赖仓库

repositories {
	jcenter()
}

 

  • Gradle 支持三种不同的依赖仓库:Maven、Ivy 或静态文件或文件夹。
  • 在构建(build)的执行阶段依赖从依赖仓库中被获取出来。
  • Gradle 也有本地缓存,所以一个特定版本的依赖只会在你的机器上下载一次。

 

一个依赖通常是由三种元素定义:group、name 和 version。

 

  • group:创建了该依赖库的组织
  • name;依赖库的唯一标识
  • version:版本号,可以确保依赖库不会自动更新,防止构建失败。


例如:

dependencies {
	// group:name:version 标记法
	implementation 'com.squareup.okhttp3:okhttp:4.2.0'
	implementation 'com.squareup.retrofit2:retrofit:2.6.2'
	
	// 映射样式(map-style)标记法
	implementation group: 'com.squareup.picasso', name: 'picasso' version: '2.8'
	implementation group: 'org.greenrobot:greendao' name: 'greendao' version: '3.2.0'
	
	// 声明任意文件作为依赖
	implementation files('hibernate.jar', 'libs/spring.jar')
}

 

对于一个依赖,唯一需要的字段是 name,group 和 version 可选,为表述清楚,建议加 group,version可以确保依赖库不会自动更新,防止构建失败。


3.1.1 预定义依赖仓库


Gradle 预定义了三个 Maven 仓库:JCenter、Maven Central 和本地 Maven 仓库。
可在构建脚本中添加:

repositories {
	jcenter()
	mavenCentral()
	mavenLocal()
}
  • Maven Central 和 JCenter 是两个有名的远程仓库,一般不同时使用,建议使用 JCenter,其也是 Android Studio 创建 Android 项目时的默认依赖仓库。JCenter 不同于 Maven Central,它还支持 HTTPS。
  • 本地 Maven 仓库是你已经是用了的所有依赖的本地缓存,你也可以自己添加依赖。路径:.gradle\caches\modules-2
  • 除了这些预定义的一来仓库,还可以添加其他公有设置私有仓库。


3.1.2 远程仓库


有些插件或依赖库放在自有的 Maven 或 Ivy 服务器上,而不是发布到 Maven Central 或 JCenter。在构建中添加这些依赖,需要在 Maven 代码块中添加 URL

 

repositories {
	maven {
		url "http://maven.aliyun.com/nexus/content/repositories/releases"
	}
	ivy {
		url 'http://repo.acmecorp.com/repo'
	}
	
	// 带凭证
	marven {
		url "http://repo.acmecorp.com/maven2"
		credentials {
			username 'user'
			password 'secretpassword'
		}
	}
}

不建议在构建配置文件中存储你的凭证。更好的方法是使用一个单独的 Gradle 属性文件。

 

3.1.3 本地仓库


添加本地仓库,只需配置一个相对或绝对路径的 URL 即可:

repositories {
	maven {
		url "../repo"
	}
}

 

新的 Android 项目默认情况下有一个 Android Support Library 的依赖。当使用SDK Manager 来安装 Google 仓库时,在硬件驱动器上,会创建两个 Maven 仓库:ANDROID_SDK/extras/google/m2repository 和 ANDROID_SDK/extras/android/m2repository。Gradle 通过它们获取谷歌提供的依赖包,例如 Android Support LIbrary 和 Google Play Services。

 

也可以通过 flatDir 添加一个常用的文件夹作为仓库:

 

repositories {
	flatDir {
		dirs 'arrs'
	}
}

 

3.2 本地依赖


在某些情况下,可能仍需要手动下载 JAR 文件或原生库。比如自己的依赖库,没有发布到公有或私有仓库,就可以生成 jar 文件,在多个项目中使用。

 

3.2.1 文件依赖


Gradle 中添加文件依赖:

dependencies {
	implementation files('libs/pinyin4j-2.5.0.jar')
}

 

当有多个 JAR 文件,一次添加一个完整的文件夹更简单些:

dependencies {
	implementation fileTree('libs')
}

 

Android 项目一般会有一个 libs 文件夹,会被声明为依赖使用的文件夹。一个过滤器可以保证只有 JAR 文件会被依赖,而不是简单地依赖文件夹中所有的文件:

dependencies {
	implementation fileTree(dir: 'libs', include: ['*.jar'])
	// 一般 .aar 文件也是需要被依赖的。
	// implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}

可以将 JAR 文件放在 libs 文件夹中,其会自动包含在构建路径和最终的 APK 中。

 

3.2.2 原生依赖


用 C 或 C++ 编写的依赖库可以被便以为特定平台的原生代码。这些依赖库通常包含几个 .so 文件,可用于所有平台。
Andorid 插件默认支持原生依赖库,需要在模块层创建一个 jniLibs 文件夹,然后为每个平台创建爱你子文件夹,将 .so 文件放在适当的文件夹中。

Gradle笔记_3-依赖管理-鸿蒙开发者社区如果文件放在 libs 下,需要在构建文件中添加

android {
	sourceSets {
		main {
			// jniLibs.srcDirs = ['src/main/jniLibs'] // 默认
			jniLibs.srcDirs = ['libs'] // 如果文件放在 libs
		}
	}
}

 

3.2.3 依赖项目


依赖项目和通常的应用项目类似。

 

  • 你可以使用相同的任务来构建和测试依赖项目,并且它们可以有不同的构建 variants(变量,变体,变式)。
  • 应用项目将生成一个可被安装和运行在 Android 设备上的 APK;依赖项目则生成一个 .aar 文件,该文件可被 Android 应用项目用作依赖库。


1. 创建和使用依赖项目模块

 

不同于 Android 应用的插件(com.android.application),构建脚本需要应用 Android 依赖库插件:

apply plugin: 'com.android.library'

 

在应用中包含(include)依赖项目的方式有两种,一种是在项目中当作一个模块(module),另一种是生成一个可在多个应用复用的 .aar 文件。

 

如果在项目中创建类一个模块(module)作为依赖项目,需要在 settings.gradle 中添加该模块:

include ':app', ":library"

 

在应用模块或其他模块中将它作为依赖:

implementation project(path: ':library')

 

2. 使用 .aar 文件

 

如果你创建了一个依赖库,并且想在不同的 Android 应用中复用,那么你可以创建一个 .aar 文件,然后将其作为一个依赖添加到项目中。

在构建依赖库时,模块目录下的 build/output/aar/ 文件夹将会生成 .aar 文件。

需要在应用模块中添加一个文件夹 aars,复制 .aar 文件至该文件夹,并添加该文件夹作为依赖仓库:

repositories {
	flatDir {
		dirs 'arrs'
	}
}

 

在应用模块中添加依赖:

dependencies {
	implementation(name: 'libraryname', ext: 'aar')
}

 

其告知 Gradle 查找具有特定名称且扩展名为 .aar 的依赖库。

 

3.3 依赖概念


3.3.1 配置

 


原来是 compile,现在是 implementation,二者有所区别。使用 compile 依赖会传递,使用 implementation 不会传递。A compile B,B compile C, 则 A compile C,但是,A implementation B,B Implementation C,A 不会 implementation C,A如果需要 依赖 C,则让 A implementation C。要想使依赖可以传递,使用 api, 使 B api C。
implementation 更好一些,能减少不必要的依赖关系。而且 compile 已过时。


下面是一个 Android 应用或依赖库的标准配置:

 

  • implementation:是默认配置,在编译主应用时包含所有的依赖。该配置不仅会将依赖添加至类路径(class path),还会打包到 APK。
  • apk:该依赖只会被打包到 APK,而不会添加到编译类路径。只适用于 jar 依赖。
  • provided:与 apk 完全相反,依赖不会被打包到 APK。只适用于 jar 依赖。
  • testImplementation:用于测试,不会打包到 APK。
  • androidTestImplementation:用于测试,不会打包到 APK。


除了上面标准配置外,Android 插件还针对每个构建 variant 都生成了一份配置,使其添加依赖配置化成为可能,例如,debugImplementation、releaseImplementation 等。当你只想在 debug 构建中添加 logging 框架时,这会非常有用。

 

3.3.2 语义化版本


将依赖添加到 JCenter 等仓库时,约定遵循了一套版本化规则,语义化版本。
版本数字一般为 major.minor.patch,数字按照以下规则依次增加:

 

  • 当做不兼容的Api变化时,major 版本增加。
  • 当以向后兼容的方式添加功能时,minor 版本增加。
  • 当修复一些 bug 时,patch 版本增加。


3.3.3 动态化版本


在某些情况下,你可能希望在每次构建应用或依赖库时,都能够获取到最新的依赖。最好的实现方式是使用动态化版本:

dependencies {
    implementation 'com.google.android.material:material:1.2.+'
    implementation 'androidx.recyclerview:recyclerview:1.1+'
    implementation 'androidx.constraintlayout:constraintlayout:+'
}

 

第一行,告知 Gradle 获取最新的 patch 版本。

第二行,我们希望获取每一个 minor 版本,且 minor 版本至少是 1。

最后一行,我们告知 Gradle 获取依赖库的最新版本。


注意:如果允许 Gradle 获取最新版本,则很可能 Gradle 获取的依赖版本并不稳定,它可能会导致构建中断。
当你试图在构建文件中使用动态化版本,Android Studio 将会警告你可能存在的问题。

分类
已于2021-3-1 16:46:48修改
收藏
回复
举报
回复
    相关推荐