2018年技術周期計劃:周期計劃-4(2018/1/21-2018/1/28)
寫在前面
不知不覺自己已經在北京呆了半年的時間,自己所在的實習公司也已經工作了四個月的時間。時間真的好快,自己馬上就要失去學生這個身份了...
這次周期計劃是關于Gradle的内容,為什麼有這個計劃,是因為這段時間公司把項目整體更新到了3.0,借用更新的計劃,Leader增加了很多的配置資訊以及Gradle,讓這個項目的依賴管理更有條理性。
是以基于這個背景就有了這篇部落格的想法。
開始
首先讓我們簡單捋一捋Gradle在項目中出現的關系。我們安卓項目使用的gradle檔案,本質上使用的是gradle中android安卓插件。
比如說:classpath 'com.android.tools.build:gradle:3.0.1'
看名字我們就能明白它是關于android的插件,而它所依賴的才是真生的gradle,我們可以在同級的gradle-wrapper檔案中看到它的路徑,預設是一個https連結位址,是以會涉及到下載下傳問題,是以大家懂得...我們可以自行下載下傳,然後連結一下本地位址....
接下來讓看一下我們常見的配置,也就是預設生成的gradle腳本内容。
項目根Gradle:
buildscript {
repositories {
//使用jCenter存儲庫
jcenter()
}
dependencies {
//使用3.0.0版Gradle的Android插件的庫(隻影響運作建構的代碼,而不影響項目)
classpath 'com.android.tools.build:gradle:3.0.0'
}
}
根目錄下的gradle是一些外層的内容,對我們編寫安卓代碼本身沒有過多的直接牽扯。
這裡順帶提一下,和項目gradle同級别下有一個local.properties檔案。它裡邊記錄了我們的SDK,NDK路徑。它和我們通過設定ANDROID_HOME的環境變量添加SDK的方式沒有任何差別。
Module的Gradle:
按照官方的話說:預設情況下,隻需要編譯目标和編譯工具的版本。也就是說android{}标簽下,我們隻需要compileSdkVersion 和 buildtoolsVersion 屬性即可(3.0之後預設生成的gradle檔案沒有看到buildtoolsVersion,猜測預設使用最新版本)...
當然,預設會幫我們生成很多内容。接下來讓我們逐一了解一下。
//項目類型(最常見還有庫類型:apply plugin: 'com.android.library')
apply plugin: 'com.android.application'
android {
//SDK的版本号(API Level),比如:API-19之類
compileSdkVersion 26(編譯app時候用的sdk,并不會影響app真實行為)
//buildtoolsVersion:(建構工具的版本,其中包括了打包工具aapt等内容)
defaultConfig {
applicationId "com.example.mbenben.gradletest"(包名)
minSdkVersion 15(最小支援安卓系統版本)
targetSdkVersion 26(系統版本會根據此進行對應的處理,比如6.0我們知道需要動态申請權限,低于6.0則不需要。)
versionCode 1(App的版本,每次發版都要+1)
versionName "1.0"(App的版本)
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
//定制release版本内容
release {
//是否啟動混淆
minifyEnabled false
//混淆檔案
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
android部分以外就是我們的依賴:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
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'
}
如果我們需要什麼依賴找到對應的依賴位址即可,我們的gradle會自動去jcenter()庫,去下載下傳,當然有時我們所依賴的庫需要其他代碼庫,我們隻需要按需在項目gradle中repositories對應添加即可。
以上是一些基礎gradle的内部,如果有更多的需要可以在這個網站深入了解: http://tools.android.com/tech-docs/new-build-system/user-guide
深入1.0
公司關于gradle的配置檔案進行過差不多倆次的疊代,第一次較為普通,我在此稱為1.0時代。
2.0時代變動的内容比較多,是以關于2.0的内容,為了避免篇幅過長,會把它單抽出來。
接下來的内容是關于公司的1.0時代的gradle配置思路。
首先
公司的項目第一步會建立一個自己的gradle檔案用于存放公司的配置資訊。比如:根gradle同級下,定義dependencies.gradle
ext {
compileSdkVersion = 26
buildToolsVersion = "26.0.2"
targetSdkVersion = 22
minSdkVersion = 19
supportLibraryVersion = '25.3.1'
//當然還可以定義一些依賴庫的配置
dependencies = [
appCompat : "com.android.support:appcompat-v7:$supportLibraryVersion",
cardView : "com.android.support:cardview-v7:$supportLibraryVersion",
recyclerView : "com.android.support:recyclerview-v7:$supportLibraryVersion",
design : "com.android.support:design:$supportLibraryVersion",
rxAndroid : 'io.reactivex:rxandroid:1.2.1',
rxJava : 'io.reactivex:rxjava:1.2.1',
//省略部分内容
}
非常清晰的我們可以看到,我們正常項目中所常用的配置資訊的版本号。
那麼這個檔案怎麼使用呢?
在根gradle中引入它:apply from: 'dependencies.gradle'
那麼這樣我們就可以在項目gradle中通過ext得到我們所聲明的内容:
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "對應自己的包名"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
//省略部分内容
}
dependencies {
//省略部分内容
Map<String, String> dependencies = rootProject.ext.dependencies
compile dependencies.appCompat
compile dependencies.cardView
compile dependencies.recyclerView
compile dependencies.design
compile dependencies.palette
compile dependencies.rxAndroid
compile dependencies.rxJava
}
通過這種方式,可以比較快捷的去修改/檢視自己的項目/庫配置資訊。友善統一的去管理。
在1.0時代,除了對項目配置資訊管理以外還講版本内容抽取了出來。比如:我們會在主項目的根目錄下建立version.properties檔案,内容非常簡單,隻用來記錄我們的版本資訊:
VERSION_NAME=1.0.1
VERSION_CODE=2
接下來我們需要做的就是去擷取這倆個變量
//定義一個用于擷取VersionCode的方法
def getVersionCodeProperty() {
//因為是同級目錄,直接通過檔案名,拿到檔案對象
def versionPropsFile = file('version.properties')
def versionProps = new Properties()
//裝載檔案對象
versionProps.load(versionPropsFile.newReader())
//擷取變量名
return versionProps.getProperty('VERSION_CODE').toInteger()
}
def getVersionNameProperty() {
def versionPropsFile = file('version.properties')
def versionProps = new Properties()
versionProps.load(versionPropsFile.newReader())
return versionProps.getProperty('VERSION_NAME')
}
//使用
android{
//省略部分内容
versionCode getVersionCodeProperty()
versionName getVersionNameProperty()
//省略部分内容
}
這樣我們在修改版本号的時候可以避免重複同步gradle的過程,而且也可以友善我們去管理版本号這種東西。
尾聲
關于gradle的一些了解就先記錄這樣。這次部落格内容将是關于公司2.0的配置資訊更新,以及一些gradle的一些快捷的用法。
本菜開源的一個自己寫的Demo,希望能給Androider們有所幫助,水準有限,見諒見諒…
https://github.com/zhiaixinyang/PersonalCollect這是一個主推面試踩坑的公衆号!
因為身邊的同學從事網際網路相關職業的比較多,并且大家閑時聊天時總會吐槽找工作有很多坑,是以打算把身邊同學找工作的經驗,統統收集起來。提供給想從事這方面同學,希望圈内好友可以共同進步,共同少踩坑。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYjZ5UTO0YjM4MmYjNTN0cTNyYDOmNjZ4E2MihDO3kDOfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
個人公衆号