【乾貨篇】Gradle這麼差還來面騰訊?

上一篇:【乾貨篇】Gradle這麼差還來面騰訊?

六.Android Gradle插件

1.概述

Android Gradle插件繼承於Java插件,具有Java插件的所有特性,也有自己的特性,看下官方介紹:

  • 可以很容易地重用代碼和資源

  • 可以很容易地創建應用的衍生版本

  • 可以很容易地配置、擴展以及自定義構建過程

  • 和IDE無縫整合

2.插件分類

  • App應用工程:生成可運行apk應用;id: com.android.application

  • Library庫工程:生成aar包給其他的App工程公用;id: com.android.library

  • Test測試工程:對App應用工程或Library庫工程進行單元測試;id: com.android.test

3.項目結構

|-example
| |-build.gradle| |-example.iml
| |-libs
| |-proguard-rules.pro 混淆配置文件
| |-src
|  |-androidTest
|    |-java Android單元測試代碼
|  |-main
|    |-java App主代碼
|    |-res 資源文件
|    |-AndroidManifest.xml 配置文件
| |-test
|  |-java 普通單元測試代碼

4.內置任務

<一>Java插件內置任務:如build、assemble、check等

<二>Android特有的常用任務:

  • connectedCheck任務:在所有連接的設備或者模擬器上運行check檢查

  • deviceCheck任務:通過API連接遠程設備運行checks

  • lint任務:在所有ProductFlavor上運行lint檢查

  • ×××tall、un×××tall任務:在已連接的設備上安裝或者卸載App

  • signingReport任務:打印App簽名

  • androidDependencies任務:打印Android 依賴

5.應用實例

//應用插件,Android Gradle屬於Android發佈的第三方插件buildscript{
repositories{
 jcenter()
}
dependencies{
 classpath 'com.android.tcols.build:gradle:1.5.0'}
}
apply plugin:'com.android.application'//自定義配置入口,後續詳解android{
compileSdkVersion 23 //編譯Android工程的SDK版本buildToolsVersion "23.0.1" //構建Android工程所用的構建工具版本defaultConfig{
 applicationId "org.minmin.app.example"
 minSdkVersion 14
 targetSdkVersion 23
 versionCode 1
 versionName "1.0"}
buildTypes{
release{
 minifyEnabled false
 proguardFiles getDefaultPraguardFile('proguard-andrcid.txt'), 'proguard-rules.pro'
 }
}
}//配置第三方依賴dependencies{
 compile fileTree(dir:'libs', include:['*.jar'])
 testCompile 'junit:junit:4.12'
 compile 'com.android.support:appcorpat-v7:23.1.1'
 compile 'com.android.support:design:23.1.1'}

a.defaultConfig

  • 作用:用於定義所有的默認配置,是一個ProductFlavor,若ProductFlavor沒有被特殊定義,默認使用defaultConfig塊指定的配置

  • 常用配置:

webp

b.buildTypes

  • 作用:是構建類型,在Android Gradle中內置了debug和release兩個構建類型,差別在於能否在設備上調試和簽名不同

  • 每一個BuildType都會生成一個SourceSet以及相應的assemble<BuildTypeName>任務

  • 常用配置:

webp

c.signingConfigs

  • 作用:配置簽名設置,標記App唯一性、保護App

  • 可以對不同構建類型採用不同簽名方式:debug模式用於開發調試,可以直接使用Android SDK提供的默認debug簽名證書;release模式用於發佈,需要手動配置

  • 常用配置:

webp

android {
 signingConfigs {
 release{
  storeFile file('myFile.keystore')
  storePassword 'psw'
  keyAlias 'myKey'
  keyPassword 'psw'
 }
 }
}

d.productFlavors

  • 作用:添加不同的渠道、並對其做不同的處理

  • 常用配置:

webp

//定義baidu和google兩個渠道,並聲明兩個維度,優先級爲abi>version>defaultConfigandroid{
 flavorDimensions "abi", "version"
 productFlavors{
  google{
  dimension "abi"
 }
 baidu{ 
 dimension "version"
 } 
}

e.buildConfigFiled

作用:在buildTypes、ProductFlavor自定義字段等配置

方法:buildConfigField(String type,String name,String value)

  • type:字段類型

  • name:字段常量名

  • value:字段常量值

android{
 buildTypes{
 debug{
  buildConfigField "boolean", "LOG_DEBUG", "true"
  buildConfigField "String", "URL", ' "http://www.ecjtu.jx.cn/" '
 }
 }
}

6.多項目構建

和Java Grdle多項目構建一樣的,通過settings.gradle配置管理多項目;在每個項目都有一個build.gradle,採用項目依賴就能實現多項目協作。

項目直接依賴一般適用於關聯較緊密、不可複用的項目,如果想讓項目被其他項目所複用,比如公共組件庫、工具庫等,可以單獨發佈出去。

7.多渠道構建

a.基本原理

  • 構建變體(Build Variant)=構建類型(Build Type)+構建渠道(Product Flavor)

Build Type有release、debug兩種構建類型

Product Flavor有baidu、google兩種構建渠道

Build Variant有baiduRelease、baiduDebug、googleRelease、googleDebug四種構件產出

  • 構建渠道(Product Flavor)還可以通過dimension進一步細化分組

  • assemble開頭的負責生成構件產物(Apk)

assembleBaidu:運行後會生成baidu渠道的release和debug包
assembleRelease:運行後會生成所有渠道的release包
assembleBaiduRelease:運行後只會生成baidu的release包

b.構建方式:

通過佔位符manifestPlaceholders實現:

//AndroidManifest<meta-data 
 android: value="Channel ID" 
 android:name="UMENG_ CHANNEL"/> //build.gradle
 android{
 productFlavors{
 google{
  manifestPlaceholders.put("UMENG_ CHANNEL", "google")
 }
 baidu{
  manifestPlaceholders.put("UMENG_ CHANEL", "baidu")
 }
}
//改進:通過productFlavors批量修改android{
 productFlavors{
  google{
 }
 baidu{
 }
 ProductFlavors.all{ flavor->
  manifestPlaceholders.put("UMENG_ CHANEL", name) 
 } 
}

8.高級應用

**a. **使用共享庫

  • android sdk庫:系統會自動鏈接

  • 共享庫:獨立庫,不會被系統自動鏈接,使用時需要在AndroidManifest通過<uses-library>指定

//聲明需要使用maps共享庫,true表示如果手機系統不滿足將不能安裝該應用
<uses-library
 android:name="com.google.android.maps"
 android:required="true" />
  • add-ons庫:存於add-ons目錄下,大部分由第三方廠商或公司開發,會被自動解析添加到classpath

  • optional可選庫:位於platforms/android-xx/optional目錄下,通常爲了兼容舊版本的API,使用時需要手動添加到classpath

**b. **批量修改生成的apk文件名

<一>類型:

  • applicationVariants :僅僅適用於Android應用Gradle插件

  • libraryVariants :僅僅適用於Android庫Gradle插件

  • testVariants :以上兩種Gradle插件都使用

<二>示例:

webp

applicationVariants是一個DomainObjectCollection集合,通過all方法遍歷每一個ApplicationVariant,這裏有googleRelease和googleDebug兩個變體;然後判斷名字是否以.apk結尾,如果是就修改其文件名。示例中共有。

c.動態生成版本信息

  • 原始方式:由defaultConfig中的versionName指定

  • 分模塊方式:把版本號等配置抽出放在單獨的文件裏,並用ext{}括起來,通過apply from將其引入到build.gradle,版本信息就被當作擴展屬性直接使用了

  • 從git的tag中獲取

  • 從屬性文件中動態獲取和遞增

d.隱藏簽名文件信息

<一>必要性:爲保證簽名信息安全,最好直接放在項目中,而是放在服務器上

<二>一種思路:

  • 服務器:配置好環境變量,打包時直接使用

  • 本地:直接使用android提供的debug簽名

  • 在signingConfigs加入以下判斷

signingConfigs { if (System.env.KEYSTORE_PATH != null) {  //打包服務器走這個邏輯
  storeFile file(System.env.KEYSTORE_PATH)
  keyAlias System.env.ALIAS
  keyPassword System.env.KEYPASS
  storePassword System.env.STOREPASS
 } else {  //當不能從環境變量取到簽名信息時,使用本地debug簽名
  storeFile file('debug.keystore')
  storePassword 'android'
  keyAlias 'androiddebugkey'
  keyPassword 'android'
 }
}

e.動態添加自定義的資源

<一>針對res/values中的資源,除了使用xml定義,還可以通過Android Gradle定義

<二>方法:resValue(String type, String name, String value)

  • type:資源類型,如有string、id、bool

  • name:資源名稱,以便在工程中引用

  • value:資源值

productFlavors{
 google{
  resValue 'string', 'channel_tips', 'google渠道歡迎你'
 }
}

以google爲例,在debug模式下,資源文件保存目錄:build/generated/res/resValues/google/debug/values/generated.xml

f.Java編譯選項

通過compileOptions{}閉包進行編譯配置,可配置項:

  • encoding:配置源文件的編碼

  • sourceCompatibility:配置Java源代碼的編譯級別

  • targetCompatibility:配置生成Java字節碼的版本

android{
 compileOptions{
  encoding = 'utf-8'
  sourceCompatibility = JavaVersion.VERSI0N_ 1_ 6
  targetCompatibility = JavaVersion.VERSION_ 1_ 6
 }
}

g.adb選項配置

通過adbOptions{}閉包進行adb配置,可配置項:

<一>timeOutInMs:設置執行adb命令的超時時間,單位毫秒

<二>×××tallOptions:設置adb ×××tall安裝設置項

  • -l:鎖定該應用程序

  • -r:替換已存在的應用程序,即強制安裝

  • -t:允許測試包

  • -s:把應用程序安裝到SD卡上

  • -d:允許進行降級安裝,即安裝版本比手機自帶的低

  • -g:爲該應用授予所有運行時的權限

android{
 adbOptions{
  timeOutInMs = 5*1000
  ×××tallOptions '-r', '-s'
 }
}

h.DEX選項配置

通過dexOptions {}閉包進行dex配置,可配置項:

  • incremental:配置是否啓用dx的增量模式,默認值爲false

  • javaMaxHeapSize:配置執行dx命令時爲其分配的最大堆內存

  • jumboMode:配置是否開啓jumbo模式

  • preDexLibraries:配置是否預dex Libraries庫工程,默認值爲true,開啓後會提高增量構建的速度

  • threadCount:配置Android Gradle運行dx命令時使用的線程數量

好文推薦:寒冬下2年android的搞笑求職歷程 有需要關於Android進階方面的學習高級技術大綱以及免費教學視頻資料的可以私信我【領取資料】哦!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章