网站首页 > 技术文章 正文
前言
从这篇开始带大家一起从零开始撸一个美团Android版App。 【从零撸美团】这个专题将持续更新,用以详细记录分享开发过程,欢迎关注。
正文
一、为什么要把项目依赖抽取单独管理
如果项目比较小,架构简单只有一个 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 依赖。
- 上一篇: 免ROOT!安卓竟自带全量备份恢复:太方便
- 下一篇: 《回炉重造 Java 基础》——集合(容器)
猜你喜欢
- 2024-10-07 免ROOT!安卓竟自带全量备份恢复:太方便
- 2024-10-07 Linux系统安装SDK详细步骤(linux安装android sdk)
- 2024-10-07 Android OOM案例分析(安卓案例代码)
- 2024-10-07 Android组件化入门:一步步搭建组件化架构
- 2024-10-07 Android之NDK开发基础(android sdk开发范例大全)
- 2024-10-07 Jenkins部署Android 自动打包简单实现
- 2024-10-07 flutter 开发报错缺少 cmdline-tools
- 2024-10-07 React Native初探(react. native)
- 2024-10-07 熟悉Android打包编译的流程(android打包v1v2)
- 2024-10-07 Android组件化框架设计与实践(安卓组件化开发 是啥)
- 1512℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 555℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 503℃MySQL service启动脚本浅析(r12笔记第59天)
- 481℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 479℃启用MySQL查询缓存(mysql8.0查询缓存)
- 459℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 439℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 437℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)