在实际的android项目开发过程中,我们一般都会用一些现有的第三方库来实现我们的需求,避免重复造轮子。普遍使用到的,例如:网络请求库、图片处理库、界面UI库(自定义View、动画效果等)、各种第三方SDK库(聊天、推送等)。笔者早期接触android使用eclipse开发时,当时对这些库的管理方式为:如果能jar包,则将jar包拷贝到libs目录下;还有一些源码库,则以library的方式倒入到工程中,调试、 修改、编译、发布。早期的这种库管理方式存在的一个严重问题是:无法自动跟踪版本、不能自动同步library的更新。现在一般都使用android studio,结合git,maven来开发android项目。本文通过一些实际场景,对as + git + maven的工作方式、流程进行简单介绍,相信看完后,读者会对android项目中包管理机制有一个总体上清晰的认识。
1 发现githuab上有个好用的库,该如何使用?
直接按照文档提示,在build.gradle中添加依赖即可。背后到底发生了什么,使我们只需要加一句话,就能使用库?
通过Android studio创建默认项目后,在项目根目录下的build.gradle中有一段代码:
allprojects { repositories { jcenter() } }
这段代码,相当于告诉gradle,如果碰到依赖的库需要下载,去jcenter找。jcenter又是什么,他相当于一个所有公开的库的集合(仓库)。jcenter中的库,以maven包的方式来管理。其实背后的事情是:github中库的作者自己生成了一份代码对应的maven包,并且将maven包上传到了jcenter仓库中,所以gradle最后才能从jcenter中下载到maven包。本文不对jcenter进行详细介绍,只需要知道他是一个存放library(库)的repository(仓库)即可。
2 项目进行一段时候后,代码会变大庞大臃肿,这时候,可以将一些相对独立、复用性高的模块独立出来封装成一个库,简化项目逻辑代码。假设我们将一个模块独立了出来做成了library。这个library不光我自己使用,其它的开发者也要使用,怎么做呢,肯定不能把代码拷贝一份。这时候,我们可以用gradle的maven插件,将library打包成一个maven包。其它开发者可以只拷贝maven包,而不用拷贝源代码。Android studio项目,如何使用本地的maven包?只要能告诉gradle遇到依赖库的时候,去某个路径下找即可。方法是,在module的build.gradle中配置:
repositories { maven { url "file:///path/to/maven" } }
最后在dependencies中添加compile依赖即可。
3 让每个开发者每次都拷贝一份maven包,也不科学。如何改进?项目代码,我们一般用git来进行管理。同理,library生成的maven包,我们同样可以用git来管理。主项目通过git submodule的方式来管理library生成的maven包的git仓库。这样以来,工作流程是:
库的修改者:
- 在本地修改library,调试通过后,提交代码到git
- 通过gradle maven 插件,生成maven包,将maven包提交到另外一个git仓库(管理maven包的仓库)
库的使用者:
- 通过git submodule update,更新submodule git仓库(管理maven包的仓库)
- 根据maven包中的groupId、artifactId、version信息,修改build.gradle中的dependencies依赖
- gradle同步完成后,即可使用最新的库代码来开发主项目
- 开发完后,想主项目的git仓库提交代码
4 如果library没有隐私可以公开,那我们可以像github上的一些库一样,生成maven包后,将maven包发布到jcenter/maven。这样一来,就只需要在主项目module的build.gradle中配置dependencies compile依赖即可。
总结:
- android项目中依赖的库,本质上是maven包
- maven包可以放在公开的jcenter仓库中,也可以放在本地,或者其它某个服务器上
- 如果是在jcenter中,我们无需配置仓库地址,项目根目录下默认生成的build.gradle已经帮我们配置好了
- 如果是在其它地方,本地目录,或者其它某个服务器上,需要在build.gradle中用repositories来配置仓库的具体路径,这样,当我们在dependencies compile配置了依赖库的时候,gradle才知道从哪里去下载。