從事Android高級研發,怎能不知道Android的打包流程呢?java
今天就爲你們講解Android打包的流程:android
Android 構建系統編譯應用資源和源代碼,而後將它們打包成可測試、部署、簽署和分發的 APK。 通常使用 Android Studio開發的時候使用Gradle構建工具包來自動執行和管理構建流程,同時也能夠靈活地自定義構建配置。 Gradle 和 Android 插件獨立於 Android Studio 運行。因此咱們能夠在 Android Studio上或者計算機上的命令行構建 Android 應用。 若是您不使用 Android Studio,能夠學習如何從命令行構建和運行您的應用,最終構建的輸出都相同。bash
在瞭解Android打包流程以前,我建議您能夠先查看一個apk包內容,能夠知道它裏面都有哪些文件組成:app
知道了apk包體的內容,咱們應該會更好的理解Android打包流程:工具
以上流程中咱們能夠看到:佈局
一、若是咱們構建的是debug版本的應用,打包器會使用調試密鑰庫簽署應用。 Android Studio 自動使用調試密鑰庫配置新項目。 二、若是構建的是打算向外發佈的發佈版本應用,打包器會使用發佈密鑰庫簽署應用。 三、在生成最終 APK 以前,打包器會使用 zipalign 工具對應用進行優化,減小其在設備上運行時佔用的內存。學習
如上面的流程所示,是典型 Android 應用模塊的構建流程,但若是看的更細緻一點它的流程應該以下:測試
這些構建中使用的工具或者腳本,在SDK的build-tools或者tools下能夠找到gradle
詳細的流程圖以下: 優化
這樣就Android打包的流程就明明白白了。
Androidstudio 會與Android Plugin for Gradle 這個構建工具包協做,當咱們在Androidstudio建立一個應用的時候,它會幫助咱們建立自定義構建配置 build.gradle 文件,這個文件裏的內容須要咱們本身進行一些簡單的更改。 這些純文本文件使用域特定語言 (DSL) 以 Groovy 語言描述和操做構建邏輯,其中 Groovy 是一種適用於 Java 虛擬機 (JVM) 的動態語言。 無需瞭解 Groovy 即可開始配置構建,由於 Android Plugin for Gradle 引入咱們開發須要的大多數 DSL 元素
如圖,是咱們工程中文件層級,如今咱們來說講每一個層級gradle的文件含義:
buildscript {
buildscript塊是Gradle自己配置存儲庫和依賴項的地方——也就是說,這裏不該該包含模塊的依賴項。例如,這個塊包含了Gradle的Android插件做爲一個依賴項,由於它提供了Gradle構建Android應用程序模塊所需的額外指令。
repositories {
google()
jcenter()
}
dependencies 塊配置Gradle須要使用的依賴項來構建項目。下面的代碼行添加了Gradle的Android插件版本3.3.2做爲類路徑依賴項。
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2'
}
}
allprojects塊是配置項目中全部模塊(如第三方插件或庫)使用的存儲庫和依賴項的地方。可是,你應該在每一個模塊級別的構建中配置特定於模塊的依賴項。gradle文件。對於新項目,Android Studio默認包含JCenter和谷歌的Maven存儲庫,但它不配置任何依賴項(除非您選擇了一個須要的模板)
allprojects {
repositories {
google()
jcenter()
}
}
複製代碼
對於包含多個模塊的 Android 項目,在項目級別定義某些屬性,並在全部模塊間共享這些屬性可能會很是有用。 爲此,您能夠將 額外屬性添加到頂級 build.gradle 文件的 ext 代碼塊中。
buildscript {...}
allprojects {...}
// 這個塊封裝了自定義屬性,使它們對項目中的全部模塊均可用。
ext {
//下面只是能夠定義的屬性類型的幾個示例。
compileSdkVersion = 28
// You can also create properties to specify versions for dependencies.
// Having consistent versions between modules can avoid conflicts with behavior.
supportLibVersion = "28.0.0"
...
}
...
複製代碼
要從相同項目中的模塊訪問這些屬性,請在模塊的 build.gradle 文件(您能夠在如下部分了解有關此文件的詳細信息)中使用如下語法。
android {
// 使用如下語法訪問在項目級別定義的屬性:
// rootProject.ext.property_name
compileSdkVersion rootProject.ext.compileSdkVersion
...
}
...
dependencies {
implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
...
}
複製代碼
此 Android 應用模塊 build.gradle 文件示例歸納您應瞭解的某些基本 DSL 元素和設置。
//構建配置中的第一行將Gradle的Android插件應用於此構建,並使Android塊可用來指定特定於Android的構建選項。
apply plugin: 'com.android.application'
android塊是配置全部android特定構建選項的地方。
android {
compileSdkVersion指定了Gradle應該使用的Android API級別來編譯你的應用程序。這意味着你的應用程序可使用這個API級別或更低的API特性。
compileSdkVersion 28
buildToolsVersion指定了用於構建應用程序的SDK構建工具、命令行實用程序和編譯器的版本。須要使用SDK管理器下載構建工具。此屬性是可選的,由於插件默認使用構建工具的推薦版本。
buildToolsVersion "28.0.3"
defaultConfig塊封裝了全部構建變體的默認設置和條目,而且能夠從構建系統動態地覆蓋main/AndroidManifest.xml中的一些屬性。你能夠配置產品口味來覆蓋應用程序不一樣版本的這些值。
defaultConfig {
applicationId唯一地標識要發佈的包。可是,咱們的源代碼仍然應該引用主/AndroidManifest.xml文件中的package屬性定義的包名。
applicationId 'com.example.myapp'
定義運行應用程序所需的最低API級別。
minSdkVersion 15
指定用於測試應用程序的API級別。
targetSdkVersion 28
定義應用程序的版本號。
versionCode 1
爲您的應用程序定義一個用戶友好的版本名稱。
versionName "1.0"
}
您能夠在buildTypes塊中配置多個構建類型。根據efault,構建系統定義了兩種構建類型:debug和release。調試構建類型在默認的構建配置中沒有顯式顯示,可是它包含調試工具,並使用debug鍵進行簽名。release構建類型應用Proguard設置,默認狀況下不簽名。
buildTypes {
默認狀況下,Android Studio使用minifyEnabled配置release build類型來啓用代碼收縮,並指定Proguard設置文件。
release {
minifyEnabled true // Enables code shrinking for the release build type.
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
能夠在productflavor塊中配置多個產品口味。這容許您建立應用程序的不一樣版本,這些版本能夠用本身的設置覆蓋defaultConfig塊。產品風味是可選的,默認狀況下構建系統不會建立它們。這個例子建立了一個免費且付費的產品風格。而後,每種產品都指定了本身的應用程序ID,這樣它們就能夠同時存在於谷歌Play Store或Android設備上。若是您聲明產品的風味,您還必須聲明風味維度,並將每種風味分配給風味維度。
flavorDimensions "tier"
productFlavors {
free {
dimension "tier"
applicationId 'com.example.myapp.free'
}
paid {
dimension "tier"
applicationId 'com.example.myapp.paid'
}
}
在split塊中,您能夠配置不一樣的APK構建,每一個構建只包含支持屏幕密度或的代碼和資源versionCode不一樣。
splits {
根據屏幕密度設置構建多個apk。
density {
啓用或禁用構建多個apk
exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
}
}
}
模塊級構建配置文件中的dependencies塊指定僅構建模塊自己所需的依賴項。要了解更多信息,請添加構建依賴項。
dependencies {
implementation project(":lib")
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
複製代碼
gradle.properties
您能夠在其中配置項目範圍 Gradle 設置,例如 Gradle 後臺進程的最大堆大小。如需瞭解詳細信息,請參閱構建環境。 local.properties 爲構建系統配置本地環境屬性,例如 SDK 安裝路徑。 因爲該文件的內容由 Android Studio 自動生成而且專用於本地開發者環境,因此不該手動修改該文件,或將其歸入您的版本控制系統。
以上即是Android打包流程中須要瞭解的知識。這些知識對咱們理解一些比較深刻的功能仍是頗有好處的,好比熱更新,好比插件化,好比多渠道打包,同時在平時的開發過程當中對打包編譯的配置文件gradle很熟悉,能夠大大提升開發的效率,甚至能夠本身開發一些小的腳本幫助本身提升工做效率。