天天看點

(周期計劃-4)從公司項目配置看Gradle寫在前面開始深入1.0尾聲

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

這是一個主推面試踩坑的公衆号!

因為身邊的同學從事網際網路相關職業的比較多,并且大家閑時聊天時總會吐槽找工作有很多坑,是以打算把身邊同學找工作的經驗,統統收集起來。提供給想從事這方面同學,希望圈内好友可以共同進步,共同少踩坑。
(周期計劃-4)從公司項目配置看Gradle寫在前面開始深入1.0尾聲

個人公衆号

繼續閱讀