如何快速创建并发布一个 Android 库
我的博客:http://blog.csdn.net/Imshuyuan/article/details/72876515
一、 前言
最近经常看到各种大神的库,发现用起来非常方便,自己研究了一下,来写个库发布一下,让自己写代码更加方便一点,自己封装了基本的开发工具类。也是搜集了各位大神的优秀代码总结的。
二、必要的准备工作
AndroidStudio、Gradle和自己的开源项目这个必须有。
Jcenter是Bintray下的一个仓库,所以Bintray帐号必须的,没有的如何申请。
网络必须是畅通的,要能访问https://bintray.com
三、申请Bintray帐号

我之前已经申请过了,下图是登录进去主页

四、 创建并发布一个 Android 库
1. 创建一个 Android 库
如果你的库只包含 Java 类,那么,打包为 JAR 文件并使用 file host 来发布,也许是分享它的最快、最简单的方式。 如果你是用控制台来创建,那么下面的命令就已经足够了:
jar cvf mylibrary.jar Class1.class Class2.class ... ClassN.class
然而本教程要展示给你的是,如何处理更复杂的库。这些库不仅包含 Java 类,还有各种类型的 XML 文件和资源。 这些库被创建为 Android 库模块,并且通常被打包为 AAR 文件。
让我们创建一个简单的 Android 库,这个库为使用它的开发人员提供一个自定义 View。
第 1 步: 添加一个新模块
首先,选择 **File **菜单里的 New > New Module ,添加新的 Android 模块到你的项目中。 您将看到下面的屏幕,里面提供了很多选择:

选择 Android Library ,点击 Next。 在后面的表格里,输入库的名称,点击 Next。 我把这个库命名为 mylittlelibrary。
在最后一个页面中,选择 Add no Activity,点击 Finish。
你的项目现在有了两个模块,一个是应用模块,一个是库模块。 项目的结构是这样的:

后面所有的库代码只要写在库的项目里面就可以了。
2.在本地使用库
现在,库已经准备好了,为了确保没有问题,我们来在同一项目的 app 模块中使用它。 要使用它,请在应用模块里的 build.gradle 文件添加 compile 依赖。
compile project(":mylittlelibrary")
在应用模块里创建新的 Java 类,MainActivity。 让他继承 Activity 类,重写其 onCreate 方法。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
在 onCreate 方法里,使用自定义 View 的构造方法来创建它的实例。 为了让它能填满 Activity 所有的屏幕空间,把它传递给 setContentView 方法。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View v = new MyView(this);
setContentView(v);
}
你的 Activity 已经准备完毕。 把它添加到应用的 manifest 文件后,构建你的项目并将你的应用部署到一台 Android 设备上。 当应用启动时,你应该能够看到这个自定义 view。
3.在 Bintray 发布你的库
Bintray 是一个流行的可以用来发布 Android 库的平台。 它是免费的,并且易于使用。
首先,在 Bintray 上创建一个帐户。(上述已创建)
下面只要登录进去,创建maven 的一个仓库即可,填写相关信息即可,类型maven


访问您的个人资料页,单击 Edit 按钮。 在下一页上,单击 API Key 链接以查看您的 API 密钥。

记住这个密钥,因为使用 Bintray 插件时,你要用它来进行身份验证。
五、 配置gradle

第 1 步:添加必要的插件
为了在 Android Studio 里与 Bintray 交互,你应该把 Bintray 插件引入到项目的 build.gradle 文件的 dependencies
里。
classpath'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.3'
因为你要把库上传到 Maven 仓库,你还应该像下面这样添加 Maven 插件。
classpath"com.github.dcendents:android-maven-gradle-plugin:1.3"
这时候如果上面的android-maven-gradle-plugin是1.3时会发生这个错误No service of type Factory available in ProjectScopeServices.,解决方法是把android-maven-gradle-plugin版本改为1.4.1:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
// 添加下面两行代码即可。
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
第 2 步:应用插件
打开您的库模块的 build.gradle 文件并添加以下代码,以应用我们在上一步中添加的插件。
apply plugin: 'com.jfrog.bintray'
apply plugin: 'com.github.dcendents.android-maven'
第 3 步: 指定 POM 详细信息
在上传库时,Bintray 插件会寻找 POM 文件。 即使 Maven 插件为你生成了它,你也应该自己指定 groupId 标签和 version 标签的值。 要这样做,请使用 gradle 文件中的group 和version 的变量。
group = 'com.github.hathibelagal.librarytutorial' // Change this to match your package name
version = '1.0.1' // Change this to match your version number
如果你对 Maven 很熟悉,想知道为什么我们没有指定 artifactId 标签的值。这是因为默认情况下, Maven 插件将你的库的名称作为了 artifactId。
第 4 步: 生成源 JAR
为了遵守 Maven 标准,你的库也应该有一个包含了库的源文件的 JAR 文件。 为了生成 JAR 文件,需要创建一个新的 Jar任务,generateSourcesJar,并且使用 from 功能指定的源文件的位置。
task generateSourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier 'sources'
}
第 5 步: 生成 Javadoc JAR
我们同样推荐,在你的库里有一个包含 Javadocs 的 JAR 文件。 因为目前你还没有任何 Javadocs,需要创建一个新的 Javadoc 任务,generateJavadocs,来生成它们。 使用 source 变量来指定源文件的位置。 你还应该更新 classpath 变量,以便该任务可以找到属于 Android SDK 的类。 你可以通过把 android.getBootClasspath 方法的返回值添加给他,来这么做。
task generateJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath()
.join(File.pathSeparator))
}
下一步,要从 Javadocs 生成 JAR,需要创建 Jar 任务,generateJavadocsJar,并把 generateJavadocs 的 destinationDir 属性传递给它的 from 功能。 您的新任务应如下所示:
task generateJavadocsJar(type: Jar) {
from generateJavadocs.destinationDir
classifier 'javadoc'
}
为了确保在 generateJavadocsJar 任务只在 generateJavadocs 任务完成后才开始,需要添加下面的代码片段,它使用了 dependsOn 方法来决定任务的顺序:
generateJavadocsJar.dependsOn generateJavadocs
第 6 步: 引入生成的 JAR 文件
为了把源和 Javadoc JAR 文件导入到 artifacts 的列表里,你应该把他们的任务的名字添加到 configuration 里,称为 archives,artifacts 列表将被上传到 Maven 仓库。 使用下面的代码片段来完成:
artifacts {
archives generateJavaDocsJar
archives generateSourcesJar
}
第 7 步: 配置 Bintray 插件
要配置插件,你应该使用 Gradle 文件中的 bintray 闭包。 首先,使用与你的 Bintray 用户名和 API 密钥对应的 user 和 key 变量进行身份验证。在 Bintray,你的库会被放置在 Bintray package 里。 你应该使用 pkg 闭包里命名直观的 repo、 name、licenses 和 vcsUrl 参数,提供详细的相关信息, 如果这个包不存在,会为你自动创建。当你将文件上传到 Bintray 时,他们会与 Bintray 包里的一个版本相关联。 因此,pkg 必须包含一个 version闭包,闭包的 name 属性要设为独一无二的名称。 另外,你还可以使用 desc,released 和 vcsTag 参数来提供描述、 发布日期和 Git 标签。
最后,为了指定应该上传的文件,要把 configuration 参数的值设为 archives。
这是一个配置示例:(建议账号,key放在其他文件中,下面会介绍)
bintray {
user ='test-user'
key ='01234567890abcdef01234567890abcdef'
pkg {
repo ='maven'
name ='com.github.hathibelagal.mylittlelibrary'
version {
name ='1.0.1-tuts'
desc ='My test upload'
released =newDate()
vcsTag ='1.0.1'
}
licenses = ['Apache-2.0']
vcsUrl ='https://github.com/hathibelagal/LibraryTutorial.git'
websiteUrl ='https://github.com/hathibelagal/LibraryTutorial'
}
configurations = ['archives']
}
以上7步可以总结如下,参照以下操作,一次性完成
(一)配置项目gradle,在dependencies 下添加两行代码
dependencies {
···
//发布库需要的文件
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
···
}
(二)配置要上传的library/module的gradle文件
将所有要发布的内容都写在maven.gradle里面,在库的gradle下添加以下代码
apply from: "maven.gradle"
(三)配置maven.gradle文件
// 发布需要的插件
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
// 项目引用的版本号,比如compile 'com.hsy.utils:utilslibrary:1.0.1'中的1.0.1就是这里配置的。
version = "1.0.1"
// 定义两个链接,下面会用到。
def siteUrl = 'https://github.com/huangshuyuan/UtilsDemo' // 项目主页。
def gitUrl = 'https://github.com/huangshuyuan/UtilsDemo.git' // Git仓库的url。https://github.com/huangshuyuan/UtilsDemo.git
// 唯一包名,比如compile 'com.hsy.utils:utilslibrary:1.0.1'中的com.hsy.utils就是这里配置的。
// :utilslibrary后面会根据项目名称得到
group = "com.hsy.utils"
install {
repositories.mavenInstaller {
// 生成pom.xml和参数
pom {
project {
packaging 'aar'
// 项目描述,复制我的话,这里需要修改。
name 'utilslibrary'// 可选,项目名称。
description 'Android Utils'// 可选,项目描述
url siteUrl// 项目主页,这里是引用上面定义好。
// 软件开源协议,现在一般都是Apache License2.0吧,复制我的,这里不需要修改。
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
//填写开发者基本信息,复制我的,这里需要修改。
developers {
developer {
id 'huangshuyuan' // 开发者的id。
name 'huangshuyuan' // 开发者名字。
email 'hshuyuan@foxmail.com'// 开发者邮箱。
}
}
// SCM,复制我的,这里不需要修改。
scm {
connection gitUrl// Git仓库地址。
developerConnection gitUrl// Git仓库地址。
url siteUrl // 项目主页。
}
}
}
}
}
// 生成jar包的task,不需要修改。
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
// 生成jarDoc的task,不需要修改。
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
failOnError false// 忽略注释语法错误,如果用jdk1.8你的注释写的不规范就编译不过。
}
// 生成javaDoc的jar,不需要修改。
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
// 这里是读取Bintray相关的信息,我们上传项目到github上的时候会把gradle文件传上去,
// 所以不要把帐号密码的信息直接写在这里,写在local.properties中,这里动态读取。
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
user = properties.getProperty("bintray.user")// Bintray的用户名。
key = properties.getProperty("bintray.apikey")// Bintray刚才保存的ApiKey。
configurations = ['archives']
pkg {
repo = "utilslibrary"// 上传到maven库。(这里要特别注意,如果写了maven报404错误,请在bintray创建一个仓库,这里填改成你创建的仓库的名字,如何创建请看上方。)
name = "com.hsy.utils"// 发布到Bintray上的项目名字,这里的名字不是compile 'com.hsy.utils:utilslibrary:1.0.1'中的utilslibrary。
userOrg = 'huangshuyuan'//// Bintray的用户名。
websiteUrl = siteUrl
vcsUrl = gitUrl
licenses = ["Apache-2.0"]
publish = true//是否公开项目
version {
gpg {
sign = true
passphrase = properties.getProperty("bintray.gpg.password")
}
}
}
}
(四)、在local.properties中为module/libraray配置用户隐私信息
bintray.user=huangshuyuan
bintray.apikey=a8**********************************************2
六、上传项目到Jcenter
方式一:2步命令上传
准备工作都做完啦,最后一步就是上传操作了,点击AndroidStudio底部的Terminal,观察下Terminal显示的路径是否是你当前项目的root。
1、这里如果你系统配置了gradle的用户环境,输入gradle install,如果没有配置gradle用户环境,输入gradlew install,如果没有问题,最终你会看到BUILD SUCCESSFUL。
如果你看到了生成javadoc时编译不过,那么要看下在gradle中task javadoc下有没有failOnError false
这句话,在刚才编写gradle时提示过了。如果加了这句而你的javadoc写的不规范会有警告,你不用鸟它。
2、最后一步,运行gradle install后看到BUILD SUCCESSFUL后,再输入上传命令gradle bintrayUpload,等一分钟左右就执行完了,会提示SUCCESSFUL。
浏览器https://bintray.com/后会看到你的项目。
方式二:gradle上传
1.打开 Gradle Projects 窗口,找到install点击即可会看到BUILD SUCCESSFUL
此步骤是为了生成发布必要的文件,比如aar


一旦完成运行,你就有了一切发布你的库需要的东西,有效的 POM 文件,AAR 文件,源 JAR,和 Javadocs JAR。

2.上述完成之后,再次打开 Gradle Projects 窗口,搜索 bintrayUpload 任务。 双击它,启动上传文件。

上传完成咯,但是别着急喔,你会发现在项目gradle中依赖如下代码后依赖失败:
'compile '包名:模块名:1.0.0'
原因是我们项目上传完成后还需要Bintray的管理员审核,所以在刚才项目页面点击进去查看详情,点击Add to Jcetner
七、 将库添加到 JCenter

接着你进入一个页面,让你填写一些信息。 你可以用 Comments 区域来提及任何关于这个库的细节。

单击 Send 按钮,启动 Bintray 的审查过程。 在一两天以内,Bintray 的工作人员会把你的库链接到 JCenter 仓库,这样你就将能在你的包的详细信息页面上,看到指向 JCenter 的链接了。
上述项目源码:https://github.com/huangshuyuan/Utils-master
参考:
创建并发布一个 Android 库
AndroidStuio快速发布开源项目到Jcenter/Bintray
Bintray 的用户手册