2018-08-17 Android Gradle(1)

Android Gradle 插件分類

在android中有三類工程,一類是app應(yīng)用工程,它可以生成一個可運行的apk應(yīng)用;一類是Library庫工程,他可以生成AAR包給其他的App工程公用,就和我們的Jar一樣,但是它包含了Android的資源等信息,是一個特殊的Jar包;最后一類是Test測試工程,用于對APP工程或者Library庫工程進(jìn)行單元測試

  1. APP插件id:com.android.application
  2. Library插件id:com.android.library
  3. Test插件id:com.android.test

通過上面3種不同的插件,就可以配置我們的工程是一個Android App工程,還是一個Android Library工程,或者是一個Android Test測試工程

要應(yīng)用一個插件就必須要知道它的插件id,如果是第三方插件,還需要配置它們的依賴classpath,Android Gradle插件就是屬于第三方插件,他托管在jcenter上,所以應(yīng)用之前,需要先配置依賴classpath

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

buildscript{}閉包可以寫在根工程的build.gradle腳本文件中,這樣所有的子工程就不用重復(fù)配置了

配置好后,就可以在App工程中用了

apply plugin:'com.android.application'

android{
    compileSdkVersion 23
    buildToolsVersion "23.0.1"
}

android{}是Android插件提供的一個擴(kuò)展類型

Android Gradle工程的配置,都是在android{}中,這是唯一的一個入口,通過它,可以讓我們自定義一個Android Gradle工程.

compileSdkVersion是編譯所依賴的Android Sdk的版本

buildToolsVersion是構(gòu)建該Android工程所用構(gòu)建工具的版本

具體實現(xiàn)如下

extension=project.extensions.create('android',getExtensionClass(),(ProjectInternal)project,instantiator,
            androidBuilder,sdkHandler,buildTypeContainer,productFlavorContainer,signingConfigContainer,
            extraModelInfo,isLivraty())

defaultConfig

defaultConfig是默認(rèn)的配置,它是一個ProductFlavor,ProductFlavor允許我們根據(jù)不同的情況同時生成多個不同的APK包,默認(rèn)配置中

applicationId 是配置我們的包名

minSdkVersion是最低支持的Android系統(tǒng)的API Level

targetSdkVersion 表明我們是基于那個Androi版本開發(fā)的

versionCode表明我們的APP應(yīng)用內(nèi)部版本號,一般用于控制App升級

versionName 表明我們的APP應(yīng)用的版本名稱

buildTypes

buildTypes 是一個域?qū)ο?和SourceSet一樣,里面有main,test,release,debug等,我們可以在buildTypes{}里新增任意多的我們需要構(gòu)建的類型

minifyEanbled 是否為該構(gòu)建類型啟用混淆,false表示不啟用

proguardFiles 當(dāng)我們啟用混淆時,所使用的proguard的配置文件,可以根據(jù)接收的參數(shù)同時配置一個或者多個配置文件如

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

getDefaultProguardFile是Android擴(kuò)展的一個方法,用來獲取AndroidSDK 目錄下默認(rèn)的proguard配置文件 文件名就是傳入的參數(shù)名proguard-android.txt

signingConfig

配置默認(rèn)的簽名信息,對生成的App簽名,是ProductFlavor的一個屬性,可以直接對其進(jìn)行配置,方法原型如下

public ProductFlavor setSigningConfig(SigningConfig signingConfig){

    msigningConfig=signingConfig
    
    ruturn this;
}

public SigningConfig getsigningConfig(){
    return mSigningConfig;
    }

默認(rèn)配置如下

signingConfigs {
    release {
      //簽名證書文件,打正式包時,自己生成
      storeFile file('G:/xxx/xxx/xxx.jks')
      //簽名證書密碼
      storePassword 'xxx'
      //簽名證書中的秘鑰別名
      keyAlias 'xxx'
      //簽名證書中的該秘鑰的密碼
      keyPassword 'xxx'
    }

    debug {
      storeFile file('G:/xxx/xxx/xxx.jks')
      storePassword 'xxx'
      keyAlias 'xxx'
      keyPassword 'xxx'
    }
  }

multiDexEnabled

是buildType的一個屬性,用于配置該BuildType是否啟用自動拆分多個Dex的功能,一般用于程序中代碼太多,超過65536個方法的時候,拆分為多個Dex的處理,接收boolean值

shrinkResources

是buildType的一個屬性,用于配置是否自動清理未使用的資源,默認(rèn)為false

zipalign

zipalign是Andoroid提供的一個整理優(yōu)化apk文件的工具,它能提高系統(tǒng)和應(yīng)用的運行效率,更快的讀寫apk中的資源,降低內(nèi)存的使用,所以對于要發(fā)布的app,再發(fā)布之前一定要使用zipalign進(jìn)行優(yōu)化

如果想在release模式開啟zipalign優(yōu)化,需要進(jìn)行如下配置

android{
    buildTypes{
        release{
            aipAlignEnabled true
        }
        debug{
        }
    }
}

批量修改生成的apk文件名

既然要修改生成的apk文件名,那么就要修改Android Gradle打包的輸出,為此,Android對象為我們提供了下列3個屬性

application Variants 僅僅適用于Android 應(yīng)用的Gradle插件

library Variants 僅僅適用于 Android庫 Gradle插件

testVariants 以上兩種Gradle插件都適用

以上三個屬性都返回DomainObjectSet對象集合,如下例

buildTypes {

release {

  xxx...

  android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
      def outputFile = output.outputFile
      if (outputFile != null && outputFile.name.endsWith('.apk')) {

        def fileName = "dayuyoupin-${defaultConfig.versionCode}-${defaultConfig.versionName}-${releaseTime()}-${variant.productFlavors[0].name}.apk"
        //output.outputFile = new File(outputFile.parent, fileName)
        outputFileName = fileName
      }
    }
  }
}

debug {
  signingConfig signingConfigs.debug
}
}

application Variants 是一個DomainObjectCollection集合,我們可以通過all方法進(jìn)行遍歷,遍歷的每一個variant都是一個生成的產(chǎn)物

ext{}

程序中ext{}快表明要為當(dāng)前project創(chuàng)建擴(kuò)展屬性,以供其他腳本引用,就像java里的變量一樣,創(chuàng)建好以后,可以在build.gradle中引用它,如下先創(chuàng)建一個version.gradle,然后引用

version.gradle

ext.name="xxx"

ext{
    appVersionCode=1
    appVersionName="1.0.0"
}

build.gradle 中引用

build.gradle
apply plugin:'java'
apply from: 'version.gradle'

引用java插件時,java就是插件的plugin id

插件可以分為腳本插件和二進(jìn)制插件,from區(qū)分與腳本插件和二進(jìn)制插件,引用第三方發(fā)布的jar包的一些二進(jìn)制插件時,就必須在項目根目錄的build.gradle中的buildscript{}中配置其classpath

隱藏簽名信息

前面我們把項目的簽名信息放在項目中,托管在git上,這樣做雖然非常方便,但存在著一定的安全隱患,如果要安全隱藏,最好的辦法就是將其放在服務(wù)器上,要實現(xiàn)這個,還得有自己的專門用于打包發(fā)版的服務(wù)器,下面以使用環(huán)境變量的方式為例

singingConfigs{
    def appStoreFile=System.getenv("STORE_FILE")
    def appStorePassword=System.getenv("STORE_PASSWORD)
    def appKeyAlias=System.getenv("KEY_PASSWORD"))
    release{
        storeFile file(appStoreFile)
        storePassword appStorePassword
        keyAlias appKeyAlias
        keyPassword appkeyPassword
    }
}

release{
signingConfig signigConfigs.release
}

動態(tài)配置AndroidManifest文件

應(yīng)用于多渠道打包,如下

build.gradle
productFlavors{
    google{}
    baidu{}
}

productFlavors.all{ flavor ->
    mainfestPlaceholders.put("UMENG_CHANNEL",name)
}

mainfest中

<meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />

通過all函數(shù)遍歷每一個ProductFlavor.然后把它們的name作為友盟中渠道的名字,再利用Android Gradle中提供的mainfestPlaceholders占位符的應(yīng)用方式,可以動態(tài)替換掉AndroiMainfest文件中任何${var}格式的占位符

BuildConfig

public final class BuildConfig {
 public static final boolean DEBUG = Boolean.parseBoolean("true");
 public static final String APPLICATION_ID = "com.deepbaytech.tao";
 public static final String BUILD_TYPE = "debug";
 public static final String FLAVOR = "baidu";
 public static final int VERSION_CODE = 0;
 public static final String VERSION_NAME = "1.3.7.debug";
}

DEBUG 用于標(biāo)記是debug還是release模式,其余的還有包名,當(dāng)前構(gòu)建的類型,是debug還是release,當(dāng)前構(gòu)建的渠道,當(dāng)前的版本號以及版本名稱,這些差不多就是我們當(dāng)前構(gòu)建渠道的基本應(yīng)用信息,都是常量,相比于我們獲取這些信息的其他方式,無疑要方便許多

一般在開發(fā)過程中都會輸出日志進(jìn)行調(diào)試,一般只有我們自己開發(fā)中才會打印日志,發(fā)布版本后就 不打印了,也就是我們需要一個標(biāo)記是debug還是release模式的開關(guān),這就是buildConfig.DEBUG,在debug模式下時true.在release模式下它的值會自動變?yōu)閒alse,不用我們自己改動,Android會自動幫我們修改,非常方便.

當(dāng)然我們也可以自己定義,在BuildConfig中新增一些常量.一般利用android Gradle提供的buildConfigField(String type,String name,String value) 來動態(tài)配置.例子如下

假如我們有baidu和google兩個渠道,發(fā)布的時候會有這兩個渠道包,當(dāng)我們安裝baidu渠道包的時候打開的是baidu首頁,當(dāng)我們安裝google渠道包的時候,打開的是google首頁,從這個思路分析,我們只要添加一個字段WEB_URL,在百度渠道包下時http://www.baidu.com,在google渠道包下值為http://www.google.com即可:

productFlavors{
    google{
        buildConfigField 'String','WEB_URL','"http://www.google.com"'
    }
    baidu{
        buildConfigField 'String','WEB_URL','"http://www.baidu.com"'
    }
}

release和debug也可以配置,如下

buildType{
    debug{
        buildConfigField 'String','NAME','"value"'
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,057評論 25 709
  • 這一章主要針對項目中可以用到的一些實用功能來介紹Android Gradle,比如如何隱藏我們的證書文件,降低風(fēng)險...
    acc8226閱讀 7,969評論 3 25
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項,請點擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,365評論 8 72
  • 《重新回到談話中》中說,把自己的全部注意力放在各種電子設(shè)備上的年輕人,無法發(fā)展出完全獨立的自我。 隨時在線的狀態(tài),...
    拙變閱讀 377評論 0 0
  • 也算不來是多少次的夢中驚醒了。夢里的你變得自信快樂甚至有些許放蕩,和我知道的你不一樣,大概這才是真正的你也...
    木星牧星人閱讀 315評論 0 0

友情鏈接更多精彩內(nèi)容