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 鼓勵一下唄~

相關文章
相關標籤/搜索