天天看點

android擷取apk名稱_快速了解:十四、Android打包編譯的進階流程

android擷取apk名稱_快速了解:十四、Android打包編譯的進階流程

從事Android進階研發,怎能不知道Android的打包流程呢?

今天就為大家講解Android打包的流程:

Android 建構系統編譯應用資源和源代碼,然後将它們打包成可測試、部署、簽署和分發的 APK。 一般使用 Android Studio開發的時候使用Gradle建構工具包來自動執行和管理建構流程,同時也可以靈活地自定義建構配置。 Gradle 和 Android 插件獨立于 Android Studio 運作。是以我們可以在 Android Studio上或者計算機上的指令行建構 Android 應用。 如果您不使用 Android Studio,可以學習如何從指令行建構和運作您的應用,最終建構的輸出都相同。

在了解Android打包流程之前,我建議您可以先檢視一個apk包内容,可以知道它裡面都有哪些檔案組成:

  • AndroidManifest.xml 程式全局配置檔案
  • classes.dex Dalvik位元組碼
  • resources.arsc 資源索引表, 解壓縮resources.ap_就能看到
  • res 該目錄存放資源檔案(圖檔,文本,xml布局)
  • assets 該目錄可以存放一些配置檔案
  • src java源碼檔案
  • libs 存放應用程式所依賴的庫
  • gen 編譯器根據資源檔案生成的java檔案
  • bin 由編譯器生成的apk檔案和各種依賴的資源
  • META-INF 該目錄下存放的是簽名資訊

知道了apk包體的内容,我們應該會更好的了解Android打包流程:

android擷取apk名稱_快速了解:十四、Android打包編譯的進階流程

以上流程中我們可以看到:

  • 編譯器将源代碼轉換成 DEX(Dalvik Executable) 檔案(其中包括 Android 裝置上運作的位元組碼),将所有其他内容轉換成已編譯資源。
  • APK 打包器将 DEX 檔案和已編譯資源合并成單個 APK。 不過,必須先簽署 APK,才能将應用安裝并部署到 Android 裝置上
  • APK 打包器使用調試或釋出密鑰庫簽署APK。
注意:

1、如果我們建構的是debug版本的應用,打包器會使用調試密鑰庫簽署應用。 Android Studio 自動使用調試密鑰庫配置新項目。 2、如果建構的是打算向外釋出的釋出版本應用,打包器會使用釋出密鑰庫簽署應用。 3、在生成最終 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下可以找到

詳細的流程圖如下:

android擷取apk名稱_快速了解:十四、Android打包編譯的進階流程

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

gradle的配置含義

Androidstudio 會與Android Plugin for Gradle 這個建構工具包協作,當我們在Androidstudio建立一個應用的時候,它會幫助我們建立自定義建構配置 build.gradle 檔案,這個檔案裡的内容需要我們自己進行一些簡單的更改。 這些純文字檔案使用域特定語言 (DSL) 以 Groovy 語言描述和操作建構邏輯,其中 Groovy 是一種适用于 Java 虛拟機 (JVM) 的動态語言。 無需了解 Groovy 便可開始配置建構,因為 Android Plugin for Gradle 引入我們開發需要的大多數 DSL 元素

android擷取apk名稱_快速了解:十四、Android打包編譯的進階流程

如圖,是我們工程中檔案層級,現在我們來講講每個層級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很熟悉,可以大大提高開發的效率,甚至可以自己開發一些小的腳本幫助自己提高工作效率。

繼續閱讀