Android Gradle從認識到實踐
前言
本文將先從各個gradle文件入手,分析各個文件中,我們可以進行哪些配置,這些配置又可以起到什么作用,如何通過gradle來滿足對于構建的自定義需求。
AndroidStudio中Gradle文件
我們新建一個Android項目,AndroidStudio會默認為我們生成以下幾個文件,Project的構建文件,Module的構建文件,Project配置文件,混淆規則文件等,那么這些文件都具有什么功能,我們又可以進行何種配置呢?
- settings.gradle
include ':app'
新建的工程,默認只有上述一條語句,用于指示 Gradle 在構建應用時應將哪些模塊包括在內。對大多數項目而言,該文件可能只有上述一條,但是當我們項目中,引入了其它的功能module,或者業務邏輯module,就需要我們在include語句中添加相應的module。
- build.gradle
build文件有兩個,一個是針對我們的Module,一個是針對Project。
在Project中,默認生成如下配置
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
// NOTE: Do not place your application dependencies here; they belong in the individual module build.gradle files
}
}
在Project的build文件中,我們可以來添加一些子module所共有的一些配置,而無需單獨在每一個子module中進行配置。可進行依賴倉庫是jcenter還是其它依賴倉庫等。在module中默認生成的是對于我們的module自身構建的時候進行的一些配置選項。
- gradle.properties
為gradle的配置文件,里面可以定義一些常量供build.gradle使用,如版本號等,當隨著我們的業務增長,build文件也會變大,可維護性變差,當我們想修改一些內容的時候,需要逐個去找,但是,當我們將其中的一些配置常量放置在一個單獨的文件中,相比之前,可維護性就有所提升。我們可以將構建SDK版本等一些信息添加到該文件中。
COMPILE_SDK_VERSION = 23BUILD_TOOLS_VERSION = 23.0.1VERSION_CODE = 1
然后,我們就可以在build文件中進行引用了。引用方式,直接通過變量名就可以。
配置構建
- 構建類型
構建類型定義 Gradle 在構建和打包您的應用時使用的某些屬性,通常針對開發生命周期的不同階段進行配置。例如,調試構建類型支持調試選項,使用調試密鑰簽署 APK;而發布構建類型則可壓縮、混淆 APK 以及使用發布密鑰簽署 APK 進行分發。您必須至少定義一個構建類型才能構建應用——Android Studio 默認情況下會創建調試和發布構建類型。要開始為應用自定義打包設置,請學習如何配置構建類型。
默認構建方式
defaultConfig { applicationId "com.chenjensen.gradlelearn"
minSdkVersion 14
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}
我們可以根據自己的需求,比如只針對發布的版本進行混淆等操作,而對于debug版本不進行,我們可以在buildType中進行配置。
buildTypes { release { minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} debug {
}
}
- 產品風味
產品風味代表您可以發布給用戶的不同應用版本,例如免費和付費的應用版本。您可以將產品風味自定義為使用不同的代碼和資源,同時對所有應用版本共有的部分加以共享和重復利用。產品風味是可選項,并且您必須手動創建。我們可以在productFlavors {} 代碼塊中配置我們所需要的的設置。產品風味支持與 defaultConfig 相同的屬性,這是因為 defaultConfig 實際上屬于 ProductFlavor 類。這意味著,您可以在 defaultConfig {} 代碼塊中提供所有風味的基本配置,每種風味均可替換任何默認值,例如 applicationId。
ApplicationId用來作為我們的APK的包名,用來對于不同的包的區分,對于manifest中的package字段則是用來命名資源類的包名,最后生成的 R 類文件位于該包下,如果其他包里面的代碼需要引用資源時可通過該路徑進行調用。
例如
productFlavors { demo { applicationId "com.example.myapp.demo"
versionName "1.0-demo"
}
full { applicationId "com.example.myapp.full"
versionName "1.0-full"
}
}
通過對于產品風味的配置,我們可以針對不同的應用市場發布不同的應用包,針對不同的應用包,我們可以進行細致化到具體的SDK版本等的配置。采用的不同的應用市場分發,可以讓我們針對不同應市場下發下的下載率的采集。
- 依賴項
構建系統管理來自您的本地文件系統以及來自遠程存儲區的項目依賴項。這樣一來,您就不必手動搜索、下載依賴項的二進制文件包以及將它們復制到項目目錄內。
Android中有三種添加依賴的方式
//依賴我們本地的module
compile project(":mylibrary") //遠程的二進制依賴項
compile 'com.android.support:appcompat-v7:25.1.0'
//本地二進制依賴方式,將檢測我們的本地的libs中的jar文件
compile fileTree(dir: 'libs', include: ['*.jar']) //javaTest依賴
testCompile 'junit:junit:4.12' //AndroidTest依賴
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
當我們添加了一個依賴,該依賴還依賴了其它的依賴,而我們想把其中的一個依賴去掉,compile方法,可以接受一個閉包參數,我們可以利用這個閉包來將其中的部分依賴剔出掉。
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
通過compile配置,Gradle 將此配置的依賴項添加到類路徑和應用的 APK。除了compile配置,還有apk,provided。
- apk
指定 Gradle 需要將其與應用的 APK 一起打包的僅運行時依賴項。您可以將此配置與 JAR 二進制依賴項一起使用,而不能與其他庫模塊依賴項或 AAR 二進制依賴項一起使用。
- provided
指定 Gradle 不與應用的 APK 一起打包的編譯時依賴項。如果運行時無需此依賴項,這將有助于縮減 APK 的大小。您可以將此配置與 JAR 二進制依賴項一起使用,而不能與其他庫模塊依賴項或 AAR 二進制依賴項一起使用。
- 簽署
構建系統可以在構建配置中指定簽署設置,并可在構建過程中自動簽署您的 APK。構建系統通過使用已知憑據的默認密鑰和證書簽署調試版本,以避免在構建時提示密碼。除非為此構建顯式定義簽署配置,否則,構建系統不會簽署發布版本。如果沒有發布密鑰,可以按簽署應用中所述生成一個。由于調試證書通過構建工具創建并且在設計上不安全,大多數應用商店(包括 Google Play 商店)都不接受使用調試證書簽署要發布的 APK。
簽署的應用
應用升級:當系統安裝應用的更新時,它會比較新版本和現有版本中的證書。如果證書匹配,則系統允許更新。如果使用不同的證書簽署新版本,則必須為應用分配另一個軟件包名稱 - 在此情況下,用戶將新版本作為全新應用安裝。
應用模塊化:Android 允許通過相同證書簽署的多個 APK 在同一個進程中運行(如果應用請求這樣),以便系統將它們視為單個應用。通過此方式,可以在模塊中部署您的應用,且用戶可以獨立更新每個模塊。
在您創建簽署配置時,Android Studio 會以純文本形式將您的簽署信息添加到模塊的 build.gradle 文件中。如果是團隊協作開發或者將您代碼開源,那么應當將此敏感信息從構建文件中移出,以免被其他人輕易獲取。為此,創建一個單獨的屬性文件來存儲安全信息。然后在本地獲取外部文件的配置,然后在發布代碼的時候,保留我們的秘鑰配置文件。
- 在項目的根目錄下創建一個名稱為 keystore.properties 的文件。
storePassword=myStorePasswordkeyPassword=mykeyPasswordkeyAlias=myKeyAliasstoreFile=myStoreFileLocation
- 在模塊的 build.gradle 文件中,于 android {} 塊的前面添加用于加載 keystore.properties 文件的代碼
def keystorePropertiesFile = rootProject.file("keystore.properties")// Initialize a new Properties() object called keystoreProperties.def keystoreProperties = new Properties()// Load your keystore.properties file into the keystoreProperties object.keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
- 使用語法 keystoreProperties['屬性名稱'] 引用存儲在 keystoreProperties 中的屬性。修改模塊 build.gradle 文件的 signingConfigs 塊,以便使用此語法引用存儲在 keystoreProperties 中的簽署信息。
android { signingConfigs { config { keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
...
}
- ProGuard
構建系統讓您能夠為每個構建變體指定不同的 ProGuard 規則文件。構建系統可在構建過程中運行 ProGuard 對類進行壓縮和混淆處理。代碼壓縮通過 ProGuard 提供,ProGuard 會檢測和移除封裝應用中未使用的類、字段、方法和屬性,包括自帶代碼庫中的未使用項(這使其成為以變通方式解決 64k 引用限制的有用工具)。ProGuard 還可優化字節碼,移除未使用的代碼指令,以及用短名稱混淆其余的類、字段和方法。混淆過的代碼可令您的 APK 難以被逆向工程。對于ProGuard更詳細的介紹可以參考之前關于項目構建的文章。
開啟代碼壓縮
minifyEnabled true
啟用ProGuard規則
proguardFiles getDefaultProguardFile(‘proguard-android.txt'),
'proguard-rules.pro'
- getDefaultProguardFile(‘proguard-android.txt') 方法可從 Android SDK tools/proguard/ 文件夾獲取默認 ProGuard 設置。
- proguard-rules.pro 文件用于添加自定義 ProGuard 規則。默認情況下,該文件位于模塊根目錄
每次執行完成ProGuard之后,都會產生如下文件
- dump.txtAPK 中所有類文件的內部結構。
- mapping.txt提供原始與混淆過的類、方法和字段名稱之間的轉換。
seeds.txt
列出未進行混淆的類和成員。
usage.txt
列出從 APK 移除的代碼。
這些文件保存在 <module-name>/build/outputs/mapping/release/。
對于其中一些類,我們不想對其進行混淆的,需要我們在ProGuard 配置文件中添加一行 -keep 代碼。例如:
-keep public class MyClass
來自:http://mobile.51cto.com/android-534664.htm