關於Android Gradle你需要知道這些(2)

Jensen95發表於2018-01-20

前言

前一篇文章,對Gradle進行了一個概述,同時對於Groovy語言進行了簡單的介紹,有了之前的基礎,現在就可以進行更細緻化的學習,來學習一下在AndroidStudio中如何來配置我們的Build檔案,來完成一些特定的功能,進行自定義構建。本文將先從各個gradle檔案入手,分析各個檔案中,我們可以進行哪些配置,這些配置又可以起到什麼作用,如何通過gradle來滿足對於構建的自定義需求。

AndroidStudio中Gradle檔案

預設生成Gradle目錄

我們新建一個Android專案,AndroidStudio會預設為我們生成以下幾個檔案,Project的構建檔案,Module的構建檔案,Project配置檔案,混淆規則檔案等,那麼這些檔案都具有什麼功能,我們又可以進行何種配置呢?

  • settings.gradle
include ':app'

複製程式碼

新建的工程,預設只有上述一條語句,用於指示 Gradle 在構建應用時應將哪些模組包括在內。對大多數專案而言,該檔案可能只有上述一條,但是當我們專案中,引入了其它的功能module,或者業務邏輯module,就需要我們在include語句中新增相應的module。

  • build.gradle

build檔案有兩個,一個是針對我們的Module,一個是針對Project。

在Project中,預設生成如下配置

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'

        // NOTE: Do not place your application dependencies here; they belong in the individual module build.gradle files
    }
}

複製程式碼

在Project的build檔案中,我們可以來新增一些子module所共有的一些配置,而無需單獨在每一個子module中進行配置。可進行依賴倉庫是jcenter還是其它依賴倉庫等。在module中預設生成的是對於我們的module自身構建的時候進行的一些配置選項。

  • gradle.properties

為gradle的配置檔案,裡面可以定義一些常量供build.gradle使用,如版本號等,當隨著我們的業務增長,build檔案也會變大,可維護性變差,當我們想修改一些內容的時候,需要逐個去找,但是,當我們將其中的一些配置常量放置在一個單獨的檔案中,相比之前,可維護性就有所提升。我們可以將構建SDK版本等一些資訊新增到該檔案中。

COMPILE_SDK_VERSION = 23
BUILD_TOOLS_VERSION = 23.0.1
VERSION_CODE = 1
複製程式碼

然後,我們就可以在build檔案中進行引用了。引用方式,直接通過變數名就可以。

配置構建

  • 構建型別

構建型別定義 Gradle 在構建和打包您的應用時使用的某些屬性,通常針對開發生命週期的不同階段進行配置。例如,除錯構建型別支援除錯選項,使用除錯金鑰簽署 APK;而釋出構建型別則可壓縮、混淆 APK 以及使用釋出金鑰簽署 APK 進行分發。您必須至少定義一個構建型別才能構建應用——Android Studio 預設情況下會建立除錯和釋出構建型別。要開始為應用自定義打包設定,請學習如何配置構建型別。

預設構建方式

defaultConfig {
        applicationId "com.chenjensen.gradlelearn"
        minSdkVersion 14
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

複製程式碼

我們可以根據自己的需求,比如只針對釋出的版本進行混淆等操作,而對於debug版本不進行,我們可以在buildType中進行配置。

  buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        debug {
            
        }
   }

複製程式碼
  • 產品風味

產品風味代表您可以釋出給使用者的不同應用版本,例如免費和付費的應用版本。您可以將產品風味自定義為使用不同的程式碼和資源,同時對所有應用版本共有的部分加以共享和重複利用。產品風味是可選項,並且您必須手動建立。我們可以在productFlavors {} 程式碼塊中配置我們所需要的的設定。產品風味支援與 defaultConfig 相同的屬性,這是因為 defaultConfig 實際上屬於 ProductFlavor 類。這意味著,您可以在 defaultConfig {} 程式碼塊中提供所有風味的基本配置,每種風味均可替換任何預設值,例如 applicationId。

ApplicationId用來作為我們的APK的包名,用來對於不同的包的區分,對於manifest中的package欄位則是用來命名資源類的包名,最後生成的 R 類檔案位於該包下,如果其他包裡面的程式碼需要引用資源時可通過該路徑進行呼叫。

例如

productFlavors {
        demo {
            applicationId "com.example.myapp.demo"
            versionName "1.0-demo"
        }
        full {
            applicationId "com.example.myapp.full"
            versionName "1.0-full"
        }
    }

複製程式碼

通過對於產品風味的配置,我們可以針對不同的應用市場釋出不同的應用包,針對不同的應用包,我們可以進行細緻化到具體的SDK版本等的配置。採用的不同的應用市場分發,可以讓我們針對不同應市場下發下的下載率的採集。

  • 依賴項

構建系統管理來自您的本地檔案系統以及來自遠端儲存區的專案依賴項。這樣一來,您就不必手動搜尋、下載依賴項的二進位制檔案包以及將它們複製到專案目錄內。

Android中有三種新增依賴的方式

 //依賴我們本地的module
 compile project(":mylibrary")
 //遠端的二進位制依賴項
 compile 'com.android.support:appcompat-v7:25.1.0'
 //本地二進位制依賴方式,將檢測我們的本地的libs中的jar檔案
 compile fileTree(dir: 'libs', include: ['*.jar'])
 //javaTest依賴
 testCompile 'junit:junit:4.12'    
 //AndroidTest依賴
 androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'

複製程式碼

當我們新增了一個依賴,該依賴還依賴了其它的依賴,而我們想把其中的一個依賴去掉,compile方法,可以接受一個閉包引數,我們可以利用這個閉包來將其中的部分依賴剔出掉。

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

複製程式碼

通過compile配置,Gradle 將此配置的依賴項新增到類路徑和應用的 APK。除了compile配置,還有apk,provided。

  • apk

指定 Gradle 需要將其與應用的 APK 一起打包的僅執行時依賴項。您可以將此配置與 JAR 二進位制依賴項一起使用,而不能與其他庫模組依賴項或 AAR 二進位制依賴項一起使用。

  • provided

指定 Gradle 不與應用的 APK 一起打包的編譯時依賴項。如果執行時無需此依賴項,這將有助於縮減 APK 的大小。您可以將此配置與 JAR 二進位制依賴項一起使用,而不能與其他庫模組依賴項或 AAR 二進位制依賴項一起使用。

  • 生成SO
ndk{
    moduleName "hello"       //生成的so檔名字,呼叫C程式的程式碼中會用到該名字
    abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種平臺下的so庫
}
複製程式碼

Gradle在執行的時候會自動的從lib目錄下找相應的C/C++檔案,生成相應的so檔案。

  • 簽署

構建系統可以在構建配置中指定簽署設定,並可在構建過程中自動簽署您的 APK。構建系統通過使用已知憑據的預設金鑰和證照籤署除錯版本,以避免在構建時提示密碼。除非為此構建顯式定義簽署配置,否則,構建系統不會簽署釋出版本。如果沒有釋出金鑰,可以按簽署應用中所述生成一個。由於除錯證照通過構建工具建立並且在設計上不安全,大多數應用商店(包括 Google Play 商店)都不接受使用除錯證照籤署要釋出的 APK。

簽署的應用

應用升級:當系統安裝應用的更新時,它會比較新版本和現有版本中的證照。如果證照匹配,則系統允許更新。如果使用不同的證照籤署新版本,則必須為應用分配另一個軟體包名稱 - 在此情況下,使用者將新版本作為全新應用安裝。

應用模組化:Android 允許通過相同證照籤署的多個 APK 在同一個程式中執行(如果應用請求這樣),以便系統將它們視為單個應用。通過此方式,可以在模組中部署您的應用,且使用者可以獨立更新每個模組。

在您建立簽署配置時,Android Studio 會以純文字形式將您的簽署資訊新增到模組的 build.gradle 檔案中。如果是團隊協作開發或者將您程式碼開源,那麼應當將此敏感資訊從構建檔案中移出,以免被其他人輕易獲取。為此,建立一個單獨的屬性檔案來儲存安全資訊。然後在本地獲取外部檔案的配置,然後在釋出程式碼的時候,保留我們的祕鑰配置檔案。

  • 在專案的根目錄下建立一個名稱為 keystore.properties 的檔案。
storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

複製程式碼
  • 在模組的 build.gradle 檔案中,於 android {} 塊的前面新增用於載入 keystore.properties 檔案的程式碼
def keystorePropertiesFile = file("keystore.properties")

// Initialize a new Properties() object called keystoreProperties.
def keystoreProperties = new Properties()

// Load your keystore.properties file into the keystoreProperties object.
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
複製程式碼
  • 使用語法 keystoreProperties['屬性名稱'] 引用儲存在 keystoreProperties 中的屬性。修改模組 build.gradle 檔案的 signingConfigs 塊,以便使用此語法引用儲存在 keystoreProperties 中的簽署資訊。
android {
    signingConfigs {
        config {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    ...
  }

複製程式碼
  • ProGuard

構建系統讓您能夠為每個構建變體指定不同的 ProGuard 規則檔案。構建系統可在構建過程中執行 ProGuard 對類進行壓縮和混淆處理。程式碼壓縮通過 ProGuard 提供,ProGuard 會檢測和移除封裝應用中未使用的類、欄位、方法和屬性,包括自帶程式碼庫中的未使用項(這使其成為以變通方式解決 64k 引用限制的有用工具)。ProGuard 還可優化位元組碼,移除未使用的程式碼指令,以及用短名稱混淆其餘的類、欄位和方法。混淆過的程式碼可令您的 APK 難以被逆向工程。對於ProGuard更詳細的介紹可以參考之前關於專案構建的文章。

開啟程式碼壓縮

minifyEnabled true

複製程式碼

啟用ProGuard規則

proguardFiles getDefaultProguardFile(‘proguard-android.txt'),
                		'proguard-rules.pro'

複製程式碼
  1. getDefaultProguardFile(‘proguard-android.txt') 方法可從 Android SDK tools/proguard/ 資料夾獲取預設 ProGuard 設定。
  2. proguard-rules.pro 檔案用於新增自定義 ProGuard 規則。預設情況下,該檔案位於模組根目錄

每次執行完成ProGuard之後,都會產生如下檔案

  • dump.txtAPK 中所有類檔案的內部結構。
  • mapping.txt 提供原始與混淆過的類、方法和欄位名稱之間的轉換。 seeds.txt 列出未進行混淆的類和成員。 usage.txt 列出從 APK 移除的程式碼。 這些檔案儲存在 /build/outputs/mapping/release/。

對於其中一些類,我們不想對其進行混淆的,需要我們在ProGuard 配置檔案中新增一行 -keep 程式碼。例如:

-keep public class MyClass
複製程式碼

參考文章

Android Gradle 看這一篇就夠了 配置構建

相關文章