英文原文:How to distribute your own Android library through jCenter and Maven Central from Android Studio
中文原文:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0623/3097.html
如果你想在 Android Studio 中引入一个 library 到你的项目,你只需添加如下的一行代码到模块的 build.gradle 文件中。
1
2
3
|
dependencies { compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3' } |
就是如此简单的一行代码,你就可以使用这个 library 了。
酷呆了。不过你可能很好奇 Android Studio 是从哪里得到这个 library 的。这篇文章将详细讲解这是怎么回事,包括如何把你的库发布出去分享给世界各地的其他开发者,这样不仅可以让世界更美好,还可以耍一次酷。
Android studio 是从哪里得到库的?
先从这个简单的问题开始,我相信不是每个人都完全明白 Android studio 是从哪里得到这些 library 的。莫非就是 Android studio 从 google 搜索然后下载了一个合适的给我们?
呵呵,没那么复杂。Android Studio 是从 build.gradle 里面定义的 Maven 仓库服务器上下载 library 的。Apache Maven 是 Apache 开发的一个工具,提供了用于贡献 library 的文件服务器。总的来说,只有两个标准的 Android library 文件服务器:jcenter 和 Maven Central。
jcenter
jcenter 是一个由 bintray.com 维护的 Maven 仓库 。你可以在这里看到整个仓库的内容。
我们在项目的 build.gradle 文件中如下定义仓库,就能使用 jcenter 了:
1
2
3
4
5
|
allprojects { repositories { jcenter() } } |
Maven Central
Maven Central 则是由 sonatype.org 维护的 Maven 仓库。你可以在这里看到整个仓库。
注:不管是 jcenter 还是 Maven Central ,两者都是 Maven 仓库
我们在项目的 build.gradle 文件中如下定义仓库,就能使用 Maven Central 了:
1
2
3
4
5
|
allprojects { repositories { mavenCentral() } } |
注意,虽然 jcenter 和 Maven Central 都是标准的 android library 仓库,但是它们维护在完全不同的服务器上,由不同的人提供内容,两者之间毫无关系。在 jcenter 上有的可能 Maven Central 上没有,反之亦然。
除了两个标准的服务器之外,如果我们使用的 library 的作者是把该 library 放在自己的服务器上,我们还可以自己定义特有的 Maven 仓库服务器。Twitter 的 Fabric.io 就是这种情况,它们在 https://maven.fabric.io/public 上维护了一个自己的 Maven 仓库。如果你想使用 Fabric.io 的 library,你必须自己如下定义仓库的 url。
1
2
3
|
然后在里面使用相同的方法获取一个 library。
1
2
3
|
dependencies { compile 'com.crashlytics.sdk.android:crashlytics:2.2.4@aar' } |
但是将 library 上传到标准的服务器与自建服务器,哪种方法更好呢?当然是前者。如果将我们的 library 公开,其他开发者除了一行定义依赖名的代码之外不需要定义任何东西。因此这篇文章中,我们将只关注对开发者更友好的 jcenter 和 Maven Central 。
实际上可以在 Android Studio 上使用的除了 Maven 仓库之外还有另外一种仓库:Ivy 仓库 。但是根据我的经验来看,我还没看到任何人用过它,包括我,因此本文就直接忽略了。
理解 jcenter 和 Maven Central
为何有两个标准的仓库?
事实上两个仓库都具有相同的使命:提供 Java 或者 Android library 服务。上传到哪个(或者都上传)取决于开发者。
起初,Android Studio 选择 Maven Central 作为默认仓库。如果你使用老版本的 Android Studio 创建一个新项目,mavenCentral() 会自动的定义在 build.gradle 中。
但是 Maven Central 的最大问题是对开发者不够友好。上传 library 异常困难。上传上去的开发者都是某种程度的极客。同时还因为诸如安全方面的其他原因,Android Studio 团队决定把默认的仓库替换成 jcenter。正如你看到的,一旦使用最新版本的 Android Studio 创建一个项目,jcenter() 自动被定义,而不是 mavenCentral()。
有许多将 Maven Central 替换成 jcenter 的理由,下面是几个主要的原因。
– jcenter 通过 CDN 发送 library,开发者可以享受到更快的下载体验。
– jcenter 是全世界最大的 Java 仓库,因此在 Maven Central 上有的,在 jcenter 上也极有可能有。换句话说 jcenter 是 Maven Central 的超集。
– 上传 library 到仓库很简单,不需要像在 Maven Central 上做很多复杂的事情。
– 友好的用户界面
– 如果你想把 library 上传到 Maven Central ,你可以在 bintray 网站上直接点击一个按钮就能实现。
基于上面的原因以及我自己的经验,可以说替换到 jcenter 是明智之举。
所以我们这篇文章将把重心放在 jcenter,反正如果你能成功把 library 放在 jcenter,转到 Maven Central 是非常容易的事情。
gradle 是如何从仓库上获取一个 library 的?
在讨论如何上传 library 到 jcenter 之前,我们先看看 gradle 是如何从仓库获取 library 的。比如我们在 build.gradle 输入如下代码的时候,这些库是如果奇迹般下载到我们的项目中的。
1
|
compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3' |
一般来说,我们需要知道 library 的字符串形式,包含 3 部分
1
|
GROUP_ID:ARTIFACT_ID:VERSION |
上面的例子中,GROUP_ID 是 com.inthecheesefactory.thecheeselibrary ,ARTIFACT_ID 是 fb-like,VERSION 是 0.9.3。
GROUP_ID 定义了 library 的 group。有可能在同样的上下文中存在多个不同功能的 library。如果 library 具有相同的 group,那么它们将共享一个 GROUP_ID。通常我们以开发者包名紧跟着 library 的 group 名称来命名,比如 com.squareup.picasso。然后 ARTIFACT_ID 中是 library 的真实名称。至于 VERSION,就是版本号而已,虽然可以是任意文字,但是我建议设置为 x.y.z 的形式,如果喜欢还可以加上 beta 这样的后缀。
下面是 Square library 的一个例子。你可以看到每个都可以很容易的分辨出 library 和开发者的名称。
1
2
3
4
5
6
|
dependencies { compile 'com.squareup:otto:1.3.7' compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'com.squareup.retrofit:retrofit:1.9.0' } |
那么在添加了上面的依赖之后会发生什么呢?简单。Gradle 会询问 Maven 仓库服务器这个 library 是否存在,如果是,gradle 会获得请求 library 的路径,一般这个路径都是这样的形式:GROUP_ID/ARTIFACT_ID/VERSION_ID。比如可以在 http://jcenter.bintray.com/com/squareup/otto/1.3.7 和 https://oss.sonatype.org/content/repositories/releases/com/squareup/otto/1.3.7/
下获得 com.squareup:otto:1.3.7 的 library 文件。
然后 Android Studio 将下载这些文件到我们的电脑上,与我们的项目一起编译。整个过程就是这么简单,一点都不复杂。
我相信你应该清楚的知道从仓库上下载的 library 只是存储在仓库服务器上的 jar 或者 aar 文件而已。有点类似于自己去下载这些文件,拷贝然后和项目一起编译。但是使用 gradle 依赖管理的最大好处是你除了添加几行文字之外啥也不做。library 一下子就可以在项目中使用了。
了解 aar 文件
等等,我刚才说了仓库中存储的有两种类型的 library:jar 和 aar。jar 文件大家都知道,但是什么是 aar 文件呢?
aar 文件时在 jar 文件之上开发的。之所以有它是因为有些 Android Library 需要植入一些安卓特有的文件,比如 AndroidManifest.xml,资源文件,Assets 或者 JNI。这些都不是 jar 文件的标准。
因此 aar 文件就时发明出来包含所有这些东西的。总的来说它和 jar 一样只是普通的 zip 文件,不过具有不同的文件结构。jar 文件以 classes.jar 的名字被嵌入到 aar 文件中。其余的文件罗列如下:
– /AndroidManifest.xml (mandatory)
– /classes.jar (mandatory)
– /res/ (mandatory)
– /R.txt (mandatory)
– /assets/ (optional)
– /libs/*.jar (optional)
– /jni/<abi>/*.so (optional)
– /proguard.txt (optional)
– /lint.jar (optional)
可以看到.aar 文件是专门为安卓设计的。因此这篇文章将教你如何创建与上传一个 aar 形式的 library。
如何上传 library 到 jcenter
我相信你已经知道了仓库系统的大体工作原理。现在我们来开始最重要的部分:上传。这个任务和如何上传 library 文件到 http://jcenter.bintray.com 一样简单。如果做到,这个 library 就算发布了。好吧,有两个需要考虑:如何创建 aar 文件以及如何上传构建的文件到仓库。
虽然需要若干步骤,但是我还是想强调这事并不复杂,因为已经准备好了所有事情。整个过程如下图:
因为细节比较多,我分为 7 部分,一步一步的详细解释清楚。
第一部分:在 bintray 上创建 package
首先,你需要在 bintray 上创建一个 package。为此,你需要一个 bintray 账号,并在网站上创建一个 package。
第一步:在 bintray.com 上注册一个账号。(注册过程很简单,自己完成)
第二步:完成注册之后,登录网站,然后点击 maven。
第三步:点击 Add New Package,为我们的 library 创建一个新的 package。
第四步:输入所有需要的信息
虽然如何命名包名没有什么限定,但是也有一定规范。所有字母应该为小写,单词之间用-分割,比如,fb-like。
当每项都填完之后,点击 Create Package。
第五步:网页将引导你到 Package 编辑页面。点击 Edit Package 文字下的 Package 名字,进入 Package 详情界面。
完工!现在你有了自己在 Bintray 上的 Maven 仓库,可以准备上传 library 到上面了。
Bintray 账户的注册就完成了。下一步是 Sonatype,Maven Central 的提供者。
第二部分:为 Maven Central 创建个 Sonatype 帐号
注:如果你不打算把 library 上传到 Maven Central,可以跳过第二和第三部分。不过我建议你不要跳过,因为仍然有许多开发者在使用这个仓库。
和 jcenter 一样,如果你想通过 Maven Central, 贡献自己的 library,你需要在提供者的网站 Sonatype 上注册一个帐号。
你需要知道的就是这个帐号,你需要在 Sonatype 网站上创建一个 IRA Issue Tracker 帐号。请到 Sonatype Dashboard 注册这个帐号。
完成之后。你需要请求得到贡献 library 到 Maven Central 的权限。不过这个过程对我来说有点无厘头,因为你需要做的就是在 JIRA 中创建一个 issue,让它们允许你上传匹配 Maven Central 提供的 GROUP_ID 的 library。
要创建上述所讲到的 issue,访问 Sonatype Dashboard,用创建的帐号登录。然后点击顶部菜单的 Create。
填写如下信息:
Project: Community Support – Open Source Project Repository Hosting
Issue Type: New Project
Summary: 你的 library 名称的概要,比如 The Cheese Library。
Group Id: 输入根 GROUP_ID,比如,com.inthecheeselibrary 。一旦批准之后,每个以 com.inthecheeselibrary 开始的 library 都允许被上传到仓库,比如 com.inthecheeselibrary.somelib。
Project URL: 输入任意一个你想贡献的 library 的 URL,比如, https://github.com/nuuneoi/FBLikeAndroid。
SCM URL: 版本控制的 URL,比如 https://github.com/nuuneoi/FBLikeAndroid.git。
其余的不用管,然后点击 Create。现在是最难的部分… 耐心等待… 平均大概 1 周左右,你会获准把自己的 library 分享到 Maven Central。
最后一件事是在 Bintray Profile 的帐户选项中填写自己的 Sonatype OSS 用户名。
点击 Update,完成。
第三部分:启用 bintray 里的自动注册
就如我上面提到的,我们可以通过 jcenter 上传 library 到 Maven Central ,不过我们需要先注册这个 library。bintray 提供了通过用户界面让 library 一旦上传后自动注册的机制。
第一步是使用下面的命令行产生一个 key。(如果你用的是 windows,请在 cygwin 下做这件事情)
1
|
gpg --gen-key |
有几个必填项。部分可以采用默认值,但是某些项需要你自己输入恰当的内容,比如,你的真实名字,密码 等等。
创建了 key 之后,调用如下的命令查看被创建 key 的信息。
1
|
gpg --list-keys |
如果没没问题的话,可以看到下面的信息:
1
2
3
|
pub 2048R/01ABCDEF 2015-03-07 uid Sittiphol Phanvilai <yourmail@email.com> sub 2048R/98765432 2015-03-07 |
现在你需要把 key 上传到 keyserver 让它发挥作用。为此,请调用如下的命令并且将其中的 PUBLIC_KEY_ID 替换成上面 pub 一行中 2048R/ 后面的 8 位 16 进制值,譬如本例是 01ABCDEF。
1
|
gpg --keyserver hkp: //pool.sks-keyservers.net --send-keys PUBLIC_KEY_ID |
然后,使用如下的命令以 ASCII 形式导出公共和私有的 key,请将 yourmail@email.com 替换成你前面用于创建 key 的 email。
1
2
|
gpg -a --export yourmail@email.com > public_key_sender.asc gpg -a --export-secret-key yourmail@email.com > private_key_sender.asc |
打开 Bintray 的 Edit Profile 页面点击 GPG 注册。分别在 Public Key 和 Private Key 中填入上一步导出的 public_key_sender.asc 和 private_key_sender.asc 文件中的内容。
点击 Update 保存这些 key。
最后一步就是启用自动注册。到 Bintray 的主页点击 maven。
点击编辑
勾选中 GPG Sign uploaed files automatically 以启用自动注册。
点击 Update 保存这些步骤。完成。现在只需点击一下,每个上传到我们 Maven 仓库的东西都会自动注册并做好转向 Maven Central 。
请注意这是一次性的操作,以后创建的每一个 library 都要应用此操作。
Bintray 和 Maven Central 已经准备好了。现在转到 Android Studio 部分。
第四部分:准备一个 Android Studio 项目
很多情况下,我们需要同时上传一个以上的 library 到仓库,也可能不需要上传东西。因此我建议最好将每部分分成一个 Module。最好分成两个 module,一个 Application Module 一个 Library Module。Application Module 用于展示库的用法,Library Module 是 library 的源代码。如果你的项目有一个以上的 library,尽管创建另外的 module:1 个 module 对应 1 个 library。
我相信大家知道如何创建一个新的 module,因此就不会深入讲解这个问题了。其实很简单,基本就是选择 creating an Android Library module ,然后就完了。
下一步是把 bintray 插件应用在项目中。我们需要修改项目的 build.gradle 文件中的依赖部分,如下:
1
2
3
4
5
|
dependencies { classpath 'com.android.tools.build:gradle:1.2.3' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2' classpath 'com.github.dcendents:android-maven-plugin:1.2' } |
有一点非常重要,那就是 gradle build tools 的版本设置成 1.1.2 以上,因为以前的版本有严重的 bug,我们将使用的是最新的版本 1.2.3。
接下来我们将修改 local.properties。在里面定义 api key 的用户名以及被创建 key 的密码,用于 bintray 的认证。之所以要把这些东西放在这个文件是因为这些信息时比较敏感的,不应该到处分享,包括版本控制里面。幸运的是在创建项目的时候 local.properties 文件就已经被添加到.gitignore 了。因此这些敏感数据不会被误传到 git 服务器。
下面是要添加的三行代码:
1
2
3
|
bintray.user=YOUR_BINTRAY_USERNAME bintray.apikey=YOUR_BINTRAY_API_KEY bintray.gpg.password=YOUR_GPG_PASSWORD |
bintray username 放在第一行, API Key 放在第二行, API Key 可以在 Edit Profile 页面的 API Key 选项卡中找到。
最后一行是创建 GPG key 的密码。保存并关闭这个文件。
最后要修改的是 module 的 build.gradle 文件。注意前面修改的是项目的 build.gradle 文件。打开它,在 apply plugin: ‘com.android.library’ 之后添加这几行,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
apply plugin: 'com.android.library' ext { bintrayRepo = 'maven' bintrayName = 'fb-like' publishedGroupId = 'com.inthecheesefactory.thecheeselibrary' libraryName = 'FBLike' artifact = 'fb-like' libraryDescription = 'A wrapper for Facebook Native Like Button (LikeView) on Android' libraryVersion = '0.9.3' developerId = 'nuuneoi' developerName = 'Sittiphol Phanvilai' developerEmail = 'sittiphol@gmail.com' licenseName = 'The Apache Software License, Version 2.0' allLicenses = [ "Apache-2.0" ] } |
bintrayRepo 使用默认的,即 maven。bintrayName 修改成你上面创建的 package name。其余的项也修改成和你 library 信息相匹配的值。有了上面的脚本,每个人都能通过下面的一行 gradle 脚本使用这个 library。
1
|
compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3' |
最后在文件的后面追加两行如下的代码来应用两个脚本,用于构建 library 文件和上传文件到 bintray(为了方便,我直接使用了 github 上连接到相关文件的链接):
完成!你的项目现在设置好了,准备上传到 bintray 吧!
第五部分:把 library 上传到你的 bintray 空间
现在是上传 library 到你自己的 bintray 仓库上的时候了。请到 Android Studio 的终端(Terminal)选项卡。
第一步是检查代码的正确性,以及编译 library 文件(aar,pom 等等),输入下面的命令:
1
|
> gradlew install |
如果没有什么问题,会显示:
1
|
BUILD SUCCESSFUL |
现在我们已经成功一半了。下一步是上传编译的文件到 bintray,使用如下的命令:
1
|
gradlew bintrayUpload |
如果显示如下你就大喊一声 eureka 吧!
1
|
SUCCESSFUL |
在 bintray 的网页上检查一下你的 package。你会发现在版本区域的变化。
点击进去,进入 Files 选项卡,你会看见那里有我们所上传的 library 文件。
恭喜,你的 library 终于放在了互联网上,任何人都可以使用了!
不过也别高兴过头,library 现在仍然只是在你自己的 Maven 仓库,而不是在 jcenter 上。如果有人想使用你的 library,他必须定义仓库的 url,如下:
1
2
3
4
5
6
7
8
9
10
11
|
repositories { maven { } } ... dependencies { compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3' } |
译者注:前面都没怎么看懂,看到上面的代码之后一下子全懂了,呵呵。
你可以在 bintray 的 web 界面找到自己 Maven 仓库的 url,或者直接吧 nuuneoi 替换成你的 bintray 用户名(因为前面部分其实都是一样的)。我还建议你直接访问那个链接,看看里面到底是什么。
但是,就如我们前面所讲的那样,让开发者去定义 url 这种复杂的事情并不是分享 library 的最佳方式。想象一下,使用 10 个 library 不得添加 10 个 url?所以为了更好的体验,我们把 library 从自己的仓库传到 jcenter 上。
第六部分:同步 bintray 用户仓库到 jcenter
把 library 同步到 jcenter 非常容易。只需访问网页并点击 Add to JCenter
什么也不做直接点击 Send。
现在我们所能做的就是等待 bintray 团队审核我们的请求,大概 2-3 个小时。一旦同步的请求审核通过,你会收到一封确认此更改的邮件。现在我们去网页上确认,你会在 Linked To 部分看到一些变化。
从此之后,任何开发者都可以使用 jcenter() repository 外加一行 gradle 脚本来使用我们的 library 了
1
|
compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3' |
想检查一下自己的 library 在 jcenter 上是否存在?你可以直接访问 http://jcenter.bintray.com,然后进入和你 library 的 group id 以及 artifact id 匹配的目录。在本例中就是 com -> inthecheesefactory -> thecheeselibrary -> fb-like -> 0.9.3。
请注意链接到 jcenter 是一个只需做一次的操作。如果你对你的 package 做了任何修改,比如上传了一个新版本的 binary,删除了旧版本的 binary 等等,这些改变也会影响到 jcenter。不过毕竟你自己的仓库和 jcenter 在不同的地方,所以需要等待 2-3 分钟让 jcenter 同步这些修改。
同时注意,如果你决定删除整个 package,放在 jcenter 仓库上的 library 不会被删除。它们会像僵尸一样的存在,没有人再能删除它了。因此我建议,如果你想删除整个 package,请在移除 package 之前先在网页上删除每一个版本。
第七部分:上传 library 到 Maven Central
并不是每个安卓开发者都使用 jcenter。仍然有部分开发者还在使用 mavenCentral() ,因此让我们也把 library 上传到 Maven Central 吧。
要从 jcenter 到 Maven Central,首先需要完成两个任务:
1) Bintray package 已经连接到 jcenter。
2) Maven Central 上的仓库已经认证通过
如果你已经通过了这些授权,上传 library package 到 Maven Central 就异常简单了,只需在 package 的详情页面点击 Maven Central 的链接。
输入你的 Sonatype 用户名和密码并点击 Sync。
如果成功,在 Last Sync Status 中会显示 Successfully synced and closed repo(见图),但是如果遇到任何问题,则会在 Last Sync Errors 显示出来。你需要根据情况修复问题,能上传到 Maven Central 的 library 的条件是相当严格的,比如+ 号是不能在 ibrary 版本的依赖定义中使用的。
完成之后,你可以在 Maven Central Repository 上找到你的 library。在那些匹配你 ibrary 的 group id 以及 artifact id 的目录中。比如本例中就是 com -> inthecheesefactory -> thecheeselibrary -> fb-like -> 0.9.3。
恭喜!虽然需要许多步骤,但是每一步都很简单。而且大部分操作都是一劳永逸的。
如此长篇的文章!希望对你有所帮助。我的英语也许有点晦涩,不过希望至少内容是可以理解的。
期待能在上面看到你的 library 大作!
最后
如果你按照这篇文章的步骤出现了错误,不妨看看这篇文章:
转载请注明:热爱改变生活.cn » (转) 如何使用 Android Studio 把自己的 Android library 分享到 jCenter 和 Maven Central
本博客只要没有注明“转”,那么均为原创。 转载请注明链接:sumile.cn » (转) 如何使用 Android Studio 把自己的 Android library 分享到 jCenter 和 Maven Central