引论

Android开发,关于aar你应该知道的一文中掌握了如何引用本地的aar,更多情况下我们是直接从网络上获取公开的第三方库来进行开发,而这个网络位置就是jCenter,在gradle中使用:

1
2
3
repositories {
jcenter()
}

jCenter是Bintray提供的公开下载服务,使用自身开发的artifactory开源应用搭建,后绪会介绍如何使用artifactory来搭建团队内部的私有仓库。

什么是jCenter

artifactory其实就是带有版本管理的文件服务器,基本功能和FTP服务相同,公开服务是jCenter,还提供托管的私有仓库,同github一样,提供企业收费服务,更多的功能,更快的下载速度。

开发者先将Library提交到自己的私有库,再同步到公共jCenter库,其它开发就可以简单的来添加依赖了:

1
2
3
dependencies {
compile 'com.squareup.retrofit:retrofit:1.9.0'
}

jCenter

在这个架构图中,还有一个maven central和ivy仓库,都提供类似的下载托管功能,但要么太老了,要么太少人使用。

再说下maven仓库引用的格式

1
compile 'com.squareup.retrofit:retrofit:1.9.0'

定义为:

1
GROUP_ID:ARTIFACT_ID:VERSION

GROUP_ID:com.squareup.retrofit,组,方便公司或团队进行逻辑上的管理。
ARTIFACT_ID:retrofit,Library名称。
VERSION:1.9.0,Library指定版本。
Module中的完整依赖:

1
2
3
4
5
6
7
8
9
10
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'
compile 'com.squareup.okhttp:okhttp:2.0.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.google.code.gson:gson:2.3'
compile 'io.reactivex:rxjava:1.0.11'
}

在依赖中不要使用动态版本号
Gradle中支持使用+来引用动态版本,人生苦短,不要使用它!

1
compile 'com.android.support:appcompat-v7:23.0.+'

任何依赖的改变,你都应该被显式的知晓,以便知道自己的项目中有除了自己的代码,依赖都发生了哪些变化。
这个+,会大大增加你代码的不确定性!!
理由:

  • 依赖也是你应用的一部分,任何变更,都要知道。
  • 每个人的开发不尽相同,在你的机器上可以运行,在其它机器上可能运行不起来,因为依赖版本不一样。
  • 同样的,在你的机器上也会出现由于版本不同而运行失败,昨天好好的,今天怎么就跑不进来了?那是因为早晨另一个项目中升级了本地依赖!
  • 版本回滚,显示的版本号支持精准的回滚。
  • 不要自动依赖升级,任何依赖更新都有可能引入安全问题,回到第一点,任何变更,都要知道,升级要验证。

不要犯懒,依赖管理很重要,程序开发过程就是消除不确定性的过程,一个+的犯懒,可能会让你和项目消耗极大的精力。
不要假设依赖总是好的,是人都会犯错误,任何的开发在减少不确定性的时候也同时在引入新的不确定性。

PS:jCenter不只支持maven和gradle,还提供Yum, Apt, Vagrant and Docker。

Android Studio为什么使用jCenter

Java的构建工具从ant,maven到现在的gradle,依赖包仓库也经历了maven central和jCenter,同样Android Studio中的Gradle默认仓库也经历了先使用maven central后来又升级到了jCenter的过程,简单来说:

  • jCenter完全兼容maven,maven central中有的,jCenter有,maven central中没有的,jCenter也有,是maven central的超集,现在是全球包含Java和Android开源项目最大的仓库。
  • 使用CDN加速下载,基于https安全传输,Google最喜欢的传输方式,杜绝在传输过程中偷梁换柱,造成类似xcodeghost的惨剧。
  • 包的上传和管理操作更简便,流程更优(让包开发者更懒)
  • 支持一键同步到maven central(尊重历史,还有什么理由不用)

让gradle使用maven central(团队内部库/被jCenter拒了/偷懒不进jCenter):

1
2
3
repositories {
mavenCentral()
}

还有一种情况是使用私有Maven仓库:

1
2
3
4
5
repositories {
maven {
url "http://dl.bintray.com/alphayang/maven"
}
}

发布到jCenter

准备

帐户

https://bintray.com上注册,可使用github登陆。

创建私有Maven仓库

create_maven_repo

添加Package

新建包

add_new_package_to_maven_repo

包名,License和代码码本管理必填。
create_package_details

Andorid Studio中的工作

New Project

File -> New Project

new_project

New Project默认都是先创建一个Application Module,正常创建就好,正好可以用来做Library的Demo App。

New Module

创建Library Module
File -> New Module

new_library

新建的Library与正常的Application最大区别是module build.gradle中是apply plugin: ‘com.android.library’ 而不是 apply plugin: ‘com.android.application’。
在这里发挥才智实现功能。
完整的Project Structure:
project_structure

添加上传的Gradle脚本支持

在weatherlib/build.gradle中:

1
2
3
4
5
6
7
8
9
10
apply plugin: 'com.novoda.bintray-release' // 这一行必须添加在java / com.android.library plugin之后
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.novoda:bintray-release:0.3.4'
}
}

在weatherlib/build.gradle中添加Package信息,当然这里的信息都是Package相关的,使用时要改成自己的:

1
2
3
4
5
6
7
8
publish {
userOrg = 'alphayang'
groupId = 'com.geekdev'
artifactId = 'weatherlib'
publishVersion = '0.2.5'
desc = 'Simple ForecastIO client'
website = 'https://github.com/alphayang/WeatherLibe'
}

发布

⌘F9,上传前Build下代码,确保正常。
然后在Terminal Panel中执行:

1
$ ./gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false

BINTRAY_USERNAMEBINTRAY_KEY在bintry profile页面获取,注意username不是name。
https://bintray.com/profile/edit

发布成功

在bintray界面:

upload_done

上传的版本:
library_version

上传的文件列表:
file

添加到jCenter公共仓库

一键添加到jCenter

add

添加到jCenter公共仓库需要简单的人工审核
approve

等几个小时,会有邮件通知审核结果。这个审核是必要的,公共仓库还是要有人把守,要不然鱼龙混杂,不好用了。
approve

OK了,你的包已经自动同步到jCenter,任何人可以公开获取使用了。
jcenter

1
compile 'com.geekdev:weatherlib:0.2.5'

http://jcenter.bintray.com/里有jCenter全部的公开库。

总结

jCenter是现在最好用公开Android库,对于使用还是使用者都提供了最好的使用体验。
BinTray开发一个artifactory提供三种形态:个人私有库,公开社区库和商业库,保证了整个业务的良性发展,也是这一类开发者服务最好的商业模式。

后记

由于Maven Central已经老去,从jCenter同步到Maven Central的步骤本文不做介绍了(同理ivy)。

Reference

Android Studio – Migration from Maven Central to JCenter
bintray-release