熟悉Android打包編譯的流程

從事Android高級研發,怎能不知道Android的打包流程呢?java

今天就爲你們講解Android打包的流程:android

Android 構建系統編譯應用資源和源代碼,而後將它們打包成可測試、部署、簽署和分發的 APK。 通常使用 Android Studio開發的時候使用Gradle構建工具包來自動執行和管理構建流程,同時也能夠靈活地自定義構建配置。 Gradle 和 Android 插件獨立於 Android Studio 運行。因此咱們能夠在 Android Studio上或者計算機上的命令行構建 Android 應用。 若是您不使用 Android Studio,能夠學習如何從命令行構建和運行您的應用,最終構建的輸出都相同。bash

在瞭解Android打包流程以前,我建議您能夠先查看一個apk包內容,能夠知道它裏面都有哪些文件組成:app

  • AndroidManifest.xml 程序全局配置文件
  • classes.dex Dalvik字節碼
  • resources.arsc 資源索引表, 解壓縮resources.ap_就能看到
  • res\ 該目錄存放資源文件(圖片,文本,xml佈局)
  • assets\ 該目錄能夠存放一些配置文件
  • src\ java源碼文件
  • libs\ 存放應用程序所依賴的庫
  • gen\ 編譯器根據資源文件生成的java文件
  • bin\ 由編譯器生成的apk文件和各類依賴的資源
  • META-INF\ 該目錄下存放的是簽名信息

知道了apk包體的內容,咱們應該會更好的理解Android打包流程:工具

以上流程中咱們能夠看到:佈局

  • 編譯器將源代碼轉換成 DEX(Dalvik Executable) 文件(其中包括 Android 設備上運行的字節碼),將全部其餘內容轉換成已編譯資源。
  • APK 打包器將 DEX 文件和已編譯資源合併成單個 APK。 不過,必須先簽署 APK,才能將應用安裝並部署到 Android 設備上
  • APK 打包器使用調試或發佈密鑰庫簽署APK。

注意:

一、若是咱們構建的是debug版本的應用,打包器會使用調試密鑰庫簽署應用。 Android Studio 自動使用調試密鑰庫配置新項目。 二、若是構建的是打算向外發佈的發佈版本應用,打包器會使用發佈密鑰庫簽署應用。 三、在生成最終 APK 以前,打包器會使用 zipalign 工具對應用進行優化,減小其在設備上運行時佔用的內存。學習

重點:

如上面的流程所示,是典型 Android 應用模塊的構建流程,但若是看的更細緻一點它的流程應該以下:測試

  • AAPT(Android Asset Packaging Tool)工具,Android資源打包工具。會打包資源文件(res文件夾下的文件),並生成R.java和resources.arsc文件。
  • AIDL工具會將全部的.aidl文件編譯成.java文件。
  • JAVAC工具將R.java、AIDL接口生成的java文件、應用代碼java文件編譯成.class文件。
  • dex腳本將不少.class文件轉換打包成一個.dex文件。
  • apkbuilder腳本將資源文件和.dex文件生成未簽名的.apk文件。
  • jarsigner對apk進行簽名。

這些構建中使用的工具或者腳本,在SDK的build-tools或者tools下能夠找到gradle

詳細的流程圖以下: 優化

這樣就Android打包的流程就明明白白了。

gradle的配置含義

Androidstudio 會與Android Plugin for Gradle 這個構建工具包協做,當咱們在Androidstudio建立一個應用的時候,它會幫助咱們建立自定義構建配置 build.gradle 文件,這個文件裏的內容須要咱們本身進行一些簡單的更改。 這些純文本文件使用域特定語言 (DSL) 以 Groovy 語言描述和操做構建邏輯,其中 Groovy 是一種適用於 Java 虛擬機 (JVM) 的動態語言。 無需瞭解 Groovy 即可開始配置構建,由於 Android Plugin for Gradle 引入咱們開發須要的大多數 DSL 元素

如圖,是咱們工程中文件層級,如今咱們來說講每一個層級gradle的文件含義:

  • settings.gradle 工程設置Gradle,文件位於項目根目錄,用於指示 Gradle 在構建應用時應將哪些模塊包括在內。 對大多數項目而言,該文件很簡單,只包括如下內容: include ‘:app’ 不過,多模塊項目須要指定應包括在最終構建之中的每一個模塊
  • project build.gradle 是頂級構建文件, 位於項目根目錄,用於定義適用於項目中全部模塊的構建配置。 默認狀況下,此頂級構建文件使用 buildscript 代碼塊來定義項目中全部模塊共用的 Gradle 存儲區和依賴項。 如下代碼示例描述的默認設置和 DSL 元素可在新建項目後的頂級 build.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}"
    ...
}
複製代碼
  • module build.gradle是模塊級構建文件 模塊級 build.gradle 文件位於各 project/module/ 目錄中,用於配置適用於其所在模塊的構建設置。 你能夠經過配置這些構建設置來提供自定義打包選項(例如附加構建類型和產品風格),以及替換 main/ 應用清單或頂級 build.gradle 文件中的設置。

此 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 屬性文件,Gradle 還包括兩個屬性文件,均位於項目根目錄中,可用於指定適用於 Gradle 構建工具包自己的設置:

gradle.properties

您能夠在其中配置項目範圍 Gradle 設置,例如 Gradle 後臺進程的最大堆大小。如需瞭解詳細信息,請參閱構建環境。 local.properties 爲構建系統配置本地環境屬性,例如 SDK 安裝路徑。 因爲該文件的內容由 Android Studio 自動生成而且專用於本地開發者環境,因此不該手動修改該文件,或將其歸入您的版本控制系統。

以上即是Android打包流程中須要瞭解的知識。這些知識對咱們理解一些比較深刻的功能仍是頗有好處的,好比熱更新,好比插件化,好比多渠道打包,同時在平時的開發過程當中對打包編譯的配置文件gradle很熟悉,能夠大大提升開發的效率,甚至能夠本身開發一些小的腳本幫助本身提升工做效率。

相關文章
相關標籤/搜索