1. 程式人生 > >重新認識 Gradle 打包

重新認識 Gradle 打包

前一段時間因為打 AAR 包折騰了一整天,不得不懷疑我對 Gradle 的認識。雖然在此之前確實能解決一些 Gradle 打包依賴的衝突或錯誤,但並沒有系統的去學習。

一、Gradle 是什麼

Gradle依賴管理 + 構建工具。它繼承了 Ant 的靈活和 Maven 的生命週期管理,它最後被 google 作為了 Android 御用管理工具。它最大的區別是不用 XML 作為配置檔案格式,採用了DSL格式,使得指令碼更加簡潔。

  • Ant 是最早的構建工具,基於 idea,好象是2000年有的,當時是最流行 java 構建工具,不過它的 XML 指令碼編寫格式讓 XML 檔案特別大。對工程構建過程中的過程控制特別好。

  • Maven 它是用來給 Ant 補坑的,Maven 第一次支援了從網路上下載的功能,仍然採用 xml 作為配置檔案格式,它的問題是不能很好的相同庫檔案的版本衝突。Maven 專注的是依賴管理,構建神馬的並不擅長。

  • 構建工具 是什麼

    單個原始碼檔案,你可以很輕鬆地 javac、gcc。然而專案結構複雜的時候,從原始碼到實際產出的生成物之間需要經過一些列的轉換操作,比如說編譯、打包。而這一整個完整的過剩叫做“構建”。

  • Maven 的主要功能主要分為5點,分別是依賴管理系統、多模組構建、一致的專案結構、一致的構建模型和外掛機制。

二、Android 是如何打包的

將一堆原始碼生成一個 APK 的過程就是打包,Gradle 作為一個構建平臺已經有了很好的基礎,到具體的打包應用步驟就由

Android Gradle Plugin 完成。即我們在專案下 build.gradle 的配置:

buildscript {
  ...
  dependencies {
    classpath 'com.android.tools.build:gradle:2.3.3'
  }
}

另外在專案子工程中,app、XXXlibrary 內的 build.gradle 檔案使用 apply plugin 來指定具體使用的外掛,如:

apply plugin: 'com.android.application'
apply plugin: 'com.android.library
'

三、什麼是 AAR 檔案

AAR 檔案本身是一個 zip 檔案,在您構建相關應用模組時,庫模組將先編譯到 AAR 檔案中,然後再新增到應用模組中。為了避免常用資源 ID 的資源衝突,請使用在模組(或在所有專案模組)中具有唯一性的字首或其他一致的命名方案。解壓後可以看到如下目錄:

  • aapt
  • aidl
  • AndroidManifest.xml
  • assets
  • classes.jar
  • jni
  • libs
  • R.txt
  • res

四、Android Studio 如何快速執行程式

執行速度嚴重影響了開發效率,雖然換 MBP 後比以前的執行速度提高了三倍,但還是不夠滿意。提高速度主要有如下幾個方法:

  1. 提高編譯記憶體,在工程目錄下的 gradle.properties 檔案中新增如下程式碼:

    org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
    org.gradle.parallel=true
    org.gradle.daemon=true
  2. 在 app 子工程目錄下的 build.gradle 中配置下改成增量編譯和調整 minSdkVersion

    dexOptions {
        incremental true
    }
    
    productFlavors {
        dev {
            // dev utilizes minSDKVersion = 21
            // to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion 15
        }
    }

參考文件

上面是我再查詢資料中做的一些總結,內容不全面和一些不連貫地方。如要更詳細的瞭解請見如下連結: