【填坑之旅】手把手教你如何用AndroidStudio上传自己的library到Jcenter库

前言:我们在使用AndroidStudio的时候,会经常用到第三方的代码库。引入第三方库的方式无非就是引入本地库和在线库两种(其实在线库也是先下载到本地再引用的)。在引用在线库的时候,只需在AS的app级的gradle里面添加一句话,例如:

compile 'com.android.support:appcompat-v7:26+'

就可以直接引用了。是不是也想以这种方式,将自己的库分享给别人引用呢,这篇博客教你。


1.准备工作

通过翻看网上的大量资料,发现集成方式有两种:
(1)使用gradle-bintray-plugin
(2)使用bintray-release
二者的区别简介度娘一大把,我就不过多赘述了。我就简单说说最大区别,就是前者集成配置多且麻烦,后者配置简单易用。所以我就以后者的方式教大家如何集成。如果你在集成前就看到我这篇博客,恭喜你,弯路基本可以完全不用走了。如果你是根据网上一些文章尝试过集成,但是无奈中路的n多坑让你下不去手,此时如果你看到这篇博客,应该能给你很大帮助。

  • 申请JfrogBintray的账号(有坑指数AA)
    Jfrog是什么,和jcenter又是什么关系,我这里就不细说了。你可以度娘或者看看网上其他介绍如何用AndroidStudio上传自己的library到Jcenter库的文章大都都有描述。
    截至写这篇博客为止,他们网站是这个样子的:

    我为什么要单独说这个呢,这里其实也是一个坑。你在网上搜索一些文章,介绍的就是简单一句话,去这个网站注册账号。很多人就选择了那个START YOUR FREE TRIAL的选项,因为一进页面,最醒目的绿色。好吧,这样你就进到第一个坑了。选择这个的结果就是到后面无法分享。你要选旁边的For an Open Source Account那个。

    这里你如果有github的账号,并且你的github账号绑定的邮箱不是QQ邮箱,那么你可以sign up with Github。为什么我要提到非QQ邮箱呢。因为,如果是QQ邮箱,你会发现你在绑定bintray账号时,邮箱那栏永远是灰的不可编辑,而且边框是红的,不能绑定(不知道企鹅是不是和这家网站的老总有仇)。这样的话,你还是老老实实Create My Account吧。
    创建账号的时候一定要注意username那项,这个就是你后面要用来上传的账号。
    这里也有一个坑。账号创建成功后,网站会给你的邮箱发个激活账户的邮件。这里千万,一定要注意,你的邮箱里面的垃圾回收站。激活邮件99%会被当成垃圾。如果你收不到那个激活邮件,没有点击激活,到这里为止,你的账户都是无效的。这里一定要注意。博主我就是因为这个垃圾邮件,反复注册了多次,结果发现激活邮件都在垃圾箱里面。


这里再说点题外话(不感兴趣的可以直接跳到下个知识点),就是这个账号的头像设置问题。(有坑指数A)
账号建立成功后,选择EditProfile:

你会发现头像这栏是无法直接通过上传图片来更改的。默认图片太丑,怎么办呢?
看到后面的change没有,点它,会外链到一个第三方的头像管理网站Gravatars

这个网站的作用就是你可以上传一些头像图片绑定到你指定的邮箱上面。然后Bintray那边就通过这种方式来显示头像。所以呢,你如果想自己的账号美美哒,还要注册一个该网站的账号。然后就点击sign in吧。结果呢发现该网站又是外链到一个叫WordPress.com账号来绑定账号的。是不是觉得又是一个坑。好吧,如果你觉得麻烦可以放弃了。如果还能坚持,那我们就继续。注册没有太大坑,关键是支持中文:

除了麻烦,其实注册还算比较轻松的:

那个Add Email Address可以添加自己的邮箱地址,Add a new Image可以上传自己喜欢的图片。上传的时候会提示你选择该图片的分级(是不是限制级),国外的分级制度还是比完善的。
这样的话,头像就算解决了。

  • 安装gradle的环境变量
    详情参考我的这篇博客:Win10下AndroidStudio使用本地Gradle

至此,恭喜你,童鞋,万里长征可以开始了。


2.创建MAVEN库(有坑指数AAA)

这个库,就是以后你上传你的安卓代码的地方,然后别人就在这里面引用你的库。
登录进你的bintray。

右上角头像那边有个下拉框,点击选择view profile

该页面的左边,选择Add New Repository

我们从上往下看:
(1)Chang Avatar是用来设置这个库的图标的。这里和设置账户头像不同,支持直接上传图片,注意不要太大,不然会解析不出来。
(2)接下来有两个选项,由于我们的是免费账号,只能选择Public,意思就是你上传的代码都是开源的。
(3)Name框这栏要注意了,这里是一个

。首先这个值就是你的库名字,这点好理解。然后,这个值还对应了你使用
bintray-release插件配置的一个参数repo name的值(在gradle-bintray-plugin中对应repo属性)。我为什么要说这是个坑。因为你看网上很多介绍的文章,都没有说过这个东西。而且在配置的时候也没提过那个属性。他们只是告诉你在Name这栏填maven,这就给很多小白造成一个错误的印象,就认为这里只能死填一个值,其实不然。填maven,是因为bintray-release插件配置的repo name默认属性就是maven(这点可以查阅一下官方的介绍文档),而那些文章又都没介绍过要设置这个属性,所以就完全“巧合”地建成功了。
(4)Type一项选择Maven吧,因为我们要上传的就maven库。
后面两个是可选的。根据你的需求就是选择填写。
上面的信息在后面都是可以重复修改的。
最后点击Create就创建好一个maven库了。


3.创建MAVEN Package

前面我们创建好了Maven的代码仓库,现在我们就往仓库里面添加东西了。

进到你的maven库,点击Add New Package

填空里面带*好的都是必填的
Package avatar 设置这个库的图标;
Name 这个库的名字,跟后面配置的artifactId属性一致;
Description 库的描述,干什么用的;
Licenses 开源声明,根据需求自行选择;
Tags 这个的库的类别属性,别人可以通过搜索这些标签来找到你的库。输入完后按回车,可以设置多个标签;
Maturity 字面翻译,成熟度。就是你这个库当前开发到什么地步了,有稳定版,实验版等选项。我这里是例子,就选实验版,你们根据自己需求进行选择;
Website 该库的相信信息的网站链接,一般链接到该项目的github网站上,你们根据自己需求进行填写;
Issues tracker 该库的发布里程追踪。一般链接到一个网址上。这里我选择不填。
Version control 当前库的发行版本号,初始的一般填1.0.0

填完点击Create Package


4.创建配置AndroidStudio的要上传的库(有坑指数AAA)

  • 新建一个测试工程,然后再引入你要上传的module,依赖好。

注意,这两步操作的时候有暗坑

注意,我这里新建的app主module和bintrayuploadlib库module的package name是完全一样的。这个是不行的。为什么不行,后面会讲到,我这里是为了重现那个错误,你们在创建的时候不要一样

  • 配置工程Gradle
    先在最外层的project级别的gradle文件里面依赖bintray-release的插件,最新的插件版本:点我就给你看
 buildscript {repositories {google()jcenter()}dependencies {classpath 'com.android.tools.build:gradle:3.0.1'classpath 'com.novoda:bintray-release:0.8.0'//添加依赖插件// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files} }

接着在你的库的gradle文件里面:
顶部

 apply plugin: 'com.novoda.bintray-release'//应用bintray插件

底部最外层

publish {repoName='Android_Library'//此处是坑,这个是你建立BintaryRespository的库名,如果你没有设置这个值,默认就是maven,具体看前面的介绍userOrg = 'XXX'//你登录bintray的用户名groupId = 'XXX'//jcenter上的路径artifactId = 'BintrayUpload'//项目名称,和之前建package的Name属性一致publishVersion = '1.0.0'//版本号desc = 'A convenient tool to help building a float button.Support full screen mode and Samsung S-series mobile phones change visiblity of bottom navigation bar dynamic.'//描述website = 'https://github.com/ChenJunsen'//库的链接网站}

请注意groupid这个属性有点点暗坑。这个值可以自己随意定义,而且晚上很多文章都是以com.xx.xx的样式设置的,但是,你如果为了美观,这个属性值最好不要以com开头。为啥?这个属性就是你在jcenter上面审核成功后,能够直接外网访问的路径。
举个栗子:

groupId = 'cjs.android.widgets'//jcenter上的路径
artifactId = 'Android-FloatButtonLayout'//项目名称

这个是我的一个项目设置,然后jcenter那边审核成功后,我用浏览器能访问到:

看到没,如果你以com开头,你的访问路径就是https://bintray.com/com。看着是不是超级别扭,作为有强迫症的程序猿,你能容忍?


5.开始上传代码

首先上传的控制台代码是:

gradlew clean build bintrayUpload -PbintrayUser=XXXX -PbintrayKey=XXXXXXXXX -PdryRun=false

这里需要填两个参数:

  • PbintrayUser 登录bintray的用户名
  • PbintrayKey 你的账号密钥,查看方法:

    选择Edit Profile

    左边菜单栏最底部,选择API Key

    输入你的登录密码:

    就可以选择复制了。

现在我们在Android Studio的terminal里面运行那个指令,指令运行期间请保持联网状态,会下载一些组件,时间视你的网速而定,然后不出意外,你可能会遇到一个坑(这个跟你的电脑配置有关,我的电脑是win10 16G内存,所以AS自动分配内存比较大,如果你的内存本来就小,可能不会遇到这个错):

Starting a Gradle Daemon, 2 incompatible Daemons could not be reused, use --status for detailsFAILURE: Build failed with an exception.* What went wrong:
Unable to start the daemon process.
This problem might be caused by incorrect configuration of the daemon.
For example, an unrecognized jvm option is used.
Please refer to the user guide chapter on the daemon at https://docs.gradle.org/4.1/userguide/gradle_daemon.html
Please read the following process output to find out more:
-----------------------
Error occurred during initialization of VM
Could not reserve enough space for 1572864KB object heap* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.* Get more help at https://help.gradle.org

居然说heap太大了。然后查了资料,我们先打开gradle.properties这个文件:

这里的jvmargs参数恰好与报错的数值一致。我们改小点,改成-Xmx512m。(这点很讽刺,因为后面gradle编译的时候又会提示说1536m是最好的)

To run dex in process, the Gradle daemon needs a larger heap.
It currently has 512 MB.
For faster builds, increase the maximum heap size for the Gradle daemon to at least 1536 MB.
To do this set org.gradle.jvmargs=-Xmx1536M in the project gradle.properties.
For more information see https://docs.gradle.org/current/userguide/build_environment.html

然后我们再来试试。


> Task :app:transformDexArchiveWithDexMergerForDebug
Dex: Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Lcom/cjs/widget/demo/bintrayupload/BuildConfig;UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/cjs/widget/demo/bintrayupload/BuildConfig;com.android.dex.DexException: Multiple dex files define Lcom/cjs/widget/demo/bintrayupload/BuildConfig;at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661)at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616)at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598)at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)at com.android.dx.merge.DexMerger.merge(DexMerger.java:198)at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:61)at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:36)at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)FAILURE: Build failed with an exception.* What went wrong:
Execution failed for task ':app:transformDexArchiveWithDexMergerForDebug'.
> com.android.build.api.transform.TransformException: com.android.dex.DexException: Multiple dex files define Lcom/cjs/widget/demo/bintrayupload/BuildConfig;

如果你的app主module和库module的package name是一致的,恭喜你,中奖了,就报了这个错。所以在创建工程的时候我才说两者的名字不要一样。然后我们将二者改成不一样的,再来试试。

> Task :app:lint
Ran lint on variant release: 8 issues found
Ran lint on variant debug: 8 issues found
Wrote HTML report to file:///D:/WorkSpace/AndroidStudio2/BintrayUpload/app/build/reports/lint-results.html
Wrote XML report to file:///D:/WorkSpace/AndroidStudio2/BintrayUpload/app/build/reports/lint-results.xml> Task :bintrayuploadlib:lint
Ran lint on variant release: 4 issues found
Ran lint on variant debug: 4 issues found
Wrote HTML report to file:///D:/WorkSpace/AndroidStudio2/BintrayUpload/bintrayuploadlib/build/reports/lint-results.html
Wrote XML report to file:///D:/WorkSpace/AndroidStudio2/BintrayUpload/bintrayuploadlib/build/reports/lint-results.xml> Task :bintrayuploadlib:releaseAndroidJavadocs
D:\WorkSpace\AndroidStudio2\BintrayUpload\bintrayuploadlib\src\main\java\com\cjs\widget\demo\bintrayuploadlib\Constant.java:6: 错误: 编码GBK的不可映射字符* 浣滆??:闄堜繆妫?^
D:\WorkSpace\AndroidStudio2\BintrayUpload\bintrayuploadlib\src\main\java\com\cjs\widget\demo\bintrayuploadlib\Constant.java:6: 错误: 编码GBK的不可映射字符* 浣滆??:闄堜繆妫?^
D:\WorkSpace\AndroidStudio2\BintrayUpload\bintrayuploadlib\src\main\java\com\cjs\widget\demo\bintrayuploadlib\Constant.java:6: 错误: 编码GBK的不可映射字符* 浣滆??:闄堜繆妫?^
D:\WorkSpace\AndroidStudio2\BintrayUpload\bintrayuploadlib\src\main\java\com\cjs\widget\demo\bintrayuploadlib\Constant.java:7: 错误: 编码GBK的不可映射字符* 鍒涘缓鏃堕棿:2018骞?04鏈?29鏃? 14:43^
D:\WorkSpace\AndroidStudio2\BintrayUpload\bintrayuploadlib\src\main\java\com\cjs\widget\demo\bintrayuploadlib\Constant.java:7: 错误: 编码GBK的不可映射字符* 鍒涘缓鏃堕棿:2018骞?04鏈?29鏃? 14:43^
D:\WorkSpace\AndroidStudio2\BintrayUpload\bintrayuploadlib\src\main\java\com\cjs\widget\demo\bintrayuploadlib\Constant.java:7: 错误: 编码GBK的不可映射字符* 鍒涘缓鏃堕棿:2018骞?04鏈?29鏃? 14:43^
6 个错误FAILURE: Build failed with an exception.* What went wrong:
Execution failed for task ':bintrayuploadlib:releaseAndroidJavadocs'.
> Javadoc generation failed. Generated Javadoc options file (useful for troubleshooting): 'D:\WorkSpace\AndroidStudio2\BintrayUpload\bintrayuploadlib\build\tmp\releaseAndroidJavadocs\javadoc.options'

额,又报错了。这次是字符编码报错。然后就开始在网上找资料,就找到这篇。照着他的说法,我在project级别的gradle加入了:

allprojects {tasks.withType(Javadoc) {options{encoding "UTF-8"charSet 'UTF-8'links "http://docs.oracle.com/javase/7/docs/api"}}
}

额,居然成功了。


> Configure project :app
Observed package id 'build-tools;22.0.0' in inconsistent location 'E:\CodingSoft\android-sdk-v2\build-tools\android-5.1' (Expected 'E:\CodingSoft\android-sdk-v2\build-tools\22.0.0')
Observed package id 'system-images;android-15;default;mips' in inconsistent location 'E:\CodingSoft\android-sdk-v2\system-images\android-15\mips' (Expected 'E:\CodingSoft\android-sdk-v2\system-images\android-15\default\mips')Running dex as a separate process.To run dex in process, the Gradle daemon needs a larger heap.
It currently has 512 MB.
For faster builds, increase the maximum heap size for the Gradle daemon to at least 1536 MB.
To do this set org.gradle.jvmargs=-Xmx1536M in the project gradle.properties.
For more information see https://docs.gradle.org/current/userguide/build_environment.html> Task :app:lint
Ran lint on variant debug: 8 issues found
Ran lint on variant release: 8 issues found
Wrote HTML report to file:///D:/WorkSpace/AndroidStudio2/BintrayUpload/app/build/reports/lint-results.html
Wrote XML report to file:///D:/WorkSpace/AndroidStudio2/BintrayUpload/app/build/reports/lint-results.xml> Task :bintrayuploadlib:lint
Ran lint on variant debug: 4 issues found
Ran lint on variant release: 4 issues found
Wrote HTML report to file:///D:/WorkSpace/AndroidStudio2/BintrayUpload/bintrayuploadlib/build/reports/lint-results.html
Wrote XML report to file:///D:/WorkSpace/AndroidStudio2/BintrayUpload/bintrayuploadlib/build/reports/lint-results.xmlBUILD SUCCESSFUL in 1m 23s
126 actionable tasks: 124 executed, 2 up-to-date

我为什么要说居然呢。因为之前的项目,我加了这句是报了另一个编码错误的。解决办法是添加:

tasks.withType(Javadoc).all {enabled = false}

如果你们遇到了就换成这个吧。这样的话,代码就上传成功了。你可以在bintray查看:

现在,点击一下Add to jCenter填一下描述,就可以等待审核了。审核成功后,你绑定邮箱会收到消息。然后你的bintray会收到类似这样消息:

【填坑之旅】手把手教你如何用AndroidStudio上传自己的library到Jcenter库相关推荐

  1. 手把手教你上手Git并上传项目到GitHub官网

    手把手教你上手Git并上传项目到GitHub官网 Learning Git Branch: 学习 Git 最好的游戏及教程 https://learngitbranching.js.org 这个就是那 ...

  2. 手把手教你用原始方式上传项目至GitHub

    小编GitHub:https://github.com/ds1889 首先你得注册一个自己的GitHub账号,注册网址:https://github.com/join 有了自己的账号以后,就可以进行登 ...

  3. 手把手教你java实现sftp上传文件到linux服务器

    1.首先引入pom文件依赖 <dependency><groupId>com.jcraft</groupId><artifactId>jsch</ ...

  4. React Native填坑之旅--动画篇

    React Native填坑之旅--Button篇 React Native填坑之旅--动画 React Native填坑之旅--HTTP请求篇 动画是提高用户体验不可缺少的一个元素.恰如其分的动画可 ...

  5. 一次动态代理的填坑之旅

    转载自  一次动态代理的填坑之旅 背景 想在现有的接口加上熔断降级或者限流的功能,比较好的方式是通过注解的方式,并基于动态代理进行实现,下面代码是Rhino的实现 @Rhino public clas ...

  6. Jenkins项目实战之-MacOS High Sierra自动化打包方案的填坑之旅

    前面我介绍了如何在android和iOS实现公司内部app的自动化打包构建的过程.这里写一个关于这个app自动化打包平台从想法到实践再到放机房平稳运行的一个回忆录.总的来说,在jenkins上实现an ...

  7. 《Getting Started with D3》填坑之旅(六):第三章(下)

    Chapter 3. Scales, Axes and Lines(比例尺.坐标轴与线) (接上篇:<Getting Started with D3>填坑之旅(五):第三章(上)) 示例2 ...

  8. AppCode Updating indexes一直不停的填坑之旅

    最近在做APP安装包瘦身,找到了传说中的AppCode神器. AppCode 提供了 Inspect Code 来诊断代码,其中含有查找无用代码的功能.它可以帮助我们查找出 AppCode 中无用的类 ...

  9. python远程桌面控制_手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤

    配置说明 使用Pycharm 2020.1.1 professional 专业版.(据说只有专业版可以远程连接)如果不是专业的伙伴,可以用校园邮箱注册一个专业版,免费的哦! 步骤 1. 设置Conne ...

最新文章

  1. jquery中动态效果
  2. 网络工程师技能图谱,这些你都会吗?
  3. MIMIC 以太坊医疗项目开发(3)nodejs安装
  4. 编写你的第一个 Django 应用,第 1 部分
  5. opencv mat数据剪裁感兴趣的部分处理方法
  6. Opencv4找不到CV_FOURCC
  7. 数据库已关闭。请指定主机身份证明以访问数据库重新启动和诊断工具
  8. MemCached存储原理
  9. 软件著作权申请文档模版
  10. 疑难杂症 | Win10解压文件后乱码
  11. php对接腾讯云直播
  12. 2012年全国医院排名(转)
  13. 使用高德开放平台显示指定的坐标点和线
  14. java支付宝转账到银行卡_Java 支付宝支付,退款,单笔转账到支付宝账户(单笔转账到支付宝账户)...
  15. codeforces 894A QAQ
  16. c语言大一,C语言复习 大一.doc
  17. XSS Challenges xss-quiz.int21h.jp
  18. 模拟线上应用cpu100%解决方法
  19. 在职场要避免这些“潜规则”
  20. js 日期 加天数计算

热门文章

  1. PDF阅读器帮你解决文档字体显示难看的问题
  2. linux下安装jdk(rmp方式)
  3. 微信小程序:监听二维码是否被使用,开启全局websocket,在其它页面接收消息
  4. 大数据金融行业企业应用几点思考
  5. TMS320F280049C 学习笔记23 CAN入门
  6. mysql id命名规范_数据库设计规范之命名规范
  7. linux gcc clang,gcc 编译器与 clang 编译器
  8. 上海00后985毕业女生月薪1.2w,想找年薪40万程序员,网友表示很不理解
  9. Python进阶之Scrapy利用ImagesPipeline抓取汽车之家宝马5系缩略图
  10. job vacancy