Android高效进阶:从数据到AI【2.4】

5.2.4 发布到 Maven 仓库

AAR 包是 Google 为 Android 开发设计的一种 library 格式,全名为 Android Archive Library。与 Java Jar Library 不同的是, AAR 包除了 Java 代码还包含资源文件,即 xml 文件、图片、文字等。

其核心发布流程步骤如下。

1.配置

在 gradle.properties 中添加以下配置项:

1. BUILD_TYPE=release
2. MAVEN_URL=仓库地址
3. MAVEN_URL_SNAPSHOT=仓库地址
4. MAVEN_USER_NAME=用户名
5. MAVEN_PWD=用户密码
6.
7. SDK_VERSION_NAME=版本名
8. SDK_VERSION_NAME_SNAPSHOT=版本名
9. SDK_GROUP_ID=group id
10. SDK_ARTIFACT_ID=artifact id
11. SDK_TYPE=aar

2.上传 AAR 包

在 library Module 目录下的 build.gradle 文件中加入如下代码,即可上传 AAR 包:

1. apply plugin: 'maven'
2. uploadArchives {
3. repositories.mavenDeployer {
4. name = 'mavenCentralReleaseDeployer'
5. if (BUILD_TYPE.equals("release")) {
6. repository(url: MAVEN_URL) {
7. authentication(userName: MAVEN_USER_NAME, password:
MAVEN_PWD)
8. }
9. pom.version = SDK_VERSION_NAME
10. } else {
11. snapshotRepository(url: MAVEN_URL_SNAPSHOT) {
12. authentication(userName: MAVEN_USER_NAME, password:
MAVEN_PWD)
13. }
14. pom.version = SDK_VERSION_NAME_SNAPSHOT
15. }
16. pom.artifactId = SDK_ARTIFACT_ID
17. pom.groupId = SDK_GROUP_ID
18. pom.packaging = SDK_TYPE
19. }
20. }

通过添加以上上传 AAR 包的 Maven 插件,进行同步后,可以在 Gradle 任务中发现多了uploadArchives 任务,双击该任务,即可实现上传 AAR 包到 Maven 库中,如图 5-4 所示。

5.2.5 搭建私有 Maven 仓库

很多公司都会搭建自己的 Maven 仓库。一方面,公司中不同团队部门可以内部公用一些SDK,以更好地利用资源;另一方面,也可以抛弃使用 jar 包这种过时的引用依赖方式。下面就介绍一下通过 Nexus 搭建私有 Maven 仓库的主要方法。

1.安装 Nexus

( 1)进入 Sonatype 官网下载 Nexus 压缩文件。

( 2)解压后进入 nexus
exusinjsw,选择相应的操作系统的文件夹。

( 3)选择 nexusundle
exusinjswwindows-x86-64,双击 console-nexus.bat 即可运行。

( 4)运行成功后可以通过 http://127.0.0.1:8081/nexus/打开管理页面,单击左边的 Repositories可以管理仓库,如图 5-5 所示。

一般默认的用户名和密码如下。

username: admin password: admin123

( 5)默认存在的仓库可以不管,首先要做的是添加一个自己的代理仓库,因为 Jcenter 和

MavenCentral 真的太慢了,需要配置一个国内的仓库地址。单击 Add→ProxyRepository 即可添加代理仓库。

( 6)创建完代理仓库后可以接着创建私有仓库,私有仓库可以存放公司的二方库。

( 7)单击 Add→Hosted Repository 添加私有仓库,配置方式与代理仓库类似。

( 8)现在我们有了两个仓库,一个代理仓库 Ali 和一个私有仓库 Pcyan。为了方便客户端

使用,可以使用 Group Repository 来管理多个仓库。这里直接使用了 Public Repositories,单击Public Repositories→Configuration,配置如图 5-6 所示。

保存之后,我们就可以通过 Public Repositories 的链接来使用这两个库了。2.上传

上传到私有 Maven 仓库的配置与上传到 Maven 仓库的配置类似,代码如下:

1. uploadArchives {
2. configuration = configurations.archives
3. repositories {
4. mavenDeployer {
5. // 私有仓库的地址以及账户
6. repository(url: 'http://127.0.0.1:8081(公 司 IP 或 域 名)/nexus/
content/repositories/pcyan/') {
7. authentication(userName: 'admin', password: 'admin123')
8. }
9. // Library 的配置
10. pom.project {
11. version libVerName
12. artifactId 'test'
13. groupId 'com.alvin'
14. packaging 'aar'
15. description 'my sdk'
16. }
17. }
18. }
19. }

3.依赖

在根目录的 build.gradle 中,通过配置本地 Maven 仓库地址,便可依赖私有 Maven 仓库中的内容:

1. buildscript {
2. repositories {
3. // Public Repositories 的地址
4. maven{ url 'http://127.0.0.1:8081/nexus/content/groups/public/' }
5. }
6. ...
7. }
8. allprojects {
9. repositories {
10. // Public Repositories 的地址
11. maven{ url 'http://127.0.0.1:8081/nexus/content/groups/public/' }
12. }
13. }

通过以上配置,我们便能上传 AAR 包或者 SDK 到 Maven 仓库中,并且自己搭建 Maven仓库,对公司内部的 SDK 进行分享和维护。

5.3 工程构建定制

上面介绍了这么多构建相关的信息,那么能不能按照自己的需求来进行工程构建定制呢?接下来就重点介绍一下如何进行工程构建定制,以及定制自己的打包逻辑等。

5.3.1 认识 Gradle DSL

DSL( Domain Specific Language)是领域专用语言。使用 DSL,可以扩展 Gradle 的语义,用户可以通过 DSL 完成需要的配置,而不用关心具体的实现。比如,我们应用程序中的build.gradle 就是对 Gradle DSL 的实现。比如,编译版本、 minSdkVersion,甚至依赖 v4 包等,都是通过 build.gradle 这个 DSL 框架实现的。

DSL 有 Project、 Task、 Plugin 等系列组件,以及 Gradle DSL 的开发语言是 Groovy,下面分别进行介绍。

1. Project

每个 Android Studio 中的 Module 都是一个 Project,每个 Project 都会对应一个 build.gradle文件。 build.gradle 里的内容是对当前工程的配置。

2. Task(任务)

当编译 Project 时,是由一个个 Task 负责执行的。每个 Task 都有前置 Task 和后置 Task,在一次完成这些 Task 的执行后, APK 才能编译成功。这些 Task 有: Java 源码编译 Task、DexTask、资源编译 Task、 JNI 编译 Task、 lint 检查 Task、打包生成 APK 的 Task 和签名Task 等。

Gradle 已经为我们提供了编译 APK 的大量 Task,具体可以在 Android Studio 中查看,如图 5-7 所示。

3. Plugin

Plugin 是指实现这些 DSL 接口的插件。每个 Plugin 定义了自己的 Gradle 工作逻辑,比如,在编译应用为 APK 时,必须依赖 com.android.application 这个 Plugin,才能调用 gradle aR来实现对 APK 的编译。同理,如果编译 Android Library 为 AAR 包,则必须依赖 apply plugin: 'com.android.library'。

只有声明了对相关 Plugin 的依赖,才能调用相关的编译 DSL。当然,你也可以自定义Plugin,实现你自己的打包逻辑。

4. Groovy

Groovy 是一种基于 JVM( Java 虚拟机)的敏捷开发语言,其结合了 Python、 Ruby 和Smalltalk 的许多强大特性。 Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上,所以 Groovy 可以使用其他 Java 语言编写的库。

Groovy 类和 Java 类一样,完全可以用标准 Java Bean 的语法定义一个 Groovy 类。但作为非 Java 的另一种语言,也可以使用更 Groovy 的方式定义类,这样的好处是可以少写一半以上的 Java Bean 代码。

Groovy 语言的主要特性如下。

 不需要 public 修饰符。 Groovy 的默认访问修饰符就是 public,如果 Groovy 类成员需

要 public 来修饰,则不用写出它。

 不需要类型说明。 Groovy 不关心变量和方法参数的具体类型。

 不需要 getter/setter 方法。在很多 IDE(如 Eclipse)中,早就可以为程序员自动产生

getter/setter 方法了。而在 Groovy 中,不需要 getter/setter 方法,所有类成员(如果是默认的 public)根本不用通过 getter/setter 方法引用。

 不需要构造函数。在 Groovy 中,不再需要程序员声明任何构造函数,因为实际上只需要两个构造函数。

 不需要 return 语句。在 Groovy 中,方法不需要 return 语句来返回值。

 不需要()。 Groovy 中的方法调用可以省略()(构造函数除外)。

上面描述了 DSL 的核心系列组件以及 Groovy 语言,接下来介绍 Gradle build 的生命周期,一个 Gradle build 过程有 3 个不同的生命周期,分别是初始化、配置和执行。

1.初始化

Gradle 支持单个 Project build 模式和多个 Project build 模式。在初始化阶段, Gradle 判断哪些 Project 会加入本次编译,并且对加入本次编译的 Project 对象进行实例化。

2.配置

在这个阶段,所有 Project 对象都会被初始化并且根据我们的配置进行赋值。3.执行这个阶段是编译和执行阶段,在用户执行 gradle 命令后,相关的编译任务及其关联的一系列任务都会在这个阶段执行,并输出结果。

5.3.2 自定义打包逻辑

以上章节介绍了 Gradle DSL 的基本内容,通过 DSL 我们可以轻易地更改我们的打包逻辑。下面就从新增任务、依赖任务和增量任务来说明如何自定义打包。

1.新增任务task 任务的名字 {

//do some things }

每次的构建( build)至少由一个 Project 构成,一个 Project 又由一到多个 Task 构成。每个Task 代表了构建过程中的一个原子性操作,比如编译、打包、生成 javadoc 和发布等操作。

比如,新增一个 helloworld 任务,为了显示效果,我们就以 a 开头,把任务叫作ahelloworld。我们在项目主 Module 的 build.gradle 中增加下面的任务,如图 5-8 所示。

写完任务且同步工程后,可以在右上角的 Gradle 选项卡中找到我们写的新任务 ahelloworld,如图 5-9 所示。

双击该任务后,当前新增的任务可以正常运行了,输出“ a hello world!!”,如图 5-10所示。

2.任务依赖

任务依赖是指给任务设置依赖任务,当本任务执行时,会优先执行依赖任务,在依赖任务执行完毕后,再执行本任务:

任务的名字.dependOn(“被依赖任务的名字”)

还是用 ahelloworld 任务来看,让 Gradle 对我们说“ a hello world”,不过增加一个条件,那就是必须在编译完成之后再说,而不只是说一句“ a hello world”,所以我们提供了一个编译依赖,如图 5-11 所示。

运行一下,如图 5-12 所示。

可以看到, ahelloword 在 assembleRelease 之后才运行。当运行 ahelloworld 的时候,整个打包工作已经完成了。

3.增量任务

Gradle 为了提高编译效率,在设计之初就考虑了增量任务的做法,所谓增量任务,即任务的执行有改变才会执行该任务,若任务的执行不改变,则不需要对该任务做处理。

具体做法是:为一个任务定义输入( input)和输出( output),在执行该任务时,如果它的输入和输出与前一次执行时没有变化,那么 Gradle 便会认为该任务是最新的(日志会输出“ UP-TO-DATE”),因此不会重复执行任务。

如图 5-13 所示,将 ahelloworld 任务的输入和输出修改为 app-debug.apk。

此时,不修改任何代码,重新运行 ahelloworld 任务,任务不需要重跑,出现 UP-TODATE,此次编译时间只用了 0s,如图 5-14 所示。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容