前言
源码地址: https://github.com/cachecats/LikeMeiTuan
专题的第一篇文章本来想按惯例讲项目介绍, 整体架构, 代码规范之类的. 但今天有点躁动, 不想讲那么正经深奥的东西, 定的最低计划又是周三和周日每周两更, 所以就暂且讲构建项目依赖的小技巧吧. 项目架构稍后会补上~
正文
一, 为什么要把项目依赖抽取单独管理
如果项目比较小, 架构简单只有一个 build.gradle 文件那完全不必将依赖抽离出来, 因为整个系统构建好还是要费一些精力的. 不是一直喊避免过度设计吗?
但是如果按照著名的 Android-CleanArchitecture () 介绍的架构对项目进行分层, 整个项目会有好几个 module .
先贴出 Clean architecture 的架构图感受下~
基于这个分层思想, 我的项目结构是这样的:
项目一共分为四层 common: 整个依赖的最底层, 抽取出其他层共有的代码. 比如 RxJava 的封装, 工具类的封装等. data: 数据层, 网络数据, 数据库中数据处理层. domin: 这层应该是纯 Java 代码, 从 data 层出来的数据要经过 domin 转换一下, UI 层 App 引用的实体都是 domin 层的. 用这种方法来隔离网络和数据库数据变化对代码的影响. App: 应该叫 presentation 表现层, 觉得这名字太长还是 App 看着舒服~ 这层就是正常的 Android 代码.
这里对 Clean architecture 做了一定的修改, 在实践中感觉这样分层开发更顺手. 具体的架构解析及每一层具体该怎么写请关注后面的文章, 以后都会详细讲解.
重回刚才的问题, 为什么要抽取依赖统一管理?
有四个 module 就有四个 build.gradle, 并且依赖很多都是重复的, 分开写在四个不同的文件不利于后期维护升级. 想想如果要更改某个依赖的版本, 得打开四个文件挨个改, 多麻烦. 所以将可变的依赖抽离出来统一管理是很有必要的.
二, 提取方法
下面就是具体的操作方法. 把大象装进冰箱需要几步?
三步走:
1, 创建管理依赖的文件
本项目中在与 App , data 同级的根目录下创建了文件夹 buildsystem, 然后在这个文件夹下创建文件 dependences.gradle. 目录结构如下图:
dependences.gradle 代码:
- ext {
- //Android
- androidBuildToolsVersion = "27.0.3"
- androidMinSdkVersion = 18
- androidTargetSdkVersion = 27
- androidCompileSdkVersion = 27
- //Libraries
- recyclerViewVersion = "27.0.2"
- rxjava2Version = "2.1.8"
- rxandroidVersion = "2.0.1"
- daggerVersion = "2.14.1"
- glideVersion = "4.5.0"
- butterKnifeVersion = "8.8.1"
- bannerVersion = "1.4.10"
- loggerVersion = "2.1.1"
- baseRecyclerViewAdapterHelperVersion = "2.9.30"
- dbflowVersion = "4.2.4"
- App = [
- recyclerView : "com.android.support:recyclerview-v7:${recyclerViewVersion}",
- rxjava : "io.reactivex.rxjava2:rxjava:${rxjava2Version}",
- rxandroid : "io.reactivex.rxjava2:rxandroid:${rxandroidVersion}",
- dagger : "com.google.dagger:dagger:${daggerVersion}",
- daggerCompiler : "com.google.dagger:dagger-compiler:${daggerVersion}",
- glide : "com.github.bumptech.glide:glide:${glideVersion}",
- glideCompiler : "com.github.bumptech.glide:compiler:${glideVersion}",
- buterKnife : "com.jakewharton:butterknife:${butterKnifeVersion}",
- butterKnifeCompiler : "com.jakewharton:butterknife-compiler:${butterKnifeVersion}",
- banner : "com.youth.banner:banner:${bannerVersion}",
- logger : "com.orhanobut:logger:${loggerVersion}",
- baseRecyclerViewAdapterHelper: "com.github.CymChad:BaseRecyclerViewAdapterHelper:${baseRecyclerViewAdapterHelperVersion}",
- dbflowProcessor : "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflowVersion}",
- dbflowCore : "com.github.Raizlabs.DBFlow:dbflow-core:${dbflowVersion}",
- dbflow : "com.github.Raizlabs.DBFlow:dbflow:${dbflowVersion}",
- dbflowRx2 : "com.github.Raizlabs.DBFlow:dbflow-rx2:${dbflowVersion}",
- ]
- }
版本号和具体依赖地址也分开了, 更加便于管理. 其中除了依赖的地址, 所有的变量名都是随便取的. App 对应于项目 module App 里的依赖, 当然还有 data,domin,common 三个 module 的依赖, 声明方式跟 App 一样, 只是我还没用到所以没写.
2, 声明创建的文件
在项目的 build.gradle 第一行加上这行代码: apply from: "buildsystem/dependences.gradle"
声明之后即可在各个 module 中的 build.gradle 中愉快的引用啦.
3, 在具体位置引用
打开 App 下的 build.gradle , 在需要用到的地方先声明一个变量:
def appDependence = rootProject.ext.App
rootProject 是什么意思我还不太明白, 猜测应该是取到项目的根目录. 还记得 dependences.gradle 文件最外层是 ext 节点吗? rootProject.ext 相当于取到了我们提取文件的根节点, rootProject.ext.App 即取到了 App 节点声明的数组. 然后再将它赋值给 appDependence 变量.
接下来就可以放心使用啦
- implementation appDependence.recyclerView
- implementation appDependence.rxjava
贴出 App/build.gradle 代码:
- apply plugin: 'com.android.application'
- Android {
- compileSdkVersion rootProject.ext.androidCompileSdkVersion
- buildToolsVersion rootProject.ext.androidBuildToolsVersion
- defaultConfig {
- applicationId "com.cachecats.meituan"
- minSdkVersion rootProject.ext.androidMinSdkVersion
- targetSdkVersion rootProject.ext.androidTargetSdkVersion
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- lintOptions {
- abortOnError false
- }
- // 支持 Java8 特性
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
- }
- dependencies {
- def appDependence = rootProject.ext.App
- implementation project(':common')
- implementation project(':data')
- implementation project(':domin')
- implementation fileTree(include: ['*.jar'], dir: 'libs')
- implementation 'com.android.support:appcompat-v7:27.0.2'
- implementation 'com.android.support.constraint:constraint-layout:1.0.2'
- testImplementation 'junit:junit:4.12'
- androidTestImplementation 'com.android.support.test:runner:1.0.1'
- androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
- //denpendence
- implementation appDependence.recyclerView
- implementation appDependence.rxjava
- implementation appDependence.rxandroid
- implementation appDependence.dagger
- annotationProcessor appDependence.daggerCompiler
- implementation appDependence.glide
- annotationProcessor appDependence.glideCompiler
- implementation appDependence.buterKnife
- annotationProcessor appDependence.butterKnifeCompiler
- implementation appDependence.banner
- implementation appDependence.logger
- implementation appDependence.baseRecyclerViewAdapterHelper
- implementation appDependence.dbflowCore
- implementation appDependence.dbflowRx2
- implementation appDependence.dbflow
- annotationProcessor appDependence.dbflowProcessor
- }
好啦, 以上就是如何统一管理 Android 项目的 Gradle 依赖. 请忽略配图的分辨率和本地项目地址不一样, 这篇文章是在三台电脑上完成的......
整个项目的源码都在 GitHub 上, 可以随时查看下载. 源码地址: https://github.com/cachecats/LikeMeiTuan 注: 由于项目会一直更新, 后期可能会对之前的代码进行重构. 如发现源码中代码跟文章中不一致, 以源码为准. 重构之后我会尽量及时修改博客中的相关内容, 与源码保持一致.
如果觉得项目不错, 顺手在 GitHub 上点个 star 鼓励一下呗~
来源: https://juejin.im/post/5bdd26a6e51d4505231a3651