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

前言

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

AndroidStudio中Gradle文件

默認生成Gradle目錄

咱們新建一個Android項目,AndroidStudio會默認爲咱們生成如下幾個文件,Project的構建文件,Module的構建文件,Project配置文件,混淆規則文件等,那麼這些文件都具備什麼功能,咱們又能夠進行何種配置呢?java

  • settings.gradle
include ':app'

複製代碼

新建的工程,默認只有上述一條語句,用於指示 Gradle 在構建應用時應將哪些模塊包括在內。對大多數項目而言,該文件可能只有上述一條,可是當咱們項目中,引入了其它的功能module,或者業務邏輯module,就須要咱們在include語句中添加相應的module。android

  • build.gradle

build文件有兩個,一個是針對咱們的Module,一個是針對Project。安全

在Project中,默認生成以下配置bash

// 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版本等一些信息添加到該文件中。app

COMPILE_SDK_VERSION = 23
BUILD_TOOLS_VERSION = 23.0.1
VERSION_CODE = 1
複製代碼

而後,咱們就能夠在build文件中進行引用了。引用方式,直接經過變量名就能夠。ide

配置構建

  • 構建類型

構建類型定義 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 看這一篇就夠了 配置構建

相關文章
相關標籤/搜索