從今天開始帶你們一塊兒從零開始擼一個美團Android版App。 【從零擼美團】這個專題將持續更新,用以詳細記錄分享開發過程,歡迎關注。java
源碼地址:github.com/cachecats/L…react
Android從零擼美團(二) - 仿美團下拉刷新自定義動畫android
Android從零擼美團(三) - Android多標籤tab滑動切換 - 自定義View快速實現高度定製封裝git
Android從零擼美團(四) - 美團首頁佈局解析及實現 - Banner+自定義View+SmartRefreshLayout下拉刷新上拉加載更多github
專題的第一篇文章原本想按慣例講項目介紹、總體架構、代碼規範之類的。但今天有點躁動,不想講那麼正經深奧的東西,定的最低計劃又是週三和週日每週兩更,因此就暫且講構建項目依賴的小技巧吧。項目架構稍後會補上~數據庫
若是項目比較小,架構簡單隻有一個 build.gradle
文件那徹底沒必要將依賴抽離出來,由於整個系統構建好仍是要費一些精力的。不是一直喊避免過分設計嗎?數組
可是若是按照著名的 Android-CleanArchitecture
(github.com/android10/A…) 介紹的架構對項目進行分層,整個項目會有好幾個 module
。 bash
先貼出 Clean architecture 的架構圖感覺下~網絡
基於這個分層思想,個人項目結構是這樣的:架構
項目一共分爲四層 common
: 整個依賴的最底層,抽取出其餘層共有的代碼。好比 RxJava的封裝,工具類的封裝等。 data
: 數據層,網絡數據、數據庫中數據處理層。 domin
: 這層應該是純 Java 代碼,從 data
層出來的數據要通過 domin
轉換一下,UI層 app
引用的實體都是 domin
層的。用這種方法來隔離網絡和數據庫數據變化對代碼的影響。 app
: 應該叫 presentation
表現層,以爲這名字太長仍是 app
看着舒服~ 這層就是正常的 Android 代碼。
這裏對 Clean architecture
作了必定的修改,在實踐中感受這樣分層開發更順手。 具體的架構解析及每一層具體該怎麼寫請關注後面的文章,之後都會詳細講解。
重回剛纔的問題,爲何要抽取依賴統一管理?
有四個 module
就有四個 build.gradle
,而且依賴不少都是重複的,分開寫在四個不一樣的文件不利於後期維護升級。 想一想若是要更改某個依賴的版本,得打開四個文件挨個改,多麻煩。 因此將可變的依賴抽離出來統一管理是頗有必要的。
下面就是具體的操做方法。 把大象裝進冰箱須要幾步?
三步走:
本項目中在與 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
同樣,只是我還沒用到因此沒寫。
在項目的 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
鼓勵一下唄~