Gradle簡介
Gradle 是一個基於Ant和Maven概念的專案自動化建構工具。它使用一種基於Groovy的特定領域語言(DSL)來宣告專案設定,這比我們的ANT使用XML構建配置要靈活的多。在編寫配置時,你可以像程式設計一樣靈活,Gradle是基於Groovy的DSL語言,完全相容JAVA。
Android Studio中使用Gradle
Android Studio是使用Gradle進行自動化構建的IDE,當我們在Android Studio新建專案的時候,專案的目錄大抵如下:
├── app #Android App目錄
│ ├── app.iml
│ ├── build #構建輸出目錄
│ ├── build.gradle #構建指令碼
│ ├── libs #so相關庫
│ ├── proguard-rules.pro #proguard混淆配置
│ └── src #原始碼,資源等
├── build
│ └── intermediates
├── build.gradle #工程構建檔案
├── gradle
│ └── wrapper
├── gradle.properties #gradle的配置
├── gradlew #gradle wrapper linux shell指令碼
├── gradlew.bat
├── LibSqlite.iml
├── local.properties #配置Androod SDK位置檔案
└── settings.gradle #工程配置複製程式碼
其中,settings.gradle用於配置project,標明其下有幾個module,比如這裡包含一個:app module(當我們使用Android Studio新增一個在當前專案中新增一個module的時候,會自動的在這個檔案中將新的module的名字include進來)
include ':app'複製程式碼
和settings.gradle在同一目錄下的build.gradle是一個頂級的build配置檔案,在這裡可以為所有project以及module配置一些常用的配置。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()//使用jcenter庫
}
dependencies {
// 依賴android提供的2.1.2的gradle build
classpath 'com.android.tools.build:gradle:2.1.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
//為所有的工程的repositories配置為jcenters
allprojects {
repositories {
jcenter()
}
}複製程式碼
Android Gradle基本配置
在android.signingConfigs{}下定義一個或者多個簽名資訊,然後在buildTypes{}配置使用即可。例如:
android {
signingConfigs {
release {
//指定簽名用的檔案,file對應的根目錄是gradle檔案所在的根目錄
storeFile file("release.keystore")
//別名
keyAlias "release"
//key的密碼
keyPassword "123456"
//證照的密碼
storePassword "123456"
}
debug {
...
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
debug {
signingConfig signingConfigs.debug
}
}
}複製程式碼
我們可以為不同的buildTypes選擇是否啟用混淆,一般release釋出版本是需要啟用混淆的,這樣別人反編譯之後就很難分析你的程式碼,而我們自己開發除錯的時候是不需要混淆的,所以debug不啟用混淆。對release啟用混淆的配置如下:
android{
buildTypes {
release {
//是否啟用混淆
minifyEnabled true
//是否去除無效的資原始檔,這個設定依賴於minifyEnabled的設定,因此要兩者同時設定為true才會生效
shrinkResources true
//getDefaultProguardFile('proguard-android.txt')表示獲取SDK下'proguard-android.txt‘檔案中的預設混淆規則
//'proguard-rules.pro'表示使用專案根目錄下的 'proguard-rules.pro'檔案中的混淆規則
//proguard-rules.pro檔名可以任意,只要在配置檔案中指明即可
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}複製程式碼
此處檢視更多關於proguard的資訊
zipalign是一款重要的優化apk應用程式的工具。
apk包的本質是一個zip壓縮文件,優化的目的是使包內未壓縮的資料能夠有序的排列,從而減少應用程式執行時的記憶體消耗.
android{
buildTypes {
release {
zipAlignEnabled true
}
}
}複製程式碼
通過設定productFlavors的值,我們可以指定不同的渠道包,並且每個渠道包可以自定義其applicationId、versionCode以及versionName等資訊
android {
productFlavors {
dev{
applicationId "com.gdut.demo.dev"
}
qa{
applicationId "com.gdut.demo.qa"
}
pro{
applicationId "com.gdut.demo.pro"
}
}
}複製程式碼
manifestPlaceholders,它允許我們動態替換我們在AndroidManifest檔案裡定義的佔位符。例如:
<meta-data
android:name="UMENG_APPKEY"
android:value="${umeng_app_key}"/>
<meta-data
android:name="UMENG_SECRET"
android:value="${umeng_app_secret}"/>
然後我們可以針對不同的flavors或者buildTypes動態的指定相應的值,例如:
buildTypes {
debug {
manifestPlaceholders = [umeng_app_key: "替代的內容",umeng_app_secret:"替換的內容"]
}
...
}複製程式碼
BuildConfig.java是Android Gradle自動生成的一個java類檔案,無法手動編譯,但是可以通過Gradle控制,也就是說他是動態可配置的。在 gradle 檔案 buildTypes 或者 productFlavors 下面,如:
buildTypes {
release{
//release的包中BuildConfig.ENDPOINT 就會被賦值為 http://example.com 就可以供 Java 程式碼呼叫了。
buildConfigField "String", "ENDPOINT", "\"http://example.com\""
}
}複製程式碼
修改 res value 的方式,比如修改 strings.xml 檔案中的 AppName 的值。在gradle檔案 buildTypes 或者 productFlavors 下面,如:
buildTypes{
release{
//將release的包中名為 AppName 的 string value 值改為 app1
resValue "string", "AppName", "app1"
}
}複製程式碼
我們除了可以通過設定buildtypes來進行分類打包之外,還可以根據螢幕大小、cpu架構適配型別來進行分類打包,通過使用splits我們可以達成這個目的,例如
splits {
density {
enable true
reset()
include "mdpi", "hdpi"
}
abi {
enable true
reset()
include "x86", "mips"
}
}複製程式碼
更多的使用情況以及使用說明請參考android的官方文件:Configure APK Splits
Android設定的方法數是65536個(DEX 64K problem),超過這個方法數,導致dex無法生成,就無法生成APK.處理這個問題,除了儘可能的進行apk瘦身,減少整個apk的方法數之外,可以進行兩種設定進行解決。
1. 使用multiDex。開啟分包模式
defaultConfig {
multiDexEnabled=true
}
2. 忽略方法數的檢查。2.3版本及以下的手機無法正常安裝
android {
dexOptions {
jumboMode = true
}複製程式碼
dependencies {
compile fileTree(include: '*.jar', dir: 'libs')
compile project(':pullrefresh')
prodCompile files('src/prod/libs/bankcard-encrypt.jar')
debugCompile files('src/qa/libs/bugrpt.jar')
}複製程式碼
compile配置將被用於編譯main application。它裡面的所有東西都被會被新增到編譯的classpath中,同時也會被打包進最終的APK。 以下是新增依賴時可能用到的其它一些配置選項:
compile main application(主module)。
androidTestCompile test application(測試module)
debugCompile debug Build Type(debug型別的編譯)
prodCompile prod productFlavors(prod渠道的編譯)複製程式碼
因為沒有可能去構建一個沒有關聯任何BuildType(構建型別)的APK,APK預設配置了兩個或兩個以上的編譯配置:compile和< buildTypes >Compile. 建立一個新的buildTypes或者productFlavors將會自動建立一個基於它名字的新配置
FindBugs是一個Java靜態分析工具,用來檢查類或者jar檔案,用來發現可能的問題。檢測完成之後會生成一份詳細的報告,藉助這份報告可以找到潛在的bug,比如NullPointException,特定的資源沒有關閉,查詢資料庫沒有呼叫Cursor.close()等;
Java的靜態分析工具當然可以無難度的在Android上面執行,通過這種FindBugs的檢查可以讓App的執行更加的穩定。
FindBugs Gradle外掛使用例項如下:
apply plugin: "findbugs"
//定義一個task任務,這個任務的型別是FindBugs
task findbugs(type: FindBugs) {
//有警告錯誤的時候也是允許構建
ignoreFailures= true
effort= "default"
//報告的級別,Low,Medium,High
reportLevel= "high"
println( "$project.buildDir")
//classes和source分別是對應的.classe資料夾地址,和原始碼檔案地址。
classes = files("$project.buildDir/intermediates/classes")
source= fileTree("src/main/java/")
classpath= files()
//指定報告型別,有兩種方式xml和html,只允許一種輸出格式
reports{
xml.enabled=false
html.enabled=true
xml {
destination "$project.buildDir/findbugs.xml"
}
html{
destination "$project.buildDir/findbugs.html"
}
}
}複製程式碼
參考文獻
Android Plugin DSL Reference