Gradle For Android讀書筆記

一、理解gradle

gradle是基于Groovy語言的項(xiàng)目構(gòu)建框架實(shí)現(xiàn),Groovy是一種基于JVM的動(dòng)態(tài)語言。Android studio采用gradle來構(gòu)建項(xiàng)目。

Android項(xiàng)目結(jié)構(gòu)

MyApp
   ├── build.gradle //project
   ├── settings.gradle
   └── app 
       ├── build.gradle //module
       ├── build
       ├── libs
       └── src
           └── main
               ├── java
               │   └── com.package.myapp
               └── res
                   ├── drawable
                   ├── layout
                   └── etc. 

build.gradle的配置文件

根目錄project的build.gradle

buildscript方法定義的是所有模塊的公共屬性

buildscript {
   repositories { //項(xiàng)目依賴的倉(cāng)庫(kù),即依賴包的來源,常見的還有如maven倉(cāng)庫(kù),或者自己定義的倉(cāng)庫(kù)
        jcenter() 
   }
   dependencies { //定義默認(rèn)的依賴包,不能在此定義子模塊的特有依賴包
       classpath 'com.android.tools.build:gradle:1.2.3'
 } 
}
allprojects { //可定義各模塊的默認(rèn)配置和各模塊都可見的tasks
     repositories {
          jcenter() 
     }
}

Module內(nèi)的build.gradle

apply plugin: 'com.android.application' // 聲明是插件
   android {  // Android類型的插件可以使用Android標(biāo)簽
       compileSdkVersion 22 // 編譯app時(shí)API版本
       buildToolsVersion "22.0.1" // 構(gòu)建工具得版本號(hào)
       defaultConfig { // 定義了app的核心屬性,并會(huì)在AndroidManifest中重寫對(duì)應(yīng)屬性。
           applicationId "com.gradleforandroid.gettingstarted" // 復(fù)寫了AndroidManifest中的packageName。applicationId可以用來作為設(shè)備和應(yīng)用商店的唯一標(biāo)志,基于此,一個(gè)手機(jī)可以安裝兩個(gè)“同樣”的app。
           minSdkVersion 14
           targetSdkVersion 22
           versionCode 1 //版本號(hào)標(biāo)志
           versionName "1.0"
       }
       buildTypes {
           release {
               minifyEnabled false
               proguardFiles getDefaultProguardFile
                ('proguard-android.txt'), 'proguard-rules.pro'
           }
        } 
    }
    dependencies {
       compile fileTree(dir: 'libs', include: ['*.jar'])
       compile 'com.android.support:appcompat-v7:22.2.0'
     }

第一行表示插件聲明。apply plugin: 'com.android.application'表示聲明的是googleAndroid開發(fā)團(tuán)隊(duì)編寫的插件,能夠提供所有關(guān)于Android應(yīng)用和依賴庫(kù)的構(gòu)建打包和測(cè)試。

setting.gradle

settings.gradle會(huì)在初始化初期執(zhí)行,其中定義了哪些模塊會(huì)被project構(gòu)建。

include ':app', ':playui'

會(huì)至少包含一個(gè)include ':app',這時(shí)候表示單模塊工程。

關(guān)于各模塊的插件聲明:
app:

apply plugin: 'com.android.application'

其他module:

apply plugin: 'com.android.library'

如果插件聲明的是Android類型,則可以使用Android標(biāo)簽

android {
       compileSdkVersion 22 //編譯sdk版本
       buildToolsVersion "22.0.1" //構(gòu)建版本工具,可以用高版本去構(gòu)建低版本
}

聲明在libs文件夾內(nèi)的jar包

dependencies {
       compile fileTree(dir: 'libs', include: ['*.jar'])
}

全局設(shè)置

方法一、allprojects

這種必須是Android app module才有效,只有添加了Android插件才能訪問Android的tasks

allprojects {
       apply plugin: 'com.android.application'
       android {
           compileSdkVersion 22
           buildToolsVersion "22.0.1"
       }
 }

方法二、ext

在project的build.gradle中聲明ext并定義屬性,在所有子module中可以訪問。

 ext {
       compileSdkVersion = 22
       buildToolsVersion = "22.0.1"
}  

則子模塊中可以如下使用:

android {
       compileSdkVersion rootProject.ext.compileSdkVersion
       buildToolsVersion rootProject.ext.buildToolsVersion
 }

Tasks

待補(bǔ)充: https://blog.csdn.net/singwhatiwanna/article/details/78898113

二、依賴管理

gradle中可以一行代碼實(shí)現(xiàn)依賴,由gradle自動(dòng)從遠(yuǎn)程倉(cāng)庫(kù)下載依賴jar,并保證被正確使用。gradle也可以在工程中添加多個(gè)相同依賴時(shí),自動(dòng)排除掉相同的依賴。

倉(cāng)庫(kù)

倉(cāng)庫(kù)即文件的集合。Gradle支持Maven、lvy以及文件夾三種不同的倉(cāng)庫(kù)下載,并且針對(duì)特定版本的依賴包只需要下載一次后會(huì)在本地保留一份緩存。
?

一個(gè)依賴需要定義三個(gè)元素:

  1. group:創(chuàng)建該library的組織名,通常是包名
  2. name:該library的唯一標(biāo)示
  3. version:該library的版本號(hào)
    通常的依賴聲明如下:
dependencies {
       compile 'com.google.code.gson:gson:2.3'
       compile 'com.squareup.retrofit:retrofit:1.9.0'
}

上述是基于groovy語法的,所以其完整的表述應(yīng)該是

dependencies {
      compile group: 'com.google.code.gson', name: 'gson', version:'2.3'
      compile group: 'com.squareup.retrofit', name: 'retrofit', version: '1.9.0'
     }

遠(yuǎn)程倉(cāng)庫(kù)

對(duì)于不在MavenCentral或者jcenter中而在一些組織自己的的Maven庫(kù)的依賴,,需要添加Maven庫(kù)的url地址,如果倉(cāng)庫(kù)需要權(quán)限,還要添加相應(yīng)的userName和password

repositories {
       maven {
           url "http://repo.acmecorp.com/maven2"
       }
}
repositories {
       maven {
           url "http://repo.acmecorp.com/maven2"
           credentials {
               username 'user'
               password 'secretpassword'
           }
        } 
   }

本地依賴

手動(dòng)下載jar包添加依賴或者創(chuàng)建自己的library,而不必將該library發(fā)布到公有或者私有庫(kù)。

文件依賴

添加一個(gè)具體的jar文件依賴:

dependencies {
    compile files('libs/domoarigato.jar')
}

添加一個(gè)文件夾下所有的jar依賴

dependencies {
       compile fileTree('libs')
 }

默認(rèn)情況下,新建的Android項(xiàng)目會(huì)有一個(gè)lib文件夾,并且會(huì)在依賴中這么定義(即添加所有在libs文件夾中的jar):

dependencies {
      compile fileTree(dir: 'libs', include: ['*.jar'])
}

這樣在任何一個(gè)Android項(xiàng)目中,你都可以把一個(gè)jar文件放在到libs文件夾下,其會(huì)自動(dòng)的將其添加到編譯路徑以及最后的APK文件。

Native包(so包)

用c或者c++寫的library會(huì)被叫做so包,Android插件默認(rèn)情況下支持native包,你需要把.so文件放在對(duì)應(yīng)的文件夾中:

app
   ├── AndroidManifest.xml
   └── jniLibs
       ├── armeabi
       │   └── nativelib.so
       ├── armeabi-v7a
       │   └── nativelib.so
       ├── mips
       │   └── nativelib.so
       └── x86
           └── nativelib.so

aar文件

可以使用Android API和包含Android資源文件,清單文件等的library(即依賴工程)。與應(yīng)用工程生成apk不同,依賴工程生成.aar,該文件可以被Android應(yīng)用工程當(dāng)做依賴來使用。

創(chuàng)建依賴工程模塊

與應(yīng)用工程module不同,該build.gradle第一行應(yīng)聲明成:

apply plugin: 'com.android.library'
使用依賴工程模塊
  1. 直接使用library作為依賴,在project的build.gradle里添加聲明
include ':app', ':library' 

在使用的模塊里添加依賴

dependencies {
       compile project(':library')
  }
  1. 當(dāng)構(gòu)建library的時(shí)候,在 build/output/aar/下會(huì)生成對(duì)應(yīng)的aar包,當(dāng)項(xiàng)目需要復(fù)用library的時(shí)候可以以aar包形式引入。
    創(chuàng)建一個(gè)aars文件夾,將aar拷貝,添加該文件夾作為依賴庫(kù),則該文件夾下所有aar文件都將作為依賴。
repositories {
    flatDir {
        dirs 'aars' 
    }
}

dependencies {
       compile(name:'libraryname', ext:'aar')
}

依賴的概念

配置

compile是默認(rèn)的那個(gè),其含義是包含所有的依賴包,即在APK里,compile的依賴會(huì)存在。

apk的意思是apk中存在,但是不會(huì)加入編譯中,這個(gè)貌似用的比較少。

provided的意思是提供編譯支持,但是不會(huì)寫入apk。

testCompile和androidTestCompile會(huì)添加額外的library支持針對(duì)測(cè)試。

動(dòng)態(tài)版本

在需要使用最新版本的依賴包的情況下,采用此方式引入動(dòng)態(tài)版本,gradle會(huì)在每次構(gòu)建的時(shí)候去倉(cāng)庫(kù)尋找是否有最新版本。但是這面臨的一個(gè)問題是,最新版本可能不是穩(wěn)定版。動(dòng)態(tài)版本一個(gè)顯著的特點(diǎn)是版本號(hào)后面帶“+”。

dependencies {
       compile 'com.android.support:support-v4:22.2.+'
       compile 'com.android.support:appcompat-v7:22.2+'
       compile 'com.android.support:recyclerview-v7:+'
}

三、版本構(gòu)建

在Gradle的Android插件中,一個(gè)構(gòu)建版本意味著定義一個(gè)app或者依賴庫(kù)如何被構(gòu)建。每個(gè)構(gòu)建版本都要特殊的一面,比如是否需要debug,application id是什么,是否不需要的資源被刪除等等。你可以定義一個(gè)構(gòu)建版本通過buildTypes方法。Android studio將debug作為默認(rèn)構(gòu)建版本。

android {
       buildTypes {
           release {
               minifyEnabled false
               proguardFiles getDefaultProguardFile
                 ('proguard-android.txt'), 'proguard-rules.pro'
           }
           
           debug {
            signingConfig signingConfigs.debugConfig
            buildConfigField "boolean", MAIL_LOGIN, getMailLoginValue()
        }
        }
 }

創(chuàng)建自己的構(gòu)建版本

同樣是在buildTypes里寫入自己的版本,為自己的構(gòu)建版本定一些特殊的屬性。構(gòu)建版本可以繼承并重寫已有構(gòu)建版本的屬性。

android {
    buildTypes {
        staging {
            applicationIdSuffix ".staging"
            versionNameSuffix "-staging"
            buildConfigField "String", "API_URL",
            "\"http://staging.example.com/api\""
         }
    }
}

構(gòu)建版本通過initWith方法繼承并重寫以后構(gòu)建版本

android {
       buildTypes {
           staging.initWith(buildTypes.debug)
           staging {
               applicationIdSuffix ".staging"
               versionNameSuffix "-staging"
               debuggable = false
           } 
        }
}

四、構(gòu)建變體

ing...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 說明 本文主要介紹和Gradle關(guān)系密切、相對(duì)不容易理解的配置,偏重概念介紹。部分內(nèi)容是Android特有的(例如...
    搬磚的小明閱讀 16,157評(píng)論 1 62
  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 https://blog.csdn.net/zhaoyanj...
    勤奮的pangdunhu閱讀 2,230評(píng)論 0 1
  • 依賴管理 依賴管理是Gradle最閃耀的地方,最好的情景是,你僅僅只需添加一行代碼在你的build文件,Gradl...
    木木00閱讀 507評(píng)論 1 6
  • Gradle 是一款構(gòu)建系統(tǒng)工具,它的 DSL 基于 Groovy 實(shí)現(xiàn)。Gradle 構(gòu)建的大部分功能都是通過插...
    任教主來也閱讀 3,255評(píng)論 3 6
  • 第三篇( 依賴管理 ) 依賴管理 依賴管理是Gradle最閃耀的地方,最好的情景是,你僅僅只需添加一行代碼在你的b...
    一劍飛鴻閱讀 502評(píng)論 0 0

友情鏈接更多精彩內(nèi)容