最近在Flipboard实习期间写了一个轮播工具,技术上没什么难点,不过动画效果仍是不错的,决定改改代码写个库开源出去。项目地址:http://github.com/chengdazhi/DecentBanner,欢迎你们提Issue报Bug。因为国内有关发布开源库的文章与教程不多见,我就先挖个坑。html
本文力求简明,但愿你们能够很快学会如何把本身写的代码开源出去,并让全世界的开发者能够经过一句compile语句来使用。毕竟重点在于库自己,而发布只是必须的过程。java
整个过程涉及如下几个工具:android
Android Studio + Gradle : 用于将库独立成模块。git
Bintray : Bintray是用于托管库代码的地方,也是将库发布到JCenter的工具。只有库发布到JCenter,在Gradle中才能够经过一句compile命令来集成。github
Telecine : 用于给Android应用录屏。api
过程分为如下几步:浏览器
下面以这三步为主线一步步将库开源出去。服务器
在这一部分中咱们要把库的代码封装并生成aar文件。aar文件相似于jar,只不过因为Android还包含XML、Assets、JNI等等其余格式的文件,因此打包后的结果就是aar。微信
首先在Android Studio中点击File菜单,选择New->New Module,而后在弹出视图中选择Android Library,点击Next后填写库的名称。并发
我在这里填写decentbanner,而后在目录视图中就能够看到两个module了,一个是App的,一个是库的。(默承认运行的module名称为app,我在这里改为了demo)
建立完新的module后就能够填充代码了,至于写什么组件倒没有关系。写好后,若是想在app module中使用新的module中的类,须要在app module下的build.gradle中添加依赖:
compile project(':yourmodulename') //冒号后是你的新module的名称
当你在app module下测试没有问题后,这一步就完成了。固然这里的重点在于库的代码,封装自己是没有难度的。
Bintray是一个能够托管Android库的平台,平时咱们在gradle中经过一句compile命令就能够引用的库,都托管在JCenter上,而JCenter则由Bintray维护。咱们在这个部分中要进行的操做分两步,一是将咱们的代码上传到Bintray的Maven仓库中,二是将Maven仓库发布到JCenter。在这一部分中Gradle是核心,因此若是你哪一个地方出了问题,我在这个部分末尾给出了几个gradle文件的GitHub地址能够供你们参考。
当你完成注册并登陆到Bintray后,你会发现有九个仓库可供你使用,点View All后你会看到Maven选项。这里不须要进行任何操做,只须要知道咱们要使用Maven进行上传便可。咱们这里真正须要的是API Key,后面当咱们在上传库时须要提供username和API key,具体在哪里后面再说。你们不妨先在网站里处处逛逛。
首先咱们由于要使用到Bintray和Maven的服务,咱们须要在项目根目录下的build.gradle中添加两行classpath。具体的文档能够参考Bintray plugin和Maven plugin。
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2' classpath "com.github.dcendents:android-maven-gradle-plugin:1.3"
这里依赖的插件版本低于GitHub文档中的最新版本,由于我依赖最新版时发现Android Studio会报错,信息是库不兼容,若是你没有这个问题,固然仍是最新版最好。在添加完classpath后,要在你的库module中依赖新的插件,只需将下面两行添加到库module目录中的build.gradle文件便可。
apply plugin: 'com.jfrog.bintray' apply plugin: 'com.github.dcendents.android-maven'
Bintray在上传库时须要一个POM文件,而这个文件可让Maven插件自动生成,但你仍是须要给出groupId和version的值,只须要将下面这两行代码添加到库module的build.gradle中便可。
group = '你的库的包名' // 这里须要和真实包名对应,不能随便填写 version = '1.0.1' // 指定版本号
为了与Maven标准对应,你须要在库module的build.gradle中添加几个task,分别生成Jar,Javadoc和JavadocsJar,只须要将下面三个task代码添加到gradle文件便可。
task generateSourcesJar(type: Jar) { from android.sourceSets.main.java.srcDirs //经过from函数指定代码源,这里是默认代码源 classifier 'sources' } task generateJavadocs(type: Javadoc) { source = android.sourceSets.main.java.srcDirs //source指定了代码源 classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) } //这里dependsOn意为仅当generateJavadocs完成后才开始本task task generateJavadocsJar(type: Jar, dependsOn: generateJavadocs) { from generateJavadocs.destinationDir classifier 'javadoc' }
为了将你生成的源代码和Javadoc Jar文件添加到Maven中,你须要将task添加到一个archive中,只须要向库module下的build.gradle中添加以下代码:
artifacts { archives generateJavaDocsJar archives generateSourcesJar }
到这里咱们已经配置好了Maven插件,如今须要配置Bintray插件。在编写代码前,咱们须要提供username和API key,username就是你注册时填写的,若是你直接用GitHub登陆,那么username就是GitHub的username。要找到API key,首先进入我的主页,即点击Bintray主页右上角的头像并点击Your Profile,而后点击头像右侧大大的Edit按钮,然后在左侧找到API Key选项便可。
咱们在这里先将这两个值写在local.properties下,由于这种数据是不该该传到GitHub的。
bintray.user=your_username bintray.apikey=your_apikey
然后咱们继续在库module下的build.gradle中添加以下代码块,这里我直接贴了个人代码,方便你们参阅,请你们对具体的值进行修改。在这里有一个license属性,立刻就要说到如何选择一个license。license只是声明别人在使用你的代码时的权限,不须要申请,选择以后直接在项目中添加一个相应的LICENSE文件便可。除此以外,
//须要在local.properties文件中取值 Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) bintray { user = properties.getProperty("bintray.user") key = properties.getProperty("bintray.apikey") pkg { repo = 'maven' name = 'it.chengdazhi.decentbanner' version { name = '1.0.5-tuts' desc = "decent banner" released = new Date() vcsTag = '1.0.5' } } configurations = ['archives'] }
在选择License时,能够参考这张图,来自阮一峰老师的博文。刚才说过,选择License只是选择一种权利,选好以后能够直接添加就好。GitHub在建立Repo时能够快速添加License文件。
以上除了两行classpath写在根目录build.gradle,以及username和apikey写在local.properties下,其他修改的所有是库module下的build.gradle文件,完整文件能够参考个人源码。到这里咱们完成了全部gradle的编写,如今咱们须要进入Gradle Window视图,默认在Android Studio的右侧,处在最小化状态,找不到能够从菜单点击View->Tool Windows->Gradle调出。点击图标栏的Gradle图标。
输入install,点击OK。注意这里的Gradle project是你的库module。这时会执行Maven相关的task。
然后你的库module的build目录下会出现POM文件,AAR文件,源代码Jar文件和Javadocs Jar文件。
成功后再次点击Gradle图标,输入bintrayUpload并点击OK。执行成功后你的库就成功上传到Bintray了。注意之后每次更新库时须要更新版本号,否则会冲突,同时每次都须要顺序执行install和bintrayUpload。上传成功后你能够在Bintray主页左下角的My Recent Packages栏目中看到新的package。
点进去后会有这样一个提示,让你在七天以内公开,点击Publish。
而后为了让全部开发者均可以使用,你须要将类库添加到JCenter。操做很简单,只须要点击以下所示的按钮,然后你须要填写有关类库的信息。
我提交以后过几个小时就有邮件通知添加成功,你们耐心等待。添加成功后会变成以下景象。
在每次发新版时,点击Publish后不会当即生效,也就是说若是在Gradle中想要当即引用新版,会没法解析,由于有几分钟的延迟,等到左下角的Maven build Settings中的依赖代码改变,或是右上侧Version栏目下新版信息有了tweeter标识后就能够正常引用了。
恭喜你,你已经完成了全部有坑的环节,如今离完成只剩一个GitHub了!GitHub对于你的开源库而言有以下几个做用,一是能够维护一份文档,也就是README,告知你们相关信息;二是能够将代码以很方便的形式让你们参考并作二次开发;第三点在于GitHub是世界上最大的同性交友平台,是全部开源库的集散地;第四点在于你们能够很方便的提交Issue给你报Bug。
有不少文章讲了如何将项目托管到GitHub,这里再也不重述。首先咱们说说README这个文件。在GitHub的每一个项目中,根目录中的README.md会被用于展现,你们能够在这个文档中展现库的相关信息,至少要包含依赖语句。除此之外,我建议你们在README中添加如下几项信息:
效果展现:若是你作的是View,那么给出一个截图或是Gif,若是是其余组件,最好也给出可视化很强的图片,由于图片对人的冲击力远大于文字。若是你要作动图,并进行图片录制的话,首先推荐一个录屏工具Telecine,Jake Wharton出品,无需root,方便传输,这是我对比多个市场上下载量最大的录屏工具后做出的推荐。而后,在你将视频转成gif后,可使用Photoshop对Gif进行裁剪与剪辑,只需打开时间轴窗口便可,很方便。建议你将gif图片放在项目目录中,而不是在README中之外链形式添加,否则可能显示异常。
样例下载:开发者若是被你的展现图所吸引,会但愿能下载一个样例。建议你们能同时给出apk的下载连接和二维码。因为国内不少人经过微信扫二维码,而微信浏览器又不支持下载,你们须要给服务器上的apk文件设置请求头,将Content-Type设置为application/octet-stream,强制微信跳转到外部浏览器。
功能与使用范例:给出支持的功能与相对应的最基本的使用方式,最好作出相关说明,好比参数等等。
License:把刚才选择的License添加到README中。
你们不妨多参考Star数很高的开源项目的README。
你已经成功地发布了开源库,为了让更多的人看到你的开源库,这里给出几个推广方式:
微博:微博能够说是推广库的最佳方式,正确的使用姿式是:一句话说清楚库的功能,给个地址,放个图,艾特几个大V,剩下的就看你的库的质量了。
周报:能够将你的库投稿给各类周报,每期周报里都会推送各类库,在这里推荐两个周报:Android开发技术周报、国外Android周报。各类各样的周报是不少的,你们多多发掘。
推广这种事是须要发挥想象力的。好比我在这里写个博客顺便就打个广告。
当有人在使用你的开源库并发现问题时,会向你提Issue。还有可能会有人想参与进来,和你一同开发。
可是,全部开源库都会经历从积极维护到中止维护(Deprecated)的过程,这也推动着开源事业不断地向前发展。全部代码与开源库都有过期的一天,只剩下几颗星星留在你的主页上,像一枚勋章,映射着你昔日的张狂。
推荐: