Android从零撸美团(一) - 统一管理 Gradle 依赖 提取到单独文件中

前言

从今天开始带你们一块儿从零开始撸一个美团Android版App。 【从零撸美团】这个专题将持续更新,用以详细记录分享开发过程,欢迎关注。java

源码地址:github.com/cachecats/L…react

Android从零撸美团(二) - 仿美团下拉刷新自定义动画android

Android从零撸美团(三) - Android多标签tab滑动切换 - 自定义View快速实现高度定制封装git

Android从零撸美团(四) - 美团首页布局解析及实现 - Banner+自定义View+SmartRefreshLayout下拉刷新上拉加载更多github


专题的第一篇文章原本想按惯例讲项目介绍、总体架构、代码规范之类的。但今天有点躁动,不想讲那么正经深奥的东西,定的最低计划又是周三和周日每周两更,因此就暂且讲构建项目依赖的小技巧吧。项目架构稍后会补上~数据库

正文

1、为何要把项目依赖抽取单独管理

若是项目比较小,架构简单只有一个 build.gradle 文件那彻底没必要将依赖抽离出来,由于整个系统构建好仍是要费一些精力的。不是一直喊避免过分设计吗?数组

可是若是按照著名的 Android-CleanArchitecture (github.com/android10/A…) 介绍的架构对项目进行分层,整个项目会有好几个 modulebash

在这里插入图片描述

先贴出 Clean architecture 的架构图感觉下~网络

基于这个分层思想,个人项目结构是这样的:架构

在这里插入图片描述

项目一共分为四层 common: 整个依赖的最底层,抽取出其余层共有的代码。好比 RxJava的封装,工具类的封装等。 data: 数据层,网络数据、数据库中数据处理层。 domin: 这层应该是纯 Java 代码,从 data 层出来的数据要通过 domin 转换一下,UI层 app 引用的实体都是 domin 层的。用这种方法来隔离网络和数据库数据变化对代码的影响。 app: 应该叫 presentation 表现层,以为这名字太长仍是 app 看着舒服~ 这层就是正常的 Android 代码。

这里对 Clean architecture 作了必定的修改,在实践中感受这样分层开发更顺手。 具体的架构解析及每一层具体该怎么写请关注后面的文章,之后都会详细讲解。

重回刚才的问题,为何要抽取依赖统一管理?

有四个 module 就有四个 build.gradle,而且依赖不少都是重复的,分开写在四个不一样的文件不利于后期维护升级。 想一想若是要更改某个依赖的版本,得打开四个文件挨个改,多麻烦。 因此将可变的依赖抽离出来统一管理是颇有必要的。

2、提取方法

下面就是具体的操做方法。 把大象装进冰箱须要几步?

三步走:

一、建立管理依赖的文件

本项目中在与 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 里的依赖,固然还有 datadomincommon 三个 module 的依赖,声明方式跟 app 同样,只是我还没用到因此没写。

二、声明建立的文件

在项目的 build.gradle 第一行加上这行代码: apply from: "buildsystem/dependences.gradle"

在这里插入图片描述

声明以后便可在各个 module 中的 build.gradle 中愉快的引用啦。

三、在具体位置引用

打开 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 上,能够随时查看下载。 源码地址:github.com/cachecats/L… 注:因为项目会一直更新,后期可能会对以前的代码进行重构。如发现源码中代码跟文章中不一致,以源码为准。重构以后我会尽可能及时修改博客中的相关内容,与源码保持一致。

若是以为项目不错, 顺手在 Github 上点个 star 鼓励一下呗~

相关文章
相关标签/搜索