如何用好 Android 包管理系统

swift 发布于 2019年04月18日

这是第一次在这里和大家分享 Android 相关的内容, 其实我一直是 iOS 和 Android 都在做, 只是之前这里一直和大家分享 iOS 相关经验, 并且大多数用户也都是因为这些内容才关注的. 关于 Android 内容, 之前也有过考虑, 也是因为用户群的因素, 轻易没有动笔.

但最近的业界动态, 让我又重新考虑这个问题了, 首先各大厂商近几个月频繁发出新的 Android 手机产品, Android 手机的性能已经突破了临界点, 它的性能已经不比 iOS 差了. 这里我说的性能是作为用户的真实体验, 而不是我们看到的多少多少内存, 用了什么 CPU.

从 iPhone 4s 时代开始, 每年我同时还会买2部左右 Android 手机, 以往我用 Android 手机的体验, 就是无论手机的内存或是 CPU 跑分多么高, 哪怕是当年的旗舰机型, 实际使用起来总感觉要比同年代的 iOS 设备感受差很多. 而这个观感大概是在去年下半年开始发生改变. 比如最近我入手的 s10+, 一句话来说, 抛开各种硬件参数, 作为一个普通用户, 我使用它的体感性能已经和同时代的 iPhone 相差不大了.

同时,通过最近的交流, 有不少原来做 iOS 的朋友, 也都想多了解一下 Android 开发的想法. 并且自己确实有很多 Android 开发中值得分享的经验. 所以这次也算是一个尝试, 看看大家对这个内容是否感兴趣.

当然, 说了这么多 Android 平台现在的进展, 也并不是代表我认为 iOS 不行了, 苹果依然有着强大的生态. 这两个生态各有特色, 废话不多说, 进入正题吧.

Android Studio 怎么引入第三方库

包管理工具, 几乎是现在开发任何项目的标配. 它对开发效率的提升, 已经无可争议. Android 也提供了自己的包管理工具.

做过 Android 开发的朋友都知道, 在 Android Studio 中引用第三方库非常简单, 只需要在 app 级别的 build.gradle 文件中添加这样的引用即可, 比如这样:


dependencies {

implementation 'com.squareup.okhttp3:okhttp:3.13.1'

}

build.gradle 被修改后, 文本框上面会弹出这样一个提示:

点击 Sync Now 按钮即可开启同步, gradle 会根据自动帮你下载, 并且构建所有依赖的第三方库. 相信有过 Android 开发经验的同学对这个流程并不陌生.

那么在这背后都进行了什么操作, 才让我们这么容易的引用第三方库呢.

Android Sutdio 项目都会创建两个 build.gradle 文件, 一个 app 级别, 另外一个是 project 级别:

我们刚刚介绍的是 app 级别, 如果你打开另外一个 project 级别的, 你会看到这样的内容:


repositories {

google()
jcenter()

}

repositories 节点中, 分别定义了 google()jcenter(), 分别代表两个代码仓库.

google() 是 android 自带的库, 比如 support library, 它其实是 https://maven.google.com 这个仓库.

jcenter() 是一个更大的代码仓库, 我们常用的大多数第三方库, 都存放在这里. 你可以把它理解为 Android 生态的 CocoaPods. 它的仓库地址是: https://jcenter.bintray.com/.

如果你把 google()jcenter() 这两行去掉, 那么你在 gradle 中引用的第三方库就不能正常的同步进来了.

jcenter 和 mavenCentral 的历史

用过早期版本 Android Studio 或是接手过一些老项目的朋友可能会遇到这样一个情况. 早期版本 Android Studio 创建的项目使用的是 mavenCentral() 而不是 jcenter() .

repositories {

mavenCentral()

}

这一点经常会把开发者搞混, 到底该用哪个呢. 下面就和大家说一下它们的历史. 首先我们在 gradle 中使用的所有仓库都是基于 maven 的, 无论是 google, jcenter 或者 mavenCentral 都是一样.

早期的 Android Studio 版本, 确实是使用 mavenCentral 作为默认的代码仓库. 但到后面, Android Studio mavenCentral 相比 jcenter 无论是在开发者使用方便性, 或是代码仓库中项目的数量, 都不占优势.

所以在后期新的 Android Studio 版本中, 改为使用 jcenter 作为默认的代码仓库. 你可以把 mavenCentral 看做是 jcenter 的一个子集.

jcenter 是目前世界上最大的 Java 代码仓库之一, 能在 mavenCentral 中找到的库, 也都存在于 jcenter 中, 并且 jcenter 的各方面指标都优于 mavenCentral.

这就是这个问题的一个前因后果. 所以如果你正在维护一个老的项目, 并且在 build.gradle 中看到 mavenCentral 的定义, 你就能明白原因了.

关于这个问题更全面的解释, 给大家推荐一篇文章: https://inthecheesefactory.com/blog/how-to-upload-library-to-jcenter-maven-central-as-dependency/en

jar 和 aar

关于 Android 中的 Java 第三方库, 我们对 jar 包应该会比较熟悉. 是 Java 库的一个标准格式. 但是当我在 Android Studio 们引用一些第三方库的时候, 经常还会看到一种 aar 格式的. 那么它和 jar 有什么区别呢.

如果你使用的第三方库还带有一些其他资源, 比如图片, 布局文件等, 那么就会使用 aar 了. 我们创建任何一个 Android 项目, 都会带有这样的结构:

/AndroidManifest.xml
/res
/assets

而标准的 jar 包是没有这些的. jar 于 aar 的区别主要就在这个地方. aar 是更针对于 android 平台的.

自定义代码仓库

我们在开发产品的时候, 还会用到这样一些三方库, 要求我们在 repositories 节点中加入他们自己的内容, 比如:

repositories {
maven { url 'https://maven.fabric.io/public' }
}

这是因为, 这些三方库的作者并没有将他们的包上传到 jcenter 或 mavenCentral 中. 而是使用了自己的 maven 服务器. 所以我们如果要使用他们提供的库, 就必须在 repositories 中加上它们的仓库引用.

总结

总体来说, 我们在使用 Android Studio 开发产品的时候, 关于三方库包管理, 大多数时候使用到的代码仓库就是这三个 google, jcenter, mavenCentral. 其中 google 是 Android 团队自己的各种支持库的仓库. jcentermavenCentral 是我们用到各种第三方库的仓库. jcenter 是我们目前应该首选的代码仓库.

如果某个三方库没有将自己的内容上传到 jcenter 这样的平台, 那么我们就需要引用它自己的 maven 服务器.

这篇文章的内容不算特别深入, 但对于很多开发者平时在使用第三方库的时候, 可能不会花太多时间研究这个问题. 大多数时候就按照三方库给的提示, 找样子引用到工程中即可. 如果了解了这个基本概念, 今后我们在处理类似问题的时候, 会考虑的更清楚.

这也算是第一次在这里和大家分享 Android 开发相关的内容, 不知大家是否对这个话题感兴趣, 也欢迎一起讨论.


如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~

本站文章均为原创内容,如需转载请注明出处,谢谢。
关注微信公众号
发现更多精彩
swift-cafe