还是那句老话,好记性不然烂笔头,在此整理 Android Studio 依赖相关 以及 如何发布项目到 JCenter

Android Studio 添加依赖
Module 依赖
module 依赖是指在本地创建一个 module,然后如下步骤,依赖此模块。

这样做的好处就是随时可以修改 module。

上图可以看到,Android Studio(以下简称 AS)提供了三种依赖方式。

本地依赖
本地依赖是指,将 jar 或者 aar 直接拷贝到项目的 libs 文件夹下 ,然后对其进行依赖。

jar 的依赖如图一,拷贝进 libs 目录后,AS 才能识别到。
aar 的本地依赖官方没有提供解决方案,不过高手在民间。

在讲解本地 aar 依赖之前,先科普一下 aar 文件。

aar 文件是基于 jar 文件之上开发的。因为有些Android Library 需要植入一些安卓特有的文件,比如 AndroidManifest.xml,资源文件,Assets或者JNI。这些文件在 Jar 中是没有的,因此诞生了 aar 文件。

aar 文件和 jar 一样,只是普通的zip文件。不过具有不同的文件结构。jar文件以classes.jar的名字被嵌入到aar文件中。

aar文件如下:

/AndroidManifest.xml (mandatory)
/classes.jar (mandatory)
/res/ (mandatory)
/R.txt (mandatory)
/assets/ (optional)
/libs/*.jar (optional)
/jni//*.so (optional)
/proguard.txt (optional)
/lint.jar (optional)
在此说明一下,aar 文件的生成只能在 Android Library 中,也就是gradle脚本的声明是apply plugin: 'com.android.library'的 module,然后编译后就会在 build/outputs/aar 文件夹里生成aar文件。

本地 aar 依赖需要在 app 的 build.gradle 文件添加如下内容

repositories {
flatDir {
dirs 'libs' //this way we can find the .aar file in libs folder
}
}

之后再其它项目里面添加 gradle 依赖

dependencies {
compile(name:'dor', ext:'aar')
}

以上就是 aar 的本地依赖。

远程依赖
远程依赖就是在 app 的 build.gradle 中直接添加(当然也可以通过图一搜索的方式)

dependencies {
compile 'com.squareup.picasso:picasso:2.5.2'
}

这样一行代码就完成了依赖,也是最常见的依赖方式。

远程依赖库的来源
我刚开始也不明白AS 是怎样凭借 一行代码得到这些library的。

查阅资料才知道,AS 是从项目 build.gradle 文件里面定义的Maven 仓库服务器上下载library的。

Apache Maven 是 Apache 开发的一个工具,提供了用于贡献library的文件服务器。

总的来说,只有两个标准的 Android library 文件服务器:JCenter 和 Maven Central。

不管是 「JCenter」还是「Maven Central」 ,两者都是Maven 仓库,只是他们维护的服务器不同,由不同的人提供。

JCenter
JCenter 是一个由 bintray.com 维护的Maven仓库 ,整个仓库的内容在 http://jcenter.bintray.com/

在项目的build.gradle 文件中如下定义仓库,就能使用jcenter了

allprojects {
repositories {
jcenter()
}
}

Maven Centra
Maven Central 则是由 sonatype.org 维护的Maven仓库,整个仓库的内容在 https://oss.sonatype.org/content/repositories/releases/

在项目的build.gradle 文件中如下定义仓库,就能使用Maven Central了

allprojects {
repositories {
mavenCentral()
}
}

jcenter 与 Maven Central 的区别
事实上两个仓库都具有相同的使命:提供Java或者Android library服务。上传到哪个(或者都上传)取决于开发者。

起初,Android Studio 选择Maven Central作为默认仓库。如果你使用老版本的Android Studio创建一个新项目,mavenCentral()会自动的定义在build.gradle中。

但是Maven Central的最大问题是对开发者不够友好。上传library异常困难。上传上去的开发者都是某种程度的极客。同时还因为诸如安全方面的其他原因,Android Studio团队决定把默认的仓库替换成jcenter。正如你看到的,一旦使用最新版本的Android Studio创建一个项目,jcenter()自动被定义,而不是mavenCentral()。

以下是使用Jcenter的原因:

jcenter通过 CDN 发送library,开发者可以享受到更快的下载体验。
jcenter是全世界最大的Java仓库,因此在Maven Central 上有的,在jcenter上也极有可能有。
上传library到仓库很简单,不需要像在 Maven Central上做很多复杂的事情。
友好的用户界面
如果你想把library上传到 Maven Central ,你可以在bintray网站上直接点击一个按钮就能实现
基于上述原因,我们发布 Android Library 最好是发布到 Jcenter 上。

Gradle 下载依赖库的原理
在项目的 build.gradle 文件中加入一行代码的时候,这些库是怎样下载到我们的项目中呢?

一般来说,library 的字符串形式,包含3部分

GROUP_ID:ARTIFACT_ID:VERSION

以冒号「:」为分隔

GROUP_ID

library的group,通常以开发者包名 加 library的名称来命名group。

ARTIFACT_ID

library的真实名称

VERSION

library 的版本号

例如Android 界大名鼎鼎的 Square 公司的 Library

dependencies {
compile 'com.squareup:otto:1.3.7'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'
}

添加上述的依赖库后,Gradle 会根据项目的build.gradle 文件中配置的Maven 仓库,询问仓库服务器这个library是否存在,(如果配置了多个仓库,会依次询问这些仓库)如果存在,Gradle 会获得 library 的存储路径,然后 AS 将下载这些文件到我们的电脑上,与我们的项目一起编译。

一般存储路径都是这样的形式:GROUP_ID/ARTIFACT_ID/VERSION_ID。

例如:

Jcenter库的地址:http://jcenter.bintray.com/com/squareup/otto/1.3.7

Maven Central 库的地址:https://oss.sonatype.org/content/repositories/releases/com/squareup/otto/1.3.7/

上传 Library 到 JCenter
我们总是用别人的库,如果自己写一个库分享给别人用,那样不是更酷嘛!

我们可以通过 Gradle 把项目发布到 Maven 库中,至于选 Maven Central 还是 JCenter,通过前面的介绍,当然是选 JCenter 更好。

整个发布过程如下图:

可以看到整个过程还是挺清晰的,但不亲自去试试,就不知道有多少坑!

1.注册 Bintray 并创建私有 Maven 仓库
JCenter 是由 Bintray 维护的 Maven 库,所有首先得去 Bintray 网站注册一个账号。

就是因为注册这一步有个巨坑,害得自己填了好久。

打开 Bintray官网 ,天真的我就直接点了 START YOUR FREE TRIAL ,然后欲哭无泪。

Bintray 官网在2016年底改版了,直接点注册是组织用户,而非个人用户,这将导致最后一直提交失败。

最后只能重新注册新的个人账户。

个人账户注册在首页的底部,要把页面拉下去才看得到。

或者直接点击这个 注册个人账户

后边注册的步骤就很简单了,有 github或者 google 账户的直接登录就行了,如果需要注册这里的邮箱不能是国内的邮箱。

登录上之后,点击右上角的小箭头 Edit Profile —> API Key —> 输入密码 —> 复制 API Key。

这个 API Key 在后面会有用到。

然后创建私有的 Maven 仓库,在个人首页点击 Add New Repository

然后按照下图填写内容

最后点击 Create 创建,这样就创建了仓库。

2. 配置项目
接下来就是配置要发布的项目。

首先是在项目的根目录 build.gradle 中配置如下:

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
//首先添加这两个路径
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7'
}
}

allprojects {
repositories {
jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

//添加下面的配置以便在 module 中引用
ext {
bintrayRepo = 'maven' //仓库名
publishedGroupId = 'com.deemons.dor' //引用时 第一部分
libraryDescription = 'android network'//描述
siteUrl = 'https://github.com/Deemonser/Download'//项目地址
gitUrl = 'https://github.com/Deemonser/Download.git'//gitUrl
developerId = 'deemons'//注册的用户名
developerName = 'deemonser'//开发者名称
developerEmail = 'deemonser@hotmail.com'//开发者邮箱
licenseName = 'The Apache Software License, Version 2.0'
licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
allLicenses = ["Apache-2.0"]
}

//开源库中有中文注释,添加下面这些
allprojects {
tasks.withType(Javadoc) {
options {
encoding "UTF-8"
charSet 'UTF-8'
links "http://docs.oracle.com/javase/7/docs/api"
}
}
}

然后在将要发布的 module 下的 build.gradle 中添加如下配置

//for upload
ext {

publishedGroupId = rootProject.publishedGroupId //引用时的第一部分
artifact = 'dor'//引用时的第二部分
libraryVersion = '0.1.0'//引用时的第三部分
libraryName = 'dor'//本module名称
bintrayName = 'dor'//Jcenter 上显示的项目名

bintrayRepo = rootProject.bintrayRepo
libraryDescription = rootProject.libraryDescription

siteUrl =rootProject.siteUrl
gitUrl = rootProject.gitUrl

developerId = rootProject.developerId
developerName =rootProject.developerName
developerEmail = rootProject.developerEmail

licenseName = rootProject.licenseName
licenseUrl = rootProject.licenseUrl
allLicenses = rootProject.allLicenses
}

apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'

最后,在项目的 local.properties 文件中添加如下配置

bintray.user=YOUR_BINTRAY_USERNAME //填写注册的用户名
bintray.apikey=YOUR_BINTRAY_API_KEY //填写前面获取的 API Key

完成上面三个地方的配置后,就可以通过命令上传项目到 Bintray 。

3.提交项目到 Bintray
分别执行下面两个命令

./gradlew install
./gradlew bintrayUpload

如果两次都没报错,并且看到BUILD SUCCESS,就表示上传成功了。

这时候在自己的 Bintray 上,点击前面创建的 maven 仓库。

可以看到发布上来的 library 了

4.将 Bintray 的项目发布到 JCenter
点击刚刚上传的项目,看到下面的详细信息。

这时候,点击右下角的 Add to JCenter 按钮后,跳转到一个提交页面。

然后什么也不做,直接点击Send。

然后就是漫长的等待Bintrary 的审核,如果请求审核通过,会收到一封邮件。

最后就是测试 一行代码 依赖。

如果成功了,那就大功告成啦~
---------------------
作者:Deemons
来源:CSDN
原文:https://blog.csdn.net/Deemons/article/details/77588327?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

Android Library的依赖方式及发布(转)的更多相关文章

  1. Android Library开发注意事项

    Android Library开发注意事项 App Module添加依赖Android Library时可以设置library的优先级, 在编译时,app按照library从低到高的优先级依次与每个l ...

  2. 使用Jitpack发布自己的Android Library

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/169 使用Jitpack发布自己的Android Libr ...

  3. Android Library 发布开源库 JCenter & JitPack 攻略

    对于Android 的开源库,一般通过 JCenter 或者 JitPack 发布开源.两种方式均可~ 当你造了一个好玩有用的东西想要分享给大家时,开源出来便是一种好方式~ 一. 上传开源库到 JCe ...

  4. android studio 导入外部库文件,以及将项目中module变成library引用依赖

    一:导入如百度地图等的外部类. 步骤:1.首先 将androidstudio项目显示切换到 project 状态显示项目 2.然后添加.jar文件,将所有的.jar文件放入libs文件夹内(libs文 ...

  5. Android Library项目发布到JCenter最简单的配置方法

    前沿 网上的步骤看起来实在太麻烦,gituhb上偶然间看到的一个项目,经过实际验证确实可行.github连接:https://github.com/xiaopansky/android-library ...

  6. 发布 Android Library 到 JCenter 从入门到放弃

    最近想倒腾一个小小的 UIKit 到 JCenter,为开源社区贡献一点绵薄之力,于是就有了一系列惨无人道的踩坑史.好,接下来,直奔主题,以下是发布流程. 发布到 JCenter 发布到 JCente ...

  7. Android Studio Jar、so、library项目依赖

    Eclipse跟AS的不同 从Eclipse到AS不要带着在Eclipse中的主观色彩去在AS中使用,从项目的构成到构建是不同的,下面列举在Eclipse和AS中的一些概念的区别: WorkSpace ...

  8. 【转载】Android Studio jar、so、library项目依赖,原文链接http://zhengxiaopeng.com/2014/12/13/Android-Studio-jar、so、library项目依赖/

    前言 Android Studio(以下简称AS)在13年I/O大会后放出预览版到现在放出的正式版1.0(PS.今天又更新到1.0.1了)历时一年多了,虽然Google官方推出的Android开发者的 ...

  9. Android Gradle 依赖方式

    Android Gradle 依赖方式有以下6种: Compile compile是对所有的build type以及favlors都会参与编译并且打包到最终的apk文件中. Provided Prov ...

随机推荐

  1. iOS开发周报-- 第一期

    从Java转iOS第一个项目总结 http://www.cocoachina.com/ios/20150417/11595.html icon设计探讨:图标,文字,还是图标加文字? http://ww ...

  2. [Linux]环境配置之jdk的安装 标签: jdk服务器linux 2016-08-07 22:18 502人阅读 评论(21)

    这两天服务器崩了,所以需要重新配置环境,然后从头到尾配置了一遍,现在记录总结一下自己这两天的工作,首先是jdk的配置! 很多软件,需要jdk为基础,所以第一个装的就是jdk. 第一步,拷贝文件 首先将 ...

  3. Java练习 SDUT-2670_3-1 Point类的构造函数

    3-1 Point类的构造函数 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 通过本题目的练习可以掌握类的构造函数的定 ...

  4. Java练习 SDUT-1117_求绝对值(选择结构)

    C语言实验--求绝对值(选择结构) Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 从键盘上输入任意一个整数,然后输出它 ...

  5. shell学习(17)- shell中2>&1的解释及输入输出重定向

    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令通常将其输出写入到标准输出,默 ...

  6. js获取当前日期及获取当前日期的前一天日期函数

    function getcurrentdate(){ //获取系统时间var LSTR_ndate=new Date();var LSTR_Year=LSTR_ndate.getFullYear(); ...

  7. 自定义View系列教程08--滑动冲突的产生及其处理

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  8. Python 基础03 序列

    sequence 序列 sequence(序列) 是一组有顺序的元素的集合 (严格的说,是对象的集合,但鉴于我们还没有引入"对象" 概念,暂时说元素) 序列可以包含一个或多个元素, ...

  9. jmeter日期处理beanshell(1)

    import java.time.LocalDate; //昨天: String sdate1 = LocalDate.now().minusDays(1).toString(); vars.put( ...

  10. [kuangbin带你飞]专题九 连通图C - Critical Links UVA - 796

    这道题就是要求桥的个数. 那么桥相应的也有判定的定理: 在和u相邻的节点中,存在一个节点是最小的时间戳都比 当前u的访问次序要大,也就是说这个点是只能通过果u到达,那么 他们之间相邻的边就是的桥 #i ...