但是如果按照著名的 Android-CleanArchitecture (github.com/android10/A…) 介绍的架构对项目进行分层,整个项目会有好几个 module 。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJZ86GRW-1638078773628)(https://user-gold-cdn.xitu.io/2018/11/3/166d7deec392e066?imageView2/0/w/1280/h/960/ignore-error/1)]
先贴出 Clean architecture 的架构图感受下~
基于这个分层思想,我的项目结构是这样的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3dCtbLS-1638078773659)(https://user-gold-cdn.xitu.io/2018/11/3/166d7deec3bf9e4c?imageView2/0/w/1280/h/960/ignore-error/1)]
项目一共分为四层 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。目录结构如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mghLIsc5-1638078773660)(https://user-gold-cdn.xitu.io/2018/11/3/166d7deec3a39916?imageView2/0/w/1280/h/960/ignore-error/1)]
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:r e c y c l e r V i e w V e r s i o n " , r x j a v a : " i o . r e a c t i v e x . r x j a v a 2 : r x j a v a : {recyclerViewVersion}", rxjava : "io.reactivex.rxjava2:rxjava:recyclerViewVersion",rxjava:"io.reactivex.rxjava2:rxjava:{rxjava2Version}”,
rxandroid : “io.reactivex.rxjava2:rxandroid:r x a n d r o i d V e r s i o n " , d a g g e r : " c o m . g o o g l e . d a g g e r : d a g g e r : {rxandroidVersion}", dagger : "com.google.dagger:dagger:rxandroidVersion",dagger:"com.google.dagger:dagger:{daggerVersion}”,
daggerCompiler : “com.google.dagger:dagger-compiler:d a g g e r V e r s i o n " , g l i d e : " c o m . g i t h u b . b u m p t e c h . g l i d e : g l i d e : {daggerVersion}", glide : "com.github.bumptech.glide:glide:daggerVersion",glide:"com.github.bumptech.glide:glide:{glideVersion}”,
glideCompiler : “com.github.bumptech.glide:compiler:${glideVersion}”,
buterKnife
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
: "com.jakewharton:butterknife:${butterKnifeVersion}",
butterKnifeCompiler : “com.jakewharton:butterknife-compiler:b u t t e r K n i f e V e r s i o n " , b a n n e r : " c o m . y o u t h . b a n n e r : b a n n e r : {butterKnifeVersion}", banner : "com.youth.banner:banner:butterKnifeVersion",banner:"com.youth.banner:banner:{bannerVersion}”,
logger : “com.orhanobut:logger:l o g g e r V e r s i o n " , b a s e R e c y c l e r V i e w A d a p t e r H e l p e r : " c o m . g i t h u b . C y m C h a d : B a s e R e c y c l e r V i e w A d a p t e r H e l p e r : {loggerVersion}", baseRecyclerViewAdapterHelper: "com.github.CymChad:BaseRecyclerViewAdapterHelper:loggerVersion",baseRecyclerViewAdapterHelper:"com.github.CymChad:BaseRecyclerViewAdapterHelper:{baseRecyclerViewAdapterHelperVersion}”,
dbflowProcessor : “com.github.Raizlabs.DBFlow:dbflow-processor:d b f l o w V e r s i o n " , d b f l o w C o r e : " c o m . g i t h u b . R a i z l a b s . D B F l o w : d b f l o w − c o r e : {dbflowVersion}", dbflowCore : "com.github.Raizlabs.DBFlow:dbflow-core:dbflowVersion",dbflowCore:"com.github.Raizlabs.DBFlow:dbflow−core:{dbflowVersion}”,
dbflow : “com.github.Raizlabs.DBFlow:dbflow:d b f l o w V e r s i o n " , d b f l o w R x 2 : " c o m . g i t h u b . R a i z l a b s . D B F l o w : d b f l o w − r x 2 : {dbflowVersion}", dbflowRx2 : "com.github.Raizlabs.DBFlow:dbflow-rx2: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"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yv5Ftb5P-1638078773661)(https://user-gold-cdn.xitu.io/2018/11/3/166d7deec3c3dafb?imageView2/0/w/1280/h/960/ignore-error/1)]
声明之后即可在各个 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 {
支持Java8特性
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {