1. 程式人生 > >Gradle之android配置

Gradle之android配置

相信現在已經很少有公司android開發還用著Eclipse了吧,絕大部分都已經跟上潮流換上了Android Studio,AS預設使用Gradle作為專案構建工具。Gradle非常強大,可以方便我們做很多事情,例如:
(1)方便我們複用程式碼和資源
(2)方便我們使用相同的程式碼和資源構建出不同的應用
(3)方便我們配置專案構建流程,甚至是加入自定義邏輯
預設情況下build.gradle是這個樣子的:

apply plugin: 'com.android.application'

buildscript {
    repositories { 
        jcenter()
    }
dependencies { classpath 'com.android.tools.build:gradle:1.3.1' } } android { compileSdkVersion 23 buildToolsVersion "23.1.0" }

apply plugin

apply plugin宣告外掛,其實可以理解為gradle構建的專案型別。android常用的有:

  • com.android.application:表示構建android應用,即最終build輸出apk
  • com.android.library:表示構建一個android庫,最終輸出aar格式檔案

當專案業務越來越多,越來越繁雜時後,為了提高開發效率,通常會對project按業務拆分,單獨業務拆分為一個子庫,或者底層通用框架和工具拆分為單獨的子庫,最終利用一個空專案作為殼,將其他子庫直接或者間接依賴進來打包成apk。這裡,殼的build.gradle就得宣告為’com.android.application’,而其他子庫均以aar形式依賴進來,也就是說其他子庫的build.gradle都是apply plugin: ‘com.android.library’。如果想要生成可安裝的apk檔案,必須得執行殼gradle的build task才行。

buildscript

buildscript中主要宣告gradle工具build時自身需要的配置,而不是程式碼編譯的配置,通常包括依賴倉庫repositories以及具體的依賴dependencies。repositories既可以是遠端倉庫,也可以配置本地的倉庫。

allprojects、subprojects

不同於buildscript,allprojects是對當前工程及其子工程進行配置,subproject是對當前工程所有子工程進行配置,通常配置專案依賴的所在倉庫,可以為多個。

dependencies

配置專案具體的依賴,可以是倉庫中的第三方庫也可以是本地android library原始碼,還可以是本地jar包等。例如:

dependencies {
    compile "com.android.support:recyclerview-v7:23.0.0"
    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':libraries:lib2')
}

另外,在配置dependencies時也可以根據build type、product flavor或者build variant對具體的build型別進行依賴配置。例如上面程式碼中的releaseCompile和debugCompile分別只對release和debug型別build有效。

android

顧名思義,android{}是用來配置android編譯階段引數的,其中compileSdkVersion和buildtoolsVersion是必須配置的,其他常用的還有以下配置:

  • defaultConfig

應用的預設配置,包括應用的唯一標識,可安裝應用的系統最小版本以及目標(最佳)版本,應用版本號等資訊。

defaultConfig {
    applicationId 'com.sky.v1'
    minSdkVersion 15
    targetSdkVersion 23
    multiDexEnabled true  // 開啟multidex
    versionCode 985
    versionName 9.8.5
    buildConfigField "boolean", "IS_FREE", "true"  //自定義配置欄位
}

需要注意的是,applicationId會覆蓋manifest裡設定的packagename成為應用的唯一標識。另外,使用buildConfigField也可以自定義配置欄位,gradle build完成後會生成BuildConfig class,自定義欄位會被新增到其中。根據自定義配置欄位值,我們在程式碼中就可以作不同邏輯處理。BuildConfig預設提供了一些配置欄位,如下所示:

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.sky.v1";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = -1;
  public static final String VERSION_NAME = "";

  public static final boolean IS_FREE = true;
}
  • buildTypes

buildTypes宣告gradle build的型別。預設情況下,包含release和debug兩種配置,即可以build出應用的release版本和debug版本。針對release和debug版本,我們可以進行不同的配置,從而達到想要的效果。例如,proguard混淆,通常release版本才需要程式碼混淆,debug版本為了方便除錯關閉混淆。當然,我們也可以自定義build型別。

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }

    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}
  • productFlavors

和buildTypes有點類似,productFlavors也可以實現build出不同型別的apk。當專案需要打包不同版本(渠道)的apk,但是每個apk之間差別很小的時候,可以通過productFlavors來配置,gradle會對每一個配置的flavor分別打包,這樣就不需要我們手動修改程式碼或者資源重新build。例如,針對不同應用市場釋出android版本,可能使用不同的資源、sdk等,這時就可以使用productFlavors來解決問題。每個flavor可配置欄位和defaultConfig一致。

productFlavors {
    common {
    }
    qihoo {
    }
    yingyongbao {
    }
    meizu {
    }
}

Build Variant

gradle在build時是根據buildTypes和productFlavors的配置共同決定的,我們可以這麼理解:build variant = (flavor, build type)。也就是說,按照上面的例子,總共有2*4,即8種build variant,commonRelease,commonDebug,qihooRelease等。理解build variant很重要,我們可以看到gradle tasks中有很多task名字都包含build variant。

Tasks

gradle所有的工作都是由一個個task組成的,根據上面的截圖可以看出主要包括assemble、check、build、clean等task。

  • assemble 編譯並打包程式碼和資源輸出apk或者aar
  • check 檢查測試程式碼,比如lint檢查,UT等。
  • build 組合了check和assemble操作
  • clean 清理之前的輸出以及生成的檔案,比如build目錄

gradle為不同的product flavor,build type以及build variant都建立了對應的一些task,例如assembleCommon、assembleRelease、assembleCommonRelease等。各個task之間存在依賴關係,例如assembleCommon依賴assembleCommonRelease和assembleCommonDebug等。