android gradle配置指南

Gradle簡介

Gradle 是一個基於Ant和Maven概念的項目自動化建構工具。它使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置,這比咱們的ANT使用XML構建配置要靈活的多。在編寫配置時,你能夠像編程同樣靈活,Gradle是基於Groovy的DSL語言,徹底兼容JAVA。javascript

Android Studio中使用Gradle

Android Studio是使用Gradle進行自動化構建的IDE,當咱們在Android Studio新建項目的時候,項目的目錄大抵以下:html

├── 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進來)java

include ':app'複製代碼

和settings.gradle在同一目錄下的build.gradle是一個頂級的build配置文件,在這裏能夠爲全部project以及module配置一些經常使用的配置。linux

// 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

    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啓用混淆的配置以下:git

    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的信息github

  • 啓用zipAlign
  • zipalign是一款重要的優化apk應用程序的工具。
    apk包的本質是一個zip壓縮文檔,優化的目的是使包內未壓縮的數據可以有序的排列,從而減小應用程序運行時的內存消耗.shell

    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 中文版

    相關文章
    相關標籤/搜索