一、 前言

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

二、必要的准备工作

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 模块到你的项目中。 您将看到下面的屏幕,里面提供了很多选择:

New module dialog

选择 Android Library ,点击 Next。 在后面的表格里,输入库的名称,点击 Next。 我把这个库命名为 mylittlelibrary。

在最后一个页面中,选择 Add no Activity,点击 Finish。

你的项目现在有了两个模块,一个是应用模块,一个是库模块。 项目的结构是这样的:

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

第一步

访问您的个人资料页,单击 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。

方式二: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 的链接了。

参考:

创建构建方法android,如何快速创建并发布一个 Android 库相关推荐

  1. 终于发布一个android应用程序到机锋市场,AppChina应用汇了

    终于发布一个android应用程序到机锋市场,AppChina应用汇了. 机锋市场和智件园注册上传都比较麻烦, AppChina应用汇开始最简单但后面的验证还是比较麻烦的而且不能包含广告和积分的,cm ...

  2. Android如何快速创建启动动画

    一.创建项目 最基础的创建项目(以java为例子) 二.创建相关的activity及文件夹 1.创建启动动画的activity 2.我们用的是Lottie,要导入相关的依赖,切记要重新编译一下!!! ...

  3. android app 快速接入支付宝流程(android studio)

       前一段时间做了商城app,增加了支付宝支付,感谢在遇到问题的时候,帮助我的大神们~    编程的路很长,学习的路也很长,总结才是提高的最快过程~ 一.快捷支付地址: https://b.alip ...

  4. Android Studio 4.0 重磅发布!Android 11 Bata 版来了!

    点击"开发者技术前线",选择"星标" 在看|星标|留言,  真爱 作者 | Adarsh Fernando 译者 | 王强    回复"666&quo ...

  5. 如何发布一个Android库

    经常在github上看到通过类似的语句引进别人的库: repositories { jcenter() } dependencies {compile 'com.flipboard:bottomshe ...

  6. Android MVVM封装,MVVM: 这是一个android MVVM 框架,基于谷歌dataBinding技术实现

    MVVM 这是一个android MVVM 框架,基于谷歌dataBinding技术实现.dataBinding 实现的 V 和 VM的关联:使用IOC架构实现了 M 和 V的关联. 框架具有以下功能 ...

  7. android splash 公司,正确地写一个Android Splash页面

    正确地写一个Android Splash页面 打开APP立即进入应用的主页面并呈现出用户想要的内容,对于用户来讲是最好的体验.但是通常APP在启动时需要进行一系列的初始化.网络加载等耗时的操作,因此启 ...

  8. android进制之间的转换器,一个Android平台的16进制转换器

    <一个Android平台的16进制转换器>由会员分享,可在线阅读,更多相关<一个Android平台的16进制转换器(1页珍藏版)>请在人人文库网上搜索. 1.一个An droi ...

  9. Android实现换发型功能,实现一个Android中更换头像功能

    实现一个Android中更换头像功能 本文原创,转载请经过本人准许 写在前面: 更换头像这个功能在用户界面几乎是100%出现的.通过拍摄照片或者调用图库中的图片,并且进行剪裁,来进行头像的设置. 功能 ...

最新文章

  1. DCN-S4600 telent、http远程登录配置
  2. python安卓版下载安装-python手册中文版apk下载
  3. pythongoogle.probuf.timestamp_数据通信格式:Google Protobuf
  4. delphi初级教程之delphi断点调试一
  5. 元组、字典、集合的常用方法
  6. cx是什么简称_80年的5角,在纸币收藏界简称为8005
  7. winform文件迁移工具
  8. python交叉验证结合线性回归_Python数据分析-线性回归、逻辑回归
  9. appium+python自动化51-adb文件导入和导出(pull push)
  10. django orm 操作表
  11. IPTV云端桌面APP软件+后台管理系统
  12. “2库1平台+N应用”助力智慧机场建设
  13. Servlet 运行工作原理详解
  14. smart原则_绩效指标如何设定?SMART原则轻松搞定
  15. WIN11安装子系统
  16. springboot---yaml语法
  17. [java] java语言基础
  18. FastDFS-6.06安装(Centos 7)
  19. HTML、CSS、JS(JAVA Sprict)
  20. Arcmap没有Spatial Analyst模块

热门文章

  1. 2018-06-18
  2. [原]Java程序员的JavaScript学习笔记(7——jQuery基本机制)
  3. Proftpd(MySQL验证+配额)配置
  4. 最近参加一个公司的入职培训
  5. iptables高级应用实例
  6. 全国计算机棋类竞赛,自主招生认可的12类主流竞赛详解
  7. adb 51 android.rules,使用51-android-rules解决ubuntu上不识别 android手机的问题
  8. c语言编程请输入密码,想程序高手求助--用C语言来编辑一个输入密码的程序
  9. html5与其他语言的优势,浅谈:html5和html的区别
  10. Python机器学习:多项式回归与模型泛化003过拟合与欠拟合