總結(jié):Android之Gradle總結(jié)

本文主要總結(jié)的內(nèi)容如下:

  • Groovy介紹

  • 一、Gradle簡介(定義與特性)

  • 二、Gradle使用

    • 1漓帚、Multi-Projects Build
    • 2篮昧、gradle命令
    • 3赋荆、gradle的工作流程
    • 4、Gradle編程模型
  • 三懊昨、Android中使用Gradle

    • 1窄潭、相關(guān)文件
    • 2、Android tasks
    • 3酵颁、相關(guān)配置
    • 4嫉你、Gradle模板舉例

0、Groovy介紹:

Gradle 選擇了Groovy躏惋。Groovy基于Java并拓展了Java幽污。

Gradle選擇了Groovy的原因:
Groovy基于Java并拓展了Java。 Java程序員可以無縫切換到使用Groovy開發(fā)程序簿姨。Groovy說白了就是把寫Java程序變得像寫腳本一樣簡單距误。寫完就可以執(zhí)行,Groovy內(nèi)部會將其編譯成Javaclass然后啟動虛擬機來執(zhí)行扁位。

  • 1准潭、定義:Groovy是在 java平臺上的、 具有像Python域仇,RubySmalltalk語言特性的靈活動態(tài)語言刑然, Groovy保證了這些特性像 Java語法一樣被 Java開發(fā)者使用。

  • 2暇务、Groovy是一種動態(tài)語言泼掠。

  • 3、Groovy與Java的關(guān)系:
    當(dāng)我執(zhí)行Groovy腳本時般卑,Groovy會先將其編譯成Java類字節(jié)碼武鲁,然后通過Jvm來執(zhí)行這個Java類。


    Java蝠检、Groovy和Jvm的關(guān)系示意圖
  • 4沐鼠、特性:

    • Groovy注釋標(biāo)記和Java一樣,支持//或者/**/
    • Groovy語句可以不用分號結(jié)尾。
    • Groovy中支持動態(tài)類型饲梭,即定義變量的時候可以不指定其類型乘盖。Groovy中,變量定義可以使用關(guān)鍵字def憔涉。注意订框,雖然def不是必須的,但是為了代碼清晰兜叨,建議還是使用def關(guān)鍵字穿扳。
    • 函數(shù)定義時,參數(shù)的類型也可以不指定国旷。
    • 除了變量定義可以不指定類型外矛物,Groovy中函數(shù)的返回值也可以是無類型的
         //無類型的函數(shù)定義,必須使用def關(guān)鍵字
         def  nonReturnTypeFunc(){
             last_line   //最后一行代碼的執(zhí)行結(jié)果就是本函數(shù)的返回值
         }
         //如果指定了函數(shù)返回類型跪但,則可不必加def關(guān)鍵字來定義函數(shù)
         String getString(){
            return"I am a string"
         }
      

快速學(xué)習(xí)攻略:Groovy腳本基礎(chǔ)全攻略

一履羞、Gradle簡介

1、定義

  • 1屡久、Gradle是一個工具忆首,同時它也是一個編程框架。

  • 2被环、Gradle中糙及,每一個待編譯的工程都叫一個Project
    每一個Project在構(gòu)建的時候都包含一系列的Task筛欢。
    比如一個Android APK的編譯可能包含:Java源碼編譯Task丁鹉、資源編譯Task、JNI編譯Task悴能、lint檢查Task、打包生成APK的Task雳灾、簽名Task等漠酿。

  • 3、Gradle是一個框架谎亩,作為框架炒嘲,它負(fù)責(zé)定義流程和規(guī)則。而具體的編譯工作則是通過插件的方式來完成的匈庭。比如編譯Java有Java插件夫凸,編譯Groovy有Groovy插件,編譯Android APP有Android APP插件阱持,編譯Android Library有Android Library插件夭拌。

2、特性:

  • 使用靈活的語言來寫構(gòu)建規(guī)則。
  • Gradle是一種DSL鸽扁,即Domain Specific Language蒜绽,領(lǐng)域相關(guān)語言。

二桶现、Gradle使用

1鸿染、Multi-Projects Build

將多個Project進行統(tǒng)一編譯钳垮,類似這種操作,在Gradle中,可以稱之為Multi-Projects Build猎提。

1.1、使用方式:
  • 1酱讶、在工程根目錄(如圖中g(shù)radleProjects)下添加一個build.gradle文件(用于配置其他子Project的)

  • 2阵翎、在工程根目錄(如圖中g(shù)radleProjects)下添加一個settings.gradle文件(名稱必須為settings.gradle用于告知Gradle包含多少個子Project)。

    Multi-Projects Build 文件夾示意圖
1.2东囚、.gradle 內(nèi)容:
  • 1跺嗽、build.gralde:
    為子Project添加一些屬性。這個build.gradle有沒有都無所屬页藻。

  • 2桨嫁、settings.gradle

       #settings.gradle
       include 'project1',
               'project2',
               'project3',
               'project4'
    

2、gradle命令:

2.1份帐、查看工程信息:
  • 命令:gradle projects
    在根目錄(如gradleProjects)下打開終端璃吧,執(zhí)行此命令
  • 結(jié)果:顯示有多少個project
gradle projects命令
2.2、查看任務(wù)信息:
  • 命令:gradleproject-path:tasks
    在子目錄(如project1)下打開終端废境,執(zhí)行此命令畜挨。若不在子目錄中則需要加上project-path
  • 結(jié)果:顯示當(dāng)前項目的任務(wù)信息
    由于我這個子目錄下什么也沒有噩凹,所以顯示的信息是這個樣子巴元。
gradle:tasks命令
2.3、執(zhí)行任務(wù)(task)
  • 命令:gradle task-name
    task-name為指定任務(wù)的名稱驮宴,如clean清理任務(wù)
  • 示例:
    • gradle clean是執(zhí)行清理任務(wù)逮刨,和make clean類似。
    • gradle properites 用來查看所有屬性信息堵泽。

3修己、gradle的工作流程:

gradle工作流程

包含三個階段:

  • 1、首先是初始化階段(Initiliazation phase)迎罗。
    對我們前面的multi-project build而言睬愤,就是執(zhí)行settings.gradle

  • 2纹安、Configration階段的目標(biāo)是解析每個project中的build.gradle尤辱。

    • 比如multi-project build例子中砂豌,解析每個子目錄中的build.gradle。在這兩個階段之間啥刻,我們可以加一些定制化的Hook奸鸯。這當(dāng)然是通過API來添加的。

    • Configuration 階段完了后可帽,整個build的project以及內(nèi)部的Task關(guān)系就確定了娄涩。一個Project包含很多Task,每個Task之間有依賴關(guān)系映跟。Configuration會建立一個有向圖來描述Task之間的依賴關(guān)系蓄拣。所以,我們可以添加一個HOOK努隙,即當(dāng)Task關(guān)系圖建立好后球恤,執(zhí)行一些操作。

  • 3荸镊、最后一個階段就是執(zhí)行任務(wù)了咽斧。
    你在gradle xxx中指定什么任務(wù),gradle就會將這個xxx任務(wù)鏈上的所有任務(wù)全部按依賴順序執(zhí)行一遍躬存!
    任務(wù)執(zhí)行完后张惹,我們還可以加Hook。

4岭洲、Gradle編程模型

Gradle基于Groovy宛逗,Groovy又基于Java。所以盾剩,Gradle執(zhí)行的時候和Groovy一樣雷激,會把腳本轉(zhuǎn)換成Java對象。

Gradle主要有三種對象告私,這三種對象和三種不同的腳本文件對應(yīng)屎暇,在gradle執(zhí)行的時候,會將腳本轉(zhuǎn)換成對應(yīng)的對端:

  • Gradle對象
    當(dāng)我們執(zhí)行gradle xxx或者什么的時候驻粟,gradle會從默認(rèn)的配置腳本中構(gòu)造出一個Gradle對象恭垦。在整個執(zhí)行過程中,只有這么一個對象格嗅。Gradle對象的數(shù)據(jù)類型就是Gradle。
    我們一般很少去定制這個默認(rèn)的配置腳本唠帝。

  • Project對象:
    每一個build.gradle會轉(zhuǎn)換成一個Project對象屯掖。

  • Settings對象:
    每一個settings.gradle都會轉(zhuǎn)換成一個Settings對象

各種類型Gradle對應(yīng)的對象類型:

腳本類型 關(guān)聯(lián)對象類型
Build script Project
Init script Gradle
Settings script Settings
4.1襟衰、Gradle對象:

gradle對象的屬性如圖贴铜,其中的幾個屬性說明如下:

  • hashCode()
    在settings.gradle和build.gradle中,gradle實例對象的hashCode是一樣的
  • HomeDir
    是指在哪個目錄存儲的gradle可執(zhí)行程序
  • User Home Dir
    gradle自己設(shè)置的目錄,里邊存儲了一些配置文件绍坝,以及編譯過程中的緩存文件徘意,生成的類文件,編譯中依賴的插件等等轩褐。
Gradle對象屬性
4.2椎咧、Project對象:
  • 1、每一個build.gradle文件都會轉(zhuǎn)換成一個Project對象把介。在Gradle術(shù)語中勤讽,Project對象對應(yīng)的是BuildScript

  • 2拗踢、Project包含若干Tasks脚牍。由于Project對應(yīng)具體的工程,所以需要為Project加載所需要的插件巢墅,比如為Java工程加載Java插件诸狭。其實,一個Project包含多少Task往往是插件決定的君纫。

  • 3驯遇、一個項目在構(gòu)建時都具備如下流程:

    • 為當(dāng)前項目創(chuàng)建一個Settings類型的實例。
    • 如果當(dāng)前項目存在settings.gradle文件庵芭,則通過該文件配置剛才創(chuàng)建的Settings實例妹懒。
    • 通過Settings實例的配置創(chuàng)建項目層級結(jié)構(gòu)的Project對象實例。
    • 最后通過上面創(chuàng)建的項目層級結(jié)構(gòu)Project對象實例去執(zhí)行每個Project對應(yīng)的build.gradle 腳本双吆。
  • 4眨唬、在Project中,需要:

    • 加載插件(調(diào)用apply函數(shù)):
       //二進制插件(如jar包)
       //Android中的build.gradle
       apply plugin: 'com.android.library'    <==如果是編譯Library好乐,則加載此插件
       apply plugin: 'com.android.application'  <==如果是編譯Android APP匾竿,則加載此插件
      
        //加載一個gradle文件
        apply from: rootProject.getRootDir().getAbsolutePath() + "/utils.gradle"
      
    • 不同插件有不同的配置。在Project中配置后蔚万,插件就知道從何處讀取源文件
    • 設(shè)置屬性:
      單個腳本岭妖,不需要考慮屬性的跨腳本傳播。
      extra property(額外屬性):通過ext前綴標(biāo)示是一個額外屬性反璃。定義好之后昵慌,后面的存取就不需要ext前綴了。ext屬性支持Project和Gradle對象淮蜈。即Project和Gradle對象都可以設(shè)置ext屬性:
          //第一次定義或者設(shè)置它的時候需要ext前綴
          gradle.ext.api =properties.getProperty('sdk.api')
          println gradle.api  //再次存取api的時候斋攀,就不需要ext前綴了
      

三、Android中的Gradle

Android自己定義了好多Script Block梧田。Android定義的DSL參考文檔在
https://developer.android.com/tools/building/plugin-for-gradle.html下載淳蔼。

Android的DSL參考信息

1侧蘸、相關(guān)文件

  • Android中g(shù)radle項目基本的目錄結(jié)構(gòu):
     demoApp
        |-- build.gradle
        |-- settings.gradle
        |-- app
            |-- build.gradle
        |-- gradlew
        |-- gradlew.bat
        |-- gradle
            |-- wrapper
                |-- gradle-wrapper.jar
                |-- gradle-wrapper.properties
        |-- gradle.properties
        |-- local.properties
    
1.1、local.properties

對于Android來說鹉梨,local.properties 是必須的讳癌,下面兩個配置sdk.dir和ndk.dir是Android Gradle必須要指定的。

   #設(shè)置sdk目錄
   sdk.dir=xxx
   #設(shè)置ndk目錄
   ndk.dir=yyy
1.2存皂、項目根目錄(頂層)的build.gradle

一般情況下晌坤,這個build.gradle 是做一些全局配置,其配置最終會被應(yīng)用到所有項目中艰垂。它典型的配置如下:

   apply from: 'dependencies.gradle'
   
   buildscript {
       repositories {
           jcenter()
           mavenCentral()
       }
       dependencies {
           classpath 'com.android.tools.build:gradle:3.2.1'
       }
   }
   
   allprojects {
       repositories {
           jcenter()
           google()
       }
   }
   
   task clean(type: Delete) {
       delete rootProject.buildDir
   }
  • buildscript:定義了 Android 編譯工具的類路徑泡仗。repositories 中的 jCentermavenCentral` 是兩個倉庫。

  • allprojects:中定義的屬性會被應(yīng)用到所有 module 中猜憎,但是為了保證每個項目的獨立性娩怎,我們一般不會在這里面操作太多共有的東西。(一般外部依賴庫都在其中胰柑,gradle會通過查找在這里配置的倉庫來比編譯指定的依賴庫截亦?)

1.3、每個子項目中的build.gradle

針對每個module 的配置柬讨,如果其build.gradle中定義的選項和頂層build.gradle定義的相同崩瓤,則頂層中的配置會被覆蓋。典型的配置內(nèi)容如下:

      apply plugin: 'com.android.application'
      
      android {
          compileSdkVersion 28
          buildToolsVersion "28.0.3"
      
          defaultConfig {
              applicationId "com.demo.testapp"
              minSdkVersion 14
              targetSdkVersion 28
      
              versionCode 1.1.1
              versionName "111"
          }
      
          signingConfigs {
              debug {
                  storeFile file("../debug.jks")
      
                  storePassword "123456"
                  keyAlias "haha"
                  keyPassword "123456"
              }
      
              release {
                  storeFile file("../release.jks")
      
                  storePassword "123456"
                  keyAlias "haha"
                  keyPassword "123456"
              }
          }
      
          buildTypes {
              debug {
                  minifyEnabled false      //是否混淆
                  shrinkResources false    //去除沒有用到的資源文件
              }
      
              release {
                  minifyEnabled true
                  shrinkResources true
                  proguardFiles getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro"
                  signingConfig signingConfigs.release
              }
          }
      
          repositories {
              //添加aar
              flatDir {
                  dirs 'libs'
              }
          }
      
      }
      
      dependencies {
          api fileTree(include: ['*.jar'], dir: 'libs')
          api "com.android.support:appcompat-v7:27.1.1"
      }
  • apply plugin:gradle插件踩官,作為Android 的應(yīng)用程序却桶,這一步是必須的,因為plugin中提供了Android 編譯蔗牡、測試颖系、打包等等的所有task。

  • android:關(guān)于android 的所有特殊配置都在這個代碼塊中辩越,這就是由上面聲明的 plugin 提供的嘁扼。

    • defaultConfig:程序的默認(rèn)配置;這里配置的相關(guān)屬性會覆蓋AndroidManifest.xml 中定義的屬性(如versionName)
    • applicationId:定義了APP的包名黔攒,不同于AndroidManifest.xml中的package屬性趁啸。
  • buildTypes:定義了編譯類型,針對每個類型我們可以有不同的編譯配置督惰,不同的編譯配置對應(yīng)的有不同的編譯命令不傅。默認(rèn)的有debugrelease 的類型赏胚。

  • dependencies:gradle 的依賴配置蛤签。它定義了當(dāng)前項目需要依賴的其他庫。

1.4栅哀、Gradle Wrapper

gradle wrapper 是針對gradle新版本對舊版本的向后兼容性問題而使用的震肮。

gradlw wrapper 包含一些腳本文件和針對不同系統(tǒng)下面的運行文件。wrapper 有版本區(qū)分留拾,但是并不需要你手動去下載戳晌,當(dāng)你運行腳本的時候,如果本地沒有會自動下載對應(yīng)版本文件痴柔。

在不同操作系統(tǒng)下面執(zhí)行的腳本不同沦偎,在 Mac 系統(tǒng)下執(zhí)行./gradlew ...,在windows 下執(zhí)行g(shù)radle.bat進行編譯咳蔚。

  • gradle wrapper目錄結(jié)構(gòu):
     demoApp
        |-- gradlew
        |-- gradlew.bat
        |-- gradle
            |-- wrapper
                |-- gradle-wrapper.jar
                |-- gradle-wrapper.properties
    

2豪嚎、Android tasks

2.1、基本的tasks:
  • assemble:對buildType 下的所有配置類型生成相應(yīng)的apk包
  • clean:移除所有編譯輸出的文件谈火,如apk
  • check:執(zhí)行lint檢測編譯
  • build:同時執(zhí)行assemblecheck

這些基本的task侈询,在實際項目中會根據(jù)不同的配置,會對這些task 設(shè)置不同的依賴糯耍。如默認(rèn)的 assmeble 會依賴 assembleDebugassembleRelease扔字,如果直接執(zhí)行assmeble,最后會編譯debugrelease 的所有版本出來温技。如果我們只需要編譯debug 版本革为,我們可以運行assembleDebug

2.2舵鳞、新增task:
  • install震檩,會將編譯后的apk 安裝到連接的設(shè)備。

3蜓堕、相關(guān)配置

3.1抛虏、BuildConfig

這個類是由gradle根據(jù)配置文件生成的,通過配置一些key-value 的鍵值對俩滥,可以用BuildConfig獲取相應(yīng)的字段嘉蕾。例如:

    //module下的build.gradle
    buildTypes {
        debug {
            //配置網(wǎng)絡(luò)請求根地址
            buildConfigField 'String', 'API_URL', '"http://test.com/api/debug/"'
            //配置app名稱
            resValue "string", "app_name", "測試版"
        }

        release {
            //配置網(wǎng)絡(luò)請求根地址
            buildConfigField 'String', 'API_URL', '"http://test.com/api/release/"'
            //配置app名稱
            resValue "string", "app_name", "上線版"
        }
    }

在使用時,只需要調(diào)用BuildConfig.API_URL霜旧,就能獲得當(dāng)前環(huán)境(debug或release)下的值错忱。
而用resValue配置的,則不需要再strings.xml中配置相應(yīng)名稱的值挂据,否則會報錯以清。

3.2、Repositories

repositories中配置的是代碼倉庫崎逃。在dependencies 中配置的一些依賴庫都是從這里下載的掷倔。
Gradle 支持三種類型的倉庫:MavenIvy和一些靜態(tài)文件或者文件夾个绍。在編譯的執(zhí)行階段勒葱,gradle 將會從倉庫中取出對應(yīng)需要的依賴文件浪汪,當(dāng)然,gradle 本地也會有自己的緩存凛虽,不會每次都去取這些依賴死遭。

  • gradle 支持多種 Maven 倉庫,一般常用的是jCenter凯旋。

     //項目根目錄下的build.gradle
     repositories {
         jcenter()
         google()
     }
    
  • 有一些項目呀潭,可能是一些公司私有的倉庫中的,這時候需要手動加入倉庫連接至非,而有的需要用戶名和密碼钠署,

     //項目根目錄下的build.gradle
     repositories {
        maven {
            url 'https://jitpack.io'
            credentials {
               username 'xxx'
               password 'yyy'
            }
        }
      }
    
  • 可以使用相對路徑配置本地倉庫,通過配置項目中存在的靜態(tài)文件夾作為本地倉庫:

       //module下的build.gradle
       android {
         ......
         repositories {
            flatDir {
                dirs 'libs'
            }
          }
       }
    
3.3荒椭、Dependencies

依賴庫的配置谐鼎。

  • File dependencies
    通過files()方法可以添加文件依賴,如果有很多jar文件戳杀,我們也可以通過fileTree()方法添加一個文件夾该面,除此之外,我們還可以通過通配符的方式添加信卡,如下:
   //module下的build.gradle
   dependencies {
       api fileTree(include: ['*.jar'], dir: 'libs')
   }
  • aar dependencies
    可以將項目打包成aar 文件隔缀,通過文件的形式來引用:
   //module下的build.gradle
   //其中的aarname是打包的aar文件的名稱,后面的ext是固定的
   dependencies {
       api(name: 'aarname', ext: 'aar')
   }
3.4傍菇、Source sets

封裝所有變體的源集配置猾瘸。

  • 1、Native libraries
    配置本地 .so庫丢习。在配置文件中做如下配置牵触,然后在對應(yīng)位置建立文件夾,加入對應(yīng)平臺的.so文件咐低。
   //方式一:
    android {
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs', , 'src/main/jni']
            }
        }
    }

    //方式二
    android {
        sourceSets.main {
            jni.srcDirs 'libs'
        }
    }
jni目錄示意圖
  • 2揽思、配置源集:
        sourceSets {
            main {
                //更改Java源的目錄。默認(rèn)目錄是:'src/main/java'见擦。
                java.srcDirs = ['other/java']
                // 默認(rèn)目錄是'src/main/res'
                res.srcDirs = [ 'other/res1', 'other/res2' ]
                //設(shè)置清單钉汗。默認(rèn)目錄是:src/main/AndroidManifest.xml
                manifest.srcFile 'other/AndroidManifest.xml'
                ...
            }
            //創(chuàng)建其他塊以配置其他源集。
            androidTest {
                setRoot 'src/tests'
                ...
            }
        }
    
    • main中的res.srcDirs如果列出多個目錄鲤屡,Gradle將使用它們來收集源损痰。由于Gradle為這些目錄提供了相同的優(yōu)先級,如果在多個目錄中定義相同的資源酒来,則在合并資源時會出現(xiàn)錯誤卢未。

    • 對于每個源集,只能指定一個AndroidManifest.xml。

    • 如果源集的所有文件都位于單個根目錄下辽社,則可以使用setRoot屬性指定該目錄伟墙。收集源集的源時,Gradle僅在相對于您指定的根目錄的位置中查找滴铅。例如远荠,在將配置應(yīng)用于androidTest源集之后,Gradle僅在src/tests/java/ 目錄中查找Java源失息。

3.5、Product flavors:

關(guān)于構(gòu)建不同的Product flavors档址,可以參考如下:
Build Variants
技術(shù):Android打包簽名總結(jié)

4盹兢、Gradle模板舉例

  • 4.1、Project的build.gradle

       // Top-level build file where you can add configuration options common to all sub-projects/modules.
       //全局引入gradle文件
       apply from: 'dependencies.gradle'
       
       //gradle腳本執(zhí)行所需依賴守伸,包含依賴倉庫和插件
       buildscript {
       
           //配置遠(yuǎn)程倉庫
           repositories {
               //從Android Studio3.0后新增了google()配置绎秒,可以引用google上的開源項目
               google()
               //一個類似于github的代碼托管倉庫,聲明了jcenter()配置尼摹,可以輕松引用 jcenter上的開源項目
               jcenter()
       
               //本地倉庫
               mavenLocal()
               //maven中央倉庫
               mavenCentral()
               //指定maven倉庫
               maven { url "https://jitpack.io" }
               maven { url 'https://maven.google.com' }
           }
       
           //配置插件
           dependencies {
               //此處是android的插件gradle见芹,gradle是一個強大的項目構(gòu)建工具
               classpath 'com.android.tools.build:gradle:3.2.1'
               //其他插件,這里是數(shù)據(jù)庫greendao的插件
               classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
           }
       }
       
       //項目本身需要的依賴蠢涝,比如項目所需的maven庫
       allprojects {
           repositories {
               jcenter()
               google()
               maven { url 'https://jitpack.io' }
               maven { url 'https://maven.google.com' }
           }
       }
       
       //清除任務(wù)
       task clean(type: Delete) {
           delete rootProject.buildDir
       }
    
  • 4.2玄呛、Module的build.gradle

       //app應(yīng)用插件,聲明為Android應(yīng)用程序
       apply plugin: 'com.android.application' //表示是一個應(yīng)用程序模塊和二,直接運行
       //apply plugin: 'com.android.library'   //表示是一個庫模塊徘铝,被其他module依賴
       
       apply plugin: 'walle'   //其他插件,這里是打包插件
       
       //定義變量
       def versionConfigs = rootProject.extensions.getByName("ext")
       
       android {
           //編譯時用的Android版本
           compileSdkVersion versionConfigs.androidCompileSdkVersion
           //構(gòu)建工具的版本
           buildToolsVersion versionConfigs.androidBuildToolsVersion
       
           //默認(rèn)配置惯吕,會被下面的相同的配置覆蓋
           defaultConfig {
               //項目包名惕它,唯一標(biāo)識,和AndroidManifest.xml中的package(Java文件包名)不同
               applicationId "com.example.app"
               //程序最低兼容的運行版本废登,低于此版本無法安裝
               minSdkVersion versionConfigs.androidMinSdkVersion
               //項目的目標(biāo)版本
               targetSdkVersion versionConfigs.androidTargetSdkVersion
       
               //版本號
               versionCode VERSION_CODE as int
               //版本名稱淹魄,給用戶看的
               versionName VERSION_NAME
       
               //支持multidex
       //        multiDexEnabled true
       
               //表明要使用AndroidJUnitRunner進行單元測試
               testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
           }
       
           //程序在編譯的時候會檢查lint,有任何錯誤提示會停止build堡距,我們可以關(guān)閉這個開關(guān)
           lintOptions {
               //打包release版本的時候進行檢測
               checkReleaseBuilds false
               //即使報錯也不會停止打包
               abortOnError false
               //屏蔽translate引起的warning
               disable "MissingTranslation"
           }
       
           //自動化打包配置甲锡,可以自定義配置多種打包配置
           signingConfigs {
               //測試配置
               debug {
                   //debug簽名文件路徑
                   storeFile file("../debug.jks")
       
                   //簽名相關(guān)信息,配置在了gradle.properties中了
                   storePassword SIGNINGCONFIGS_PSW
                   keyAlias SIGNINGCONFIGS_KEYALIAS
                   keyPassword SIGNINGCONFIGS_PSW
               }
       
               //上線配置
               release {
                   //release簽名文件路徑
                   storeFile file("../release.jks")
       
                   //簽名相關(guān)信息吏颖,配置在了gradle.properties中了
                   storePassword SIGNINGCONFIGS_PSW
                   keyAlias SIGNINGCONFIGS_KEYALIAS
                   keyPassword SIGNINGCONFIGS_PSW
               }
           }
       
           //構(gòu)建類型搔体,可自定義多種類型
           buildTypes {
               debug {
                   minifyEnabled false      //是否混淆
                   shrinkResources false    //去除沒有用到的資源文件
               }
       
               release {
                   minifyEnabled true
                   shrinkResources true
                   proguardFiles getDefaultProguardFile('proguard-android.txt'), "$rootDir/ModuleLibs/config/proguard-rules.pro"
                   signingConfig signingConfigs.release
               }
           }
       
           repositories {
               //添加本地aar目錄
               flatDir {
                   dirs 'libs'
               }
           }
       
           //配置源集
           sourceSets {//目錄指向配置
               main {
                   jniLibs.srcDirs = ['libs']//指定lib庫目錄
               }
           }
       
       }
       
       //依賴
       dependencies {
           //本地文件依賴
           api fileTree(include: ['*.jar'], dir: 'libs')
       
           //測試用例庫
           testImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
               exclude group: 'com.android.support', module: 'support-annotations'
           })
       
           //依賴corelib的module
           api project(':corelib')
           
           //定義外部變量的引用
           def andlibs = rootProject.ext.andlibs
           def libs = rootProject.ext.libs
           api andlibs.appcompat_v7
       }
    

相關(guān)鏈接:
Android Plugin DSL Reference
Gradle Android插件用戶指南翻譯

深入理解Android之Gradle
史上最全Android build.gradle配置詳解
Gradle 完整指南(Android)
Gradle 提速:每天為你省下一杯喝咖啡的時間

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市半醉,隨后出現(xiàn)的幾起案子疚俱,更是在濱河造成了極大的恐慌,老刑警劉巖缩多,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呆奕,死亡現(xiàn)場離奇詭異养晋,居然都是意外死亡,警方通過查閱死者的電腦和手機梁钾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門绳泉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姆泻,你說我怎么就攤上這事零酪。” “怎么了拇勃?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵四苇,是天一觀的道長。 經(jīng)常有香客問我方咆,道長月腋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任瓣赂,我火速辦了婚禮榆骚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘煌集。我一直安慰自己妓肢,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布牙勘。 她就那樣靜靜地躺著职恳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪方面。 梳的紋絲不亂的頭發(fā)上放钦,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音恭金,去河邊找鬼操禀。 笑死,一個胖子當(dāng)著我的面吹牛横腿,可吹牛的內(nèi)容都是我干的颓屑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耿焊,長吁一口氣:“原來是場噩夢啊……” “哼揪惦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起罗侯,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤器腋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纫塌,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡诊县,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了措左。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片依痊。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖怎披,靈堂內(nèi)的尸體忽然破棺而出胸嘁,到底是詐尸還是另有隱情,我是刑警寧澤凉逛,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布缴渊,位于F島的核電站,受9級特大地震影響鱼炒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝌借,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一昔瞧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菩佑,春花似錦自晰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瞧哟,卻和暖如春混巧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勤揩。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工咧党, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陨亡。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓傍衡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親负蠕。 傳聞我的和親對象是個殘疾皇子蛙埂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 在 Android Studio 構(gòu)建的項目中,基于 Gradle 進行項目的構(gòu)建遮糖,同時使用 Android DS...
    Ant_way閱讀 7,364評論 0 16
  • 是什么绣的? 在語法上是基于Groovy語言的(Groovy 是一種基于JVM的敏捷開發(fā)語言,可以簡單的理解為強類型語...
    千山萬水迷了鹿閱讀 99,568評論 4 122
  • Gradle是一款非常優(yōu)秀的構(gòu)建系統(tǒng)工具,它的DSL基于Groovy實現(xiàn),可以讓你很方便的通過代碼控制這些DSL來...
    飛雪無情flysnow_org閱讀 3,529評論 0 35
  • 說明 本文主要介紹和Gradle關(guān)系密切、相對不容易理解的配置被辑,偏重概念介紹燎悍。部分內(nèi)容是Android特有的(例如...
    jzj1993閱讀 15,632評論 1 62
  • 今天上午兒子在家把妹妹的紅雨鞋復(fù)習(xí)完了一遍宏怔,I0點后去上英語課奏路,在英語課上,兒子表現(xiàn)積極臊诊,得了最高分鸽粉,6個...
    鈞宇閱讀 270評論 0 0