六.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塊指定的配置
常用配置:
b.buildTypes
作用:是構建類型,在Android Gradle中內置了debug和release兩個構建類型,差別在於能否在設備上調試和簽名不同
每一個BuildType都會生成一個SourceSet以及相應的assemble<BuildTypeName>任務
常用配置:
c.signingConfigs
作用:配置簽名設置,標記App唯一性、保護App
可以對不同構建類型採用不同簽名方式:debug模式用於開發調試,可以直接使用Android SDK提供的默認debug簽名證書;release模式用於發佈,需要手動配置
常用配置:
android { signingConfigs { release{ storeFile file('myFile.keystore') storePassword 'psw' keyAlias 'myKey' keyPassword 'psw' } } }
d.productFlavors
作用:添加不同的渠道、並對其做不同的處理
常用配置:
//定義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插件都使用
<二>示例:
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進階方面的學習高級技術大綱以及免費教學視頻資料的可以私信我【領取資料】哦!