现在开发android应用大都开始使用Android Studio,这个开发工具最大的好处就是引用第三方库时非常方面,只需要在build.gradle文件添加一句引用,就可以自动下载。
dependencies {
compile 'com.android.support:appcompat-v7:25.1.0'
compile 'com.android.support:recyclerview-v7:25.1.0'
}
那么这个library是从哪来下载的呢??
Android Studio是从build.gradle里面定义的Maven 仓库服务器上下载library的。Apache Maven是Apache开发的一个工具,提供了用于贡献library的文件服务器。总的来说,只有两个标准的Android library文件服务器:jcenter 和 Maven Central , 当然你还可以自定义仓库。
类型 | 备注 |
---|---|
Maven Central | 发布过程繁杂冗长, 每次发布成功都应该感谢一下上苍的厚爱。 |
jCenter | jCenter貌似稍微简单一点,但也不是省油的灯。 |
自定义仓库 | 一般的猿猿玩不起,企业内部可能会见到。 |
jcenter
jcenter是一个由 bintray.com维护的Maven仓库 。你可以在这里看到整个仓库的内容。我们在项目的build.gradle 文件中如下定义仓库,就能使用jcenter了:
allprojects {
repositories {
jcenter()
}
}
Maven Central
Maven Central 则是由sonatype.org维护的Maven仓库。你可以在这里看到整个仓库。不管是jcenter还是Maven Central ,两者都是Maven仓库
我们在项目的build.gradle 文件中如下定义仓库,就能使用Maven Central了:
allprojects {
repositories {
mavenCentral()
}
}
除了两个标准的服务器之外,如果我们使用的library的作者是把该library放在自己的服务器上,我们还可以自己定义特有的Maven仓库服务器。Twitter的Fabric.io 就是这种情况,它们在https://maven.fabric.io/public上维护了一个自己的Maven仓库。如果你想使用Fabric.io的library,你必须自己如下定义仓库的url。
repositories {
maven { url 'https://maven.fabric.io/public' }
}
然后在里面使用相同的方法获取一个library。
dependencies {
compile 'com.crashlytics.sdk.android:crashlytics:2.2.4@aar'
}
jitPack
JitPack是一个自定义的Maven仓库 ,最大的好处就是省时间...
使用条件:
- 会使用GitHub,能提交项目到GitHub上
- 使用AndroidStudio,且Gradle版本在2.4以上
gradle 如何获取library?
比如我们在 build.gradle输入如下代码的时候,这些库是如果奇迹般下载到我们的项目中的。
compile 'com.squareup.picasso:picasso:2.5.2'
一般来说,我们需要知道library的字符串形式,包含3部分:
GROUP_ID:ARTIFACT_ID:VERSION
上面的例子中:
GROUP_ID: com.squareup.picasso
ARTIFACT_ID:picasso
VERSION:2.5.2
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和开发者的名称。
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一下子就可以在项目中使用了。
arr文件
仓库中存储的有两种类型的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)
如何发布library到 jcenter
注册jcenter账号 ,获取apiKey
个人注册地址:https://bintray.com/signup/oss
有github账号的,可以直接使用github账号登录,登录后可以获取到apiKey
创建仓库
创建一个名字为maven的Repository
在maven仓库中创建一个package,注意package的名字和要发布的library的名字相同
新建android library ,添加配置
关于上传可以使用gradle-bintray-plugin插件,但是略复杂,所以我们采用bintray-release
如上图,photopicker 就是一个android library ,也就是我们也发布到jcenter上的library 。
- 在project build.gradle文件中添加bintray-release的classpath
dependencies {
classpath 'com.novoda:bintray-release:0.3.4'
}
- 在 photopicker 的 build.gradle文件中添加
apply plugin: 'com.novoda.bintray-release'//添加
//添加
publish {
userOrg = 'jcenter'//bintray.com用户名
groupId = 'com.helloandroid'//jcenter上的路径
artifactId = 'photopicker'//项目名称
publishVersion = '1.0.0'//版本号
desc = 'this is for test'//描述,不重要
website = 'https://github.com/github/photopicker'//网站,最好有,不重要
}
配置完成后,下面就要执行上传命令了,如果上传一切正常,那么以后引用这个库就是这样
compile 'com.helloandroid:photopicker:1.0.0
执行发布命令 ,上传代码至Bintray
上传很简单,在Android Studio的Terminal面板进行,执行下面的代码即可:
gradlew clean build bintrayUpload
-PbintrayUser=jcenter //jcenter 用户名
-PbintrayKey=xxxxxxxxxxxxxxxxxxxxxx // 注册账号获取到的apikey
-PdryRun=false
user就是用户名,key就是我们刚才的Api key,dryRun是一个配置参数,当为true的时候,会运行所有的环节,但是不会上传。
然后就是等待,当运行并上传完成,看到BUILD SUCCESSFUL就没问题了,如果有问题,根据log排查下。
add to jcenter , 等待审核
上一步虽然把library上传到jcenter,但是我们现在还不能使用,需要提交审核 。
审核通过会给你发送站内Message,大概两个小时左右,并且Add to Jcenter那个按钮就消失了。
在发布过程中遇到几个问题
1、如何解决Unsupported major.minor version 52.0问题?
2、乱码问题:
注释中有中文,可能会出现:编码GBK的不可映射字符 。项目的build.gradle中添加:
allprojects {
tasks.withType(Javadoc) {
options{
encoding "UTF-8"
charSet 'UTF-8'
links "http://docs.oracle.com/javase/7/docs/api"
}
}
}
参考文档
Android快速发布项目到jcenter
AndroidStudio library上传JCenter
Android 发布开源库到 JitPack、jCenter
优雅的发布 Android 开源库 (论 JitPack 的优越性)