Android中公共代码仓库与私服的使用

上篇文章 从ARM暂停与华为合作谈起 Android中SO兼容的那些事 中提到了我们是用自己私服上的weex sdk 出的问题继而解决的问题,今天就来介绍下我们的私服, 并手把手教会你怎么创建并使用私服.

背景

随着公司业务发展,项目越来越大,项目有好几个,项目虽然具体业务不同,但是其中也有很多相同的功能, 比如都有 weex 需求,网络请求、 图片处理、视频处理等等共同的需求,如果每个项目都重新写一遍,实现一遍,势必影响进度,重复造轮子的问题,项目进展缓慢,所以 就需要一种方式来避免这种重复劳动,彻底解决这种问题。

解决办法 : 使用组件化的思想, 把公共的组件抽离出来,和主项目的关系是依赖主项目的关系。module 是以 library的形式存在于整个project 中,依赖于主工程。在需要使用的时候,引入即可。
类似我们使用 recyclerview butterknife 之类的这些的功能, 这些内容有的是 Android官方提供的支持,有的是国内外优秀开发者开源出来的控件,我们可以很方便的集成到项目中。如下图:

仓库1.png

知名仓库介绍

目前有 jcenter() ,mavenCentral(), google() 等等仓库中心,这些仓库是用来保存代码的,组织或者个人开发者 开源出很多优秀的代码,工具,控件,上传到这些仓库中,我们可以通过 在 gradle 中配置相应的仓库地址 ,就可以方便使用相应的代码,

而内部使用的组件,不适合开源的可以自己搭建 私有仓库,内网使用,
还有一些需要借助代理访问,国内访问起来特别慢或者无法访问的内容,也可以上传到我们的私服上,能够很好地提高效率,减少同步等待时间
类似下图 我们在其中一个项目中使用的 仓库地址:

仓库2.png

我们通过在 gradle 中配置相应的依赖,项目在 build 完成后就会将相应的 依赖工程代码 下载到 项目中, 可以在project 模式下 查看 External Libraries 看到实际下载下来的代码。

仓库3.png

下面分别介绍下 这几个仓库,和私有仓库的搭建

jcenter

网页地址 http://jcenter.bintray.com/

mavenCentral

网页地址http://central.maven.org/maven2/

google

网页地址 https://dl.google.com/dl/android/maven2/

其他仓库

以阿里云为例
网页地址 http://maven.aliyun.com/nexus/content/repositories/jcenter/

上图中已经展示了 在项目中的配置这些仓库的方式。

这些仓库又有什么区别呢?

maven中央仓库http://repo1.maven.org/maven2/)是由Sonatype公司提供的服务,它是Apache Maven、SBT和其他构建系统的默认仓库,并能很容易被Apache Ant/Ivy、Gradle和其他工具所使用。开源组织例如Apache软件基金会、Eclipse基金会、JBoss和很多个人开源项目都将构件发布到中央仓库。 maven中央仓库已经将内容浏览功能禁掉了。

jcenter仓库https://jcenter.bintray.com )是由JFrog公司提供的Bintray中的Java仓库。它是当前世界上最大的Java和Android开源软件构件仓库。 所有内容都通过内容分发网络(CDN)使用加密https连接获取。JCenter是Goovy Grape内的默认仓库,Gradle内建支持(jcenter()仓库),非常易于在(可能除了Maven之外的)其他构建工具内进行配置。

JCenter相比mavenCenter构件更多,性能也更好。但还是有些构件仅存在mavenCenter中。

google()存储库是Google maven资源库的快捷方式。 它是在Gradle 4.x +中引入的。 使用的实际存储库URL是“https://dl.google.com/dl/android/maven2/”, 也可以使用 maven { url ‘https://maven.google.com' }
但是 google(),则需要Gradle 4.x +,Android Studio 3.x +和Android 3.x +的Gradle插件。

maven (阿里云) maven.aliyun.com代理了很多公共的maven仓库。使用maven.aliyun.com中的仓库地址作为下载源,速度更快更稳定。
https://maven.aliyun.com/repository/public 是 central仓和jcenter仓的聚合仓 经过测试发现,可以代替 central 和 jcenter ,把阿里云的这个放到第一位会加快同步速度。

仓库4.png

阿里云除了代理了 mavenCentral, jcenter还有 上面的 google() 基本上主流的 仓库都有, 在国内这个网络环境下, 使用阿里云的代理仓库是一个挺好的选择.

什么是Maven?

Maven 是一个项目管理和自动构建工具。是一个软件(特别是Java软件)项目管理以及自动构建工具,由Apache软件基金会所提供。是基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
Maven也可以被利用与构建和管理各种项目,例如:C#、Ruby、Scala和其他语言编写的项目。
Maven项目使用项目对象模型(Project Object Modle,POM)来配置项目,对象模型存储在名为pom.xm的文件中。

什么是Gradle?

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy(DSL语言,所谓的DSL是指这个语言应用在特定的领域,而类似Java这样是DCL语言,可以运用在普通的各个领域),而不是传统的xml语言,build脚本使用Groovy编写。当前支持的语言仅限于Java、Groovy、Scala、Kotlin。计划未来支持更多的语言。
Gradle改良了过去Maven、Ant带给开发者的问题,也已经成为Android Studio内置封装部署工具

Android支持的Maven仓库:

  • 1.mavenCentral 是最早的 maven 中央仓库
  • 2.jcenter 是 Android Studio 0.8 版本起的默认 maven 中央仓库
  • 3.本机的仓库
  • 4.部署在内网服务器的私有仓库

上面也说了,我们可以把自己写的优秀代码共享到这些代码仓库中供全世界 开发者使用,但是由于公司的项目很多不能公开,只可在公司范围使用,又需要在不同项目中可以方便接入,在后续功能修改时 又能通过版本控制 使用修改前后的功能均可正常使用, 这个时候可以 搭建私有 maven 仓库,部署我们的公共组件代码,就可以方便使用了。

使用Nexus搭建 maven 私服

下面演示在window上的安装过程

1.下载Nexus

下载地址:http://www.sonatype.com/download-oss-sonatype
仓库5.png

2.解压zip文件,配置nexus下bin目录全局变量

仓库6.png

然后打开我的电脑->属性->高级系统设置->高级->环境变量

在path 中配置 上面的bin 文件夹的路径进去 F:\Downloads\nexus-3.16.1-02-win64\nexus-3.16.1-02\bin

3.安装nexus服务,

以管理员身份运行 cmd 进入 上面bin的文件夹下, 运行nexus.exe/install Nexus Service命令
查看服务里就能看到

仓库7.png

4.启动服务,

启动这个服务,稍等一会时间,在浏览器中访问 http://localhost:8081/。就能够看到这个页面

仓库8.png

默认的用户名和密码登录(admin/admin123) 目前为止 服务搭建成功。

仓库的详细配置过程,请移步到官方网站
http://books.sonatype.com/nexus-book/reference3/admin.html#admin-repositories

下面来看怎么使用的问题;

上传 aar 到我们搭建的私服上 步骤

1. Nexus创建自己的仓库

访问:http://localhost:8081/nexus,
先创建一个你要上传的仓库信息:

仓库9.png

点击create repository

仓库10.png

仓库11.png

name那输入你想创建的名称,如 younger
然后点创建,就可以看到了自己的仓库 http://10.1.1.147:8081/repository/younger/ (此ip为我自己电脑局域网ip)

2. Android Studio 配置

新建一个module,这个module就是你要编译的aar
module下gradle配置如下,
添加代码:
apply plugin:’maven’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
uploadArchives {
configuration = configurations.archives
repositories {
mavenDeployer {
repository(url: 'http://10.1.1.147:8081/repository/younger/') {
authentication(userName: 'admin', password: 'admin123')
}
pom.project {
version '0.0.1'
artifactId 'testmaven'
groupId 'demo.younger.com'
packaging 'aar'
description 'update version 0.0.1'
}
}
}
}

groupId,version要注意填好。
然后,在Gradle projects列表中可以看到upload的Task
点击后即可编译上传,success后就可以了。

仓库12.png

仓库13.png

可以看到编译成功 ,在Nexus后台可以看到:
仓库14.png

3. Android Studio 中引用

//添加仓库
在根gradle 中添加

1
2
3
4
5
6
7
8
9
10
11
allprojects {
repositories {
google()
jcenter()
//新增
maven {
url 'http://10.1.1.147:8081/repository/younger/'
}

}
}

在项目的gradle 中使用

1
implementation 'demo.younger.com:testmaven:0.0.1'

就可以正常引用了, 可以看到上面的顺序是 groupId :artifactId: version

也可以在 External Libraries 查看到

仓库15.png

项目中也可以引用啦

目前项目中weex就是采用这种方式, 搭建一个nexus 私服,把weex 官方的sdk 下载下来,我们根据项目需要,自行实现很多不同的功能,
而这些功能在不同的项目都可以用到,就统一放到私服上,在我们具体的项目中,只需要简单设置,就可以非常方便的使用这些功能,
如果新增了什么功能,可以直接把代码上传到公共组件中,升级版本, 项目中用的时候只需要改成相应的版本号就可以方便使用到最新的功能。

总结

可以发现,创建私服,上传aar文件, 引用都非常简单, 具体有没有必要使用还是需要根据自身实际情况来看,那些公共仓库上的内容可以优先使用阿里云的代理仓库,这样会加快同步速度,自己内部使用或者比较特殊的内容就可以放到私服上了,同样是特别方便。

请联系我!