android gradle配置指南

LemonYang發表於2016-12-02

Gradle簡介

Gradle 是一個基於Ant和Maven概念的專案自動化建構工具。它使用一種基於Groovy的特定領域語言(DSL)來宣告專案設定,這比我們的ANT使用XML構建配置要靈活的多。在編寫配置時,你可以像程式設計一樣靈活,Gradle是基於Groovy的DSL語言,完全相容JAVA。

Android Studio中使用Gradle

Android Studio是使用Gradle進行自動化構建的IDE,當我們在Android Studio新建專案的時候,專案的目錄大抵如下:

├── app #Android App目錄
│   ├── app.iml
│   ├── build #構建輸出目錄
│   ├── build.gradle #構建指令碼
│   ├── libs #so相關庫
│   ├── proguard-rules.pro #proguard混淆配置
│   └── src #原始碼,資源等
├── build
│   └── intermediates
├── build.gradle #工程構建檔案
├── gradle
│   └── wrapper
├── gradle.properties #gradle的配置
├── gradlew #gradle wrapper linux shell指令碼
├── gradlew.bat
├── LibSqlite.iml
├── local.properties #配置Androod SDK位置檔案
└── settings.gradle #工程配置複製程式碼

其中,settings.gradle用於配置project,標明其下有幾個module,比如這裡包含一個:app module(當我們使用Android Studio新增一個在當前專案中新增一個module的時候,會自動的在這個檔案中將新的module的名字include進來)

include ':app'複製程式碼

和settings.gradle在同一目錄下的build.gradle是一個頂級的build配置檔案,在這裡可以為所有project以及module配置一些常用的配置。

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

buildscript {
    repositories {
        jcenter()//使用jcenter庫
    }
    dependencies {
        // 依賴android提供的2.1.2的gradle build
         classpath 'com.android.tools.build:gradle:2.1.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
//為所有的工程的repositories配置為jcenters
allprojects {
    repositories {
        jcenter()
    }
}複製程式碼

Android Gradle基本配置

  • 配置應用的簽名資訊
  • 在android.signingConfigs{}下定義一個或者多個簽名資訊,然後在buildTypes{}配置使用即可。例如:

        android {
    
            signingConfigs {
                release {
                    //指定簽名用的檔案,file對應的根目錄是gradle檔案所在的根目錄
                   storeFile file("release.keystore") 
                    //別名
                    keyAlias "release"
                    //key的密碼
                    keyPassword "123456"
                    //證照的密碼
                    storePassword "123456"
                }
                debug {
                    ...
                }
            }
            buildTypes {
                release {
                    signingConfig signingConfigs.release
                }
                debug {
                    signingConfig signingConfigs.debug
                }
            }
    
        }複製程式碼
  • 啟用proguard混淆息
  • 我們可以為不同的buildTypes選擇是否啟用混淆,一般release釋出版本是需要啟用混淆的,這樣別人反編譯之後就很難分析你的程式碼,而我們自己開發除錯的時候是不需要混淆的,所以debug不啟用混淆。對release啟用混淆的配置如下:

        android{
    
            buildTypes {
    
                release {
                    //是否啟用混淆
                    minifyEnabled true
    
                    //是否去除無效的資原始檔,這個設定依賴於minifyEnabled的設定,因此要兩者同時設定為true才會生效
                    shrinkResources true
    
                    //getDefaultProguardFile('proguard-android.txt')表示獲取SDK下'proguard-android.txt‘檔案中的預設混淆規則
                    //'proguard-rules.pro'表示使用專案根目錄下的 'proguard-rules.pro'檔案中的混淆規則
                    //proguard-rules.pro檔名可以任意,只要在配置檔案中指明即可
                    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    
                }
            }
        }複製程式碼

    此處檢視更多關於proguard的資訊

  • 啟用zipAlign
  • zipalign是一款重要的優化apk應用程式的工具。
    apk包的本質是一個zip壓縮文件,優化的目的是使包內未壓縮的資料能夠有序的排列,從而減少應用程式執行時的記憶體消耗.

        android{
    
            buildTypes {
                release {
                    zipAlignEnabled true
                }
            }
        }複製程式碼
  • 多渠道打包
  • 通過設定productFlavors的值,我們可以指定不同的渠道包,並且每個渠道包可以自定義其applicationId、versionCode以及versionName等資訊

        android  {
            productFlavors {
                dev{
                    applicationId "com.gdut.demo.dev"
                }
    
                qa{
                    applicationId "com.gdut.demo.qa"
                }
    
                pro{
                    applicationId "com.gdut.demo.pro"
                }
            }
        }複製程式碼
  • AndroidManifest裡的佔位符
  • manifestPlaceholders,它允許我們動態替換我們在AndroidManifest檔案裡定義的佔位符。例如:

        <meta-data
         android:name="UMENG_APPKEY"
         android:value="${umeng_app_key}"/>
    
        <meta-data
          android:name="UMENG_SECRET"
          android:value="${umeng_app_secret}"/>
    
    然後我們可以針對不同的flavors或者buildTypes動態的指定相應的值,例如:
    
        buildTypes {
            debug {
                manifestPlaceholders = [umeng_app_key: "替代的內容",umeng_app_secret:"替換的內容"]
            }
        ...
        }複製程式碼
  • 自定義Android BuildConfig
  • BuildConfig.java是Android Gradle自動生成的一個java類檔案,無法手動編譯,但是可以通過Gradle控制,也就是說他是動態可配置的。在 gradle 檔案 buildTypes 或者 productFlavors 下面,如:

        buildTypes {
            release{
                //release的包中BuildConfig.ENDPOINT 就會被賦值為 http://example.com 就可以供 Java 程式碼呼叫了。
                buildConfigField "String", "ENDPOINT", "\"http://example.com\""
            }
        }複製程式碼
  • 動態設定 Android resValue
  • 修改 res value 的方式,比如修改 strings.xml 檔案中的 AppName 的值。在gradle檔案 buildTypes 或者 productFlavors 下面,如:

        buildTypes{
            release{
                //將release的包中名為 AppName 的 string value 值改為 app1
                resValue "string", "AppName", "app1"
            }
        }複製程式碼
  • splits的使用
  • 我們除了可以通過設定buildtypes來進行分類打包之外,還可以根據螢幕大小、cpu架構適配型別來進行分類打包,通過使用splits我們可以達成這個目的,例如

        splits {
            density {
                enable true
                reset()
                include "mdpi", "hdpi"
            }
            abi {
                enable true
                reset()
                include "x86", "mips"
            }
        }複製程式碼

    更多的使用情況以及使用說明請參考android的官方文件:Configure APK Splits

  • 解決方法數限制
  • Android設定的方法數是65536個(DEX 64K problem),超過這個方法數,導致dex無法生成,就無法生成APK.處理這個問題,除了儘可能的進行apk瘦身,減少整個apk的方法數之外,可以進行兩種設定進行解決。

    1. 使用multiDex。開啟分包模式
    
            defaultConfig {
                multiDexEnabled=true
            }
    
    2. 忽略方法數的檢查。2.3版本及以下的手機無法正常安裝
    
            android {
                dexOptions {
                    jumboMode = true
            }複製程式碼
  • dependencies依賴配置
  •     dependencies {
            compile fileTree(include: '*.jar', dir: 'libs')
            compile project(':pullrefresh')
            prodCompile files('src/prod/libs/bankcard-encrypt.jar')
            debugCompile files('src/qa/libs/bugrpt.jar')
        }複製程式碼

    compile配置將被用於編譯main application。它裡面的所有東西都被會被新增到編譯的classpath中,同時也會被打包進最終的APK。 以下是新增依賴時可能用到的其它一些配置選項:

    compile main application(主module)。
    androidTestCompile test application(測試module)
    debugCompile debug Build Type(debug型別的編譯)
    prodCompile prod productFlavors(prod渠道的編譯)複製程式碼

    因為沒有可能去構建一個沒有關聯任何BuildType(構建型別)的APK,APK預設配置了兩個或兩個以上的編譯配置:compile和< buildTypes >Compile. 建立一個新的buildTypes或者productFlavors將會自動建立一個基於它名字的新配置

  • 使用FindBugs
  • FindBugs是一個Java靜態分析工具,用來檢查類或者jar檔案,用來發現可能的問題。檢測完成之後會生成一份詳細的報告,藉助這份報告可以找到潛在的bug,比如NullPointException,特定的資源沒有關閉,查詢資料庫沒有呼叫Cursor.close()等;

    Java的靜態分析工具當然可以無難度的在Android上面執行,通過這種FindBugs的檢查可以讓App的執行更加的穩定。

    FindBugs Gradle外掛使用例項如下:

        apply plugin: "findbugs"
    
        //定義一個task任務,這個任務的型別是FindBugs
        task findbugs(type: FindBugs) {
            //有警告錯誤的時候也是允許構建
            ignoreFailures= true
            effort= "default"
            //報告的級別,Low,Medium,High
            reportLevel= "high"
            println( "$project.buildDir")
            //classes和source分別是對應的.classe資料夾地址,和原始碼檔案地址。
            classes = files("$project.buildDir/intermediates/classes")
            source= fileTree("src/main/java/")
            classpath= files()
            //指定報告型別,有兩種方式xml和html,只允許一種輸出格式
            reports{
                xml.enabled=false
                html.enabled=true
                xml {
                    destination "$project.buildDir/findbugs.xml"
                }
                html{
                    destination "$project.buildDir/findbugs.html"
                }
            }
        }複製程式碼

    參考文獻


    Android Plugin DSL Reference

    Groovy Document

    Gradle Build Language Reference

    Gradle User Guide

    Gradle User Guide 中文版

    相關文章