如何快速创建并发布一个 Android 库

我的博客:http://blog.csdn.net/Imshuyuan/article/details/72876515

一、 前言

最近经常看到各种大神的库,发现用起来非常方便,自己研究了一下,来写个库发布一下,让自己写代码更加方便一点,自己封装了基本的开发工具类。也是搜集了各位大神的优秀代码总结的。

二、必要的准备工作

AndroidStudio、Gradle和自己的开源项目这个必须有。
Jcenter是Bintray下的一个仓库,所以Bintray帐号必须的,没有的如何申请。
网络必须是畅通的,要能访问https://bintray.com

三、申请Bintray帐号

到Bintray官网申请

如何快速创建并发布一个 Android 库_第1张图片
申请

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


如何快速创建并发布一个 Android 库_第2张图片
主页

四、 创建并发布一个 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 库_第3张图片
New module dialog

选择 Android Library ,点击 Next。 在后面的表格里,输入库的名称,点击 Next。 我把这个库命名为 mylittlelibrary
在最后一个页面中,选择 Add no Activity,点击 Finish
你的项目现在有了两个模块,一个是应用模块,一个是库模块。 项目的结构是这样的:
如何快速创建并发布一个 Android 库_第4张图片
Structure of project

后面所有的库代码只要写在库的项目里面就可以了。

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

如何快速创建并发布一个 Android 库_第5张图片
第一步
如何快速创建并发布一个 Android 库_第6张图片

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

如何快速创建并发布一个 Android 库_第7张图片

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


五、 配置gradle

如何快速创建并发布一个 Android 库_第8张图片

第 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 '[email protected]'// 开发者邮箱。
                    }
                }
                // 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

如何快速创建并发布一个 Android 库_第9张图片
如何快速创建并发布一个 Android 库_第10张图片

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

如何快速创建并发布一个 Android 库_第11张图片
2.上述完成之后,再次打开 Gradle Projects 窗口,搜索 bintrayUpload 任务。 双击它,启动上传文件。
如何快速创建并发布一个 Android 库_第12张图片

上传完成咯,但是别着急喔,你会发现在项目gradle中依赖如下代码后依赖失败:

'compile '包名:模块名:1.0.0'

原因是我们项目上传完成后还需要Bintray的管理员审核,所以在刚才项目页面点击进去查看详情,点击Add to Jcetner

七、 将库添加到 JCenter

如何快速创建并发布一个 Android 库_第13张图片

接着你进入一个页面,让你填写一些信息。 你可以用 Comments 区域来提及任何关于这个库的细节。
如何快速创建并发布一个 Android 库_第14张图片

单击 Send 按钮,启动 Bintray 的审查过程。 在一两天以内,Bintray 的工作人员会把你的库链接到 JCenter 仓库,这样你就将能在你的包的详细信息页面上,看到指向 JCenter 的链接了。

上述项目源码:https://github.com/huangshuyuan/Utils-master

参考:

创建并发布一个 Android 库
AndroidStuio快速发布开源项目到Jcenter/Bintray
Bintray 的用户手册

你可能感兴趣的:(如何快速创建并发布一个 Android 库)