文章來源:Google
Android 構(gòu)建系統(tǒng)編譯應(yīng)用資源和源代碼畔况,然后將它們打包成可供您測試、部署软免、簽署和分發(fā)的 APK植兰。Android Studio 使用Gradle這一高級構(gòu)建工具包來自動化執(zhí)行和管理構(gòu)建流程玻蝌,同時也允許您定義靈活的自定義構(gòu)建配置蟹肘。每個構(gòu)建配置均可自行定義一組代碼和資源词疼,同時對所有應(yīng)用版本共有的部分加以重復(fù)利用。Android Plugin for Gradle 與這個構(gòu)建工具包協(xié)作帘腹,共同提供專用于構(gòu)建和測試 Android 應(yīng)用的流程和可配置設(shè)置贰盗。
Gradle 和 Android 插件獨立于 Android Studio 運行。這意味著阳欲,您可以在 Android Studio 內(nèi)舵盈、使用計算機上的命令行工具或在未安裝 Android Studio 的計算機例如持續(xù)性集成服務(wù)器上構(gòu)建 Android 應(yīng)用。如果您不使用 Android Studio球化,可以學(xué)習(xí)如何從命令行構(gòu)建和運行您的應(yīng)用秽晚。無論您是從命令行、在遠(yuǎn)程計算機上還是使用 Android Studio 構(gòu)建項目筒愚,構(gòu)建的輸出都相同赴蝇。
注:由于 Gradle 和 Android 插件獨立于 Android Studio 運行,您需要單獨更新構(gòu)建工具巢掺。請閱讀版本說明句伶,了解如何[更新Gradle和Android 插件。
Android 構(gòu)建系統(tǒng)非常靈活陆淀,讓您能夠在不修改應(yīng)用核心源文件的情況下執(zhí)行自定義構(gòu)建配置考余。本章幫助您了解 Android 構(gòu)建系統(tǒng)的工作原理,以及它如何幫助您對多個構(gòu)建配置進(jìn)行自定義和自動化處理轧苫。如果您只想了解有關(guān)部署應(yīng)用的更多信息楚堤,請參閱在 Android Studio 中構(gòu)建和運行項目。要立即開始使用 Android Studio 創(chuàng)建自定義構(gòu)建配置浸剩,請參閱配置構(gòu)建變體钾军。
構(gòu)建流程
構(gòu)建流程涉及許多將您的項目轉(zhuǎn)換成 Android 應(yīng)用軟件包 (APK) 的工具和流程。構(gòu)建流程非常靈活绢要,因此了解它的一些底層工作原理會很有幫助吏恭。
如圖 1 所示,典型 Android 應(yīng)用模塊的構(gòu)建流程通常依循下列步驟:
- 編譯器將您的源代碼轉(zhuǎn)換成 DEX(Dalvik Executable) 文件(其中包括運行在 Android 設(shè)備上的字節(jié)碼)重罪,將所有其他內(nèi)容轉(zhuǎn)換成已編譯資源樱哼。
- APK 打包器將 DEX 文件和已編譯資源合并成單個 APK。不過剿配,必須先簽署 APK搅幅,才能將應(yīng)用安裝并部署到 Android 設(shè)備上。
- APK 打包器使用調(diào)試或發(fā)布密鑰庫簽署您的 APK:
- 如果您構(gòu)建的是調(diào)試版本的應(yīng)用(即專用于測試和分析的應(yīng)用)呼胚,打包器會使用調(diào)試密鑰庫簽署您的應(yīng)用茄唐。Android Studio 自動使用調(diào)試密鑰庫配置新項目。
- 如果您構(gòu)建的是打算向外發(fā)布的發(fā)布版本應(yīng)用,打包器會使用發(fā)布密鑰庫簽署您的應(yīng)用沪编。要創(chuàng)建發(fā)布密鑰庫呼盆,請閱讀在 Android Studio 中簽署您的應(yīng)用。
- 在生成最終 APK 之前蚁廓,打包器會使用zipalign工具對應(yīng)用進(jìn)行優(yōu)化访圃,減少其在設(shè)備上運行時的內(nèi)存占用。
構(gòu)建流程結(jié)束時相嵌,您將獲得可用來進(jìn)行部署腿时、測試的調(diào)試 APK,或者可用來發(fā)布給外部用戶的發(fā)布 APK饭宾。
自定義構(gòu)建配置
Gradle 和 Android 插件可幫助您完成以下方面的構(gòu)建配置:
構(gòu)建類型
構(gòu)建類型定義 Gradle 在構(gòu)建和打包您的應(yīng)用時使用的某些屬性批糟,通常針對開發(fā)生命周期的不同階段進(jìn)行配置。例如捏雌,調(diào)試構(gòu)建類型支持調(diào)試選項跃赚,使用調(diào)試密鑰簽署 APK;而發(fā)布構(gòu)建類型則可壓縮性湿、混淆 APK 以及使用發(fā)布密鑰簽署 APK 進(jìn)行分發(fā)纬傲。您必須至少定義一個構(gòu)建類型才能構(gòu)建應(yīng)用 - Android Studio 默認(rèn)情況下會創(chuàng)建調(diào)試和發(fā)布構(gòu)建類型。要開始為應(yīng)用自定義打包設(shè)置肤频,請學(xué)習(xí)如何配置構(gòu)建類型叹括。
產(chǎn)品風(fēng)味
產(chǎn)品風(fēng)味代表您可以發(fā)布給用戶的不同應(yīng)用版本,例如免費和付費的應(yīng)用版本宵荒。您可以將產(chǎn)品風(fēng)味自定義為使用不同的代碼和資源汁雷,同時對所有應(yīng)用版本共有的部分加以共享和重復(fù)利用。產(chǎn)品風(fēng)味是可選項报咳,并且您必須手動創(chuàng)建侠讯。要開始創(chuàng)建不同的應(yīng)用版本,請學(xué)習(xí)如何配置產(chǎn)品風(fēng)味暑刃。
構(gòu)建變體
構(gòu)建變體是構(gòu)建類型與產(chǎn)品風(fēng)味的交叉產(chǎn)物厢漩,是 Gradle 在構(gòu)建應(yīng)用時使用的配置。您可以利用構(gòu)建變體在開發(fā)時構(gòu)建產(chǎn)品風(fēng)味的調(diào)試版本岩臣,或者構(gòu)建已簽署的產(chǎn)品風(fēng)味發(fā)布版本進(jìn)行分發(fā)溜嗜。您并不直接配置構(gòu)建變體,而是配置組成變體的構(gòu)建類型和產(chǎn)品風(fēng)味架谎。創(chuàng)建附加構(gòu)建類型或產(chǎn)品風(fēng)味也會創(chuàng)建附加構(gòu)建變體炸宵。要了解如何創(chuàng)建和管理構(gòu)建變體,請閱讀配置構(gòu)建變體概覽谷扣。
清單條目
您可以為構(gòu)建變體配置中清單文件的一些屬性指定值土全。這些構(gòu)建值會替換清單文件中的現(xiàn)有值。如果您想為模塊生成多個 APK,讓每一個 APK 文件都具有不同的應(yīng)用名稱裹匙、最低 SDK 版本或目標(biāo) SDK 版本野哭,便可運用這一技巧。存在多個清單時幻件,Gradle 會合并清單設(shè)置。
依賴項
構(gòu)建系統(tǒng)管理來自您的本地文件系統(tǒng)以及來自遠(yuǎn)程存儲區(qū)的項目依賴項蛔溃。這樣一來绰沥,您就不必手動搜索、下載依賴項的二進(jìn)制文件包以及將它們復(fù)制到項目目錄內(nèi)贺待。要了解更多信息徽曲,請學(xué)習(xí)如何聲明依賴項。
簽署
構(gòu)建系統(tǒng)讓您能夠在構(gòu)建配置中指定簽署設(shè)置麸塞,并可在構(gòu)建過程中自動簽署您的 APK秃臣。構(gòu)建系統(tǒng)通過使用已知憑據(jù)的默認(rèn)密鑰和證書簽署調(diào)試版本,以避免在構(gòu)建時提示密碼哪工。除非您為此構(gòu)建顯式定義簽署配置奥此,否則,構(gòu)建系統(tǒng)不會簽署發(fā)布版本雁比。如果您沒有發(fā)布密鑰稚虎,可以按簽署您的應(yīng)用中所述生成一個。
ProGuard
構(gòu)建系統(tǒng)讓您能夠為每個構(gòu)建變體指定不同的 ProGuard 規(guī)則文件偎捎。構(gòu)建系統(tǒng)可在構(gòu)建過程中運行 ProGuard 對類進(jìn)行壓縮和混淆處理蠢终。
APK 拆分
構(gòu)建系統(tǒng)讓您能夠自動構(gòu)建不同的 APK,并且每個 APK 只包含特定屏幕密度或應(yīng)用二進(jìn)制界面 (ABI) 所需的代碼和資源茴她。如需了解詳細(xì)信息寻拂,請參閱配置 APK 拆分捶箱。
構(gòu)建配置文件
創(chuàng)建自定義構(gòu)建配置需要您對一個或多個構(gòu)建配置文件(或 build.gradle
文件)進(jìn)行更改搏熄。這些純文本文件使用域特定語言 (DSL) 以Groovy語言描述和操作構(gòu)建邏輯玉锌,后者是一種適用于 Java 虛擬機 (JVM) 的動態(tài)語言畅厢。您無需了解 Groovy 便可開始配置構(gòu)建愧怜,因為 Android Plugin for Gradle 引入了您需要的大多數(shù) DSL 元素堪遂。如需了解有關(guān) Android 插件 DSL 的更多信息贴彼,請閱讀 DSL 參考文檔搔课。
開始新項目時泛粹,Android Studio 會自動為您創(chuàng)建其中的部分文件(如圖 2 所示)遂铡,并為它們填充合理的默認(rèn)值。
有幾個 Gradle 構(gòu)建配置文件是 Android 應(yīng)用標(biāo)準(zhǔn)項目結(jié)構(gòu)的組成部分晶姊。您必須了解其中每一個文件的范圍和用途及其應(yīng)定義的基本 DSL 元素扒接,才能著手配置構(gòu)建。
Gradle 設(shè)置文件
settings.gradle 文件位于項目根目錄,用于指示 Gradle 在構(gòu)建應(yīng)用時應(yīng)將哪些模塊包括在內(nèi)钾怔。對大多數(shù)項目而言碱呼,該文件很簡單,只包括以下內(nèi)容:
include ‘:app’
不過宗侦,多模塊項目需要指定應(yīng)包括在最終構(gòu)建之中的每個模塊愚臀。
頂級構(gòu)建文件
頂級build.gradle
文件位于項目根目錄,用于定義適用于項目中所有模塊的構(gòu)建配置矾利。默認(rèn)情況下姑裂,這個頂級構(gòu)建文件使用buildscript {}
代碼塊來定義項目中所有模塊共用的 Gradle 存儲區(qū)和依賴項。以下代碼示例描述的默認(rèn)設(shè)置和 DSL 元素可在新建項目后的頂級build.gradle
文件中找到男旗。
/**
* The first line in the build configuration applies the Android plugin for
* Gradle to this build and makes the android {} block available to specify
* Android-specific build options.
*/
apply plugin: 'com.android.application'
/**
* The android {} block is where you configure all your Android-specific
* build options.
*/
android {
/**
* compileSdkVersion specifies the Android API level Gradle should use to
* compile your app. This means your app can use the API features included in
* this API level and lower.
*
* buildToolsVersion specifies the version of the SDK build tools, command-line
* utilities, and compiler that Gradle should use to build your app. You need to
* download the build tools using the SDK Manager.
*/
compileSdkVersion 26
buildToolsVersion "27.0.3"
/**
* The defaultConfig {} block encapsulates default settings and entries for all
* build variants, and can override some attributes in main/AndroidManifest.xml
* dynamically from the build system. You can configure product flavors to override
* these values for different versions of your app.
*/
defaultConfig {
/**
* applicationId uniquely identifies the package for publishing.
* However, your source code should still reference the package name
* defined by the package attribute in the main/AndroidManifest.xml file.
*/
applicationId 'com.example.myapp'
// Defines the minimum API level required to run the app.
minSdkVersion 15
// Specifies the API level used to test the app.
targetSdkVersion 26
// Defines the version number of your app.
versionCode 1
// Defines a user-friendly version name for your app.
versionName "1.0"
}
/**
* The buildTypes {} block is where you can configure multiple build types.
* By default, the build system defines two build types: debug and release. The
* debug build type is not explicitly shown in the default build configuration,
* but it includes debugging tools and is signed with the debug key. The release
* build type applies Proguard settings and is not signed by default.
*/
buildTypes {
/**
* By default, Android Studio configures the release build type to enable code
* shrinking, using minifyEnabled, and specifies the Proguard settings file.
*/
release {
minifyEnabled true // Enables code shrinking for the release build type.
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
/**
* The productFlavors {} block is where you can configure multiple product
* flavors. This allows you to create different versions of your app that can
* override defaultConfig {} with their own settings. Product flavors are
* optional, and the build system does not create them by default. This example
* creates a free and paid product flavor. Each product flavor then specifies
* its own application ID, so that they can exist on the Google Play Store, or
* an Android device, simultaneously.
*/
productFlavors {
free {
applicationId 'com.example.myapp.free'
}
paid {
applicationId 'com.example.myapp.paid'
}
}
/**
* The splits {} block is where you can configure different APK builds that
* each contain only code and resources for a supported screen density or
* ABI. You'll also need to configure your build so that each APK has a
* different versionCode.
*/
splits {
// Screen density split settings
density {
// Enable or disable the density split mechanism
enable false
// Exclude these densities from splits
exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
}
}
}
/**
* The dependencies {} block in the module-level build configuration file
* only specifies dependencies required to build the module itself.
*/
dependencies {
compile project(":lib")
compile 'com.android.support:appcompat-v7:27.0.2'
compile fileTree(dir: 'libs', include: ['*.jar'])
}
Gradle 屬性文件
Gradle 還包括兩個屬性文件舶斧,位于項目根目錄,可用于指定適用于 Gradle 構(gòu)建工具包本身的設(shè)置:
gradle.properties
您可以在其中配置項目范圍 Gradle 設(shè)置察皇,例如 Gradle 后臺進(jìn)程的最大堆大小茴厉。如需了解詳細(xì)信息,請參閱構(gòu)建環(huán)境什荣。
local.properties
為構(gòu)建系統(tǒng)配置本地環(huán)境屬性矾缓,例如 SDK 安裝路徑。由于該文件的內(nèi)容由 Android Studio 自動生成并且專用于本地開發(fā)者環(huán)境稻爬,因此您不應(yīng)手動修改該文件而账,或?qū)⑵浼{入您的版本控制系統(tǒng)。
將項目與 Gradle 文件同步
當(dāng)您在項目中對構(gòu)建配置文件進(jìn)行更改時因篇,Android Studio 會要求您同步項目文件泞辐,以便其導(dǎo)入您的構(gòu)建配置更改并執(zhí)行一些檢查來確保您的配置不會造成構(gòu)建錯誤。
要同步項目文件竞滓,您可以點擊做出更改后出現(xiàn)的通知欄中的 Sync Now(如圖 3 所示)咐吼,或者點擊菜單欄中的 Sync Project。如果 Android Studio 通知配置出現(xiàn)錯誤商佑,例如:您的源代碼使用了只有在 compileSdkVersion
以上的 API 級別中才會提供的 API 功能锯茄,會顯示 Messages 窗口,具體描述該問題茶没。
源集
Android Studio 按邏輯關(guān)系將每個模塊的源代碼和資源分組為源集肌幽。模塊的 main/
源集包括其所有構(gòu)建變體共用的代碼和資源。其他源集目錄為可選項抓半,在您配置新的構(gòu)建變體時喂急,Android Studio 不會自動為您創(chuàng)建這些目錄。不過笛求,創(chuàng)建類似于 main/
的源集有助于讓 Gradle 只應(yīng)在構(gòu)建特定應(yīng)用版本時使用的文件和資源井然有序:
src/main/
此源集包括所有構(gòu)建變體共用的代碼和資源廊移。
src/<buildType>/
創(chuàng)建此源集可加入特定構(gòu)建類型專用的代碼和資源糕簿。
src/<productFlavor>/
創(chuàng)建此源集可加入特定產(chǎn)品風(fēng)味專用的代碼和資源。
src/<productFlavorBuildType>/
創(chuàng)建此源集可加入特定構(gòu)建變體專用的代碼和資源狡孔。
例如懂诗,要生成應(yīng)用的“完整調(diào)試”版本,構(gòu)建系統(tǒng)需要合并來自以下源集的代碼苗膝、設(shè)置和資源:
-
src/fullDebug/
(構(gòu)建變體源集) -
src/debug/
(構(gòu)建類型源集) -
src/full/
(產(chǎn)品風(fēng)味源集) -
src/main/
(主源集)
注:當(dāng)您在 Android Studio 中使用 File > New 菜單選項新建文件或目錄時殃恒,可以針對特定源集進(jìn)行創(chuàng)建∪杞遥可供您選擇的源集取決于您的構(gòu)建配置芋类,如果所需目錄尚不存在,Android Studio 會自動創(chuàng)建界阁。
如果不同源集包含同一文件的不同版本,Gradle 將按以下優(yōu)先順序決定使用哪一個文件(左側(cè)源集替換右側(cè)源集的文件和設(shè)置):
構(gòu)建變體 > 構(gòu)建類型 > 產(chǎn)品風(fēng)味 > 主源集 > 庫依賴項
這樣一來胖喳,Gradle 便可使用專用于您試圖構(gòu)建的構(gòu)建變體的文件泡躯,同時對與其他應(yīng)用版本共用的 Activity、應(yīng)用邏輯和資源加以重復(fù)利用丽焊。在合并多個清單時较剃,Gradle 使用同一優(yōu)先順序,這樣每個構(gòu)建變體都能在最終清單中定義不同的組件或權(quán)限技健。如需了解有關(guān)創(chuàng)建自定義源集的更多信息写穴,請轉(zhuǎn)至創(chuàng)建用于構(gòu)建變體的源集。