1. 程式人生 > >Android開發常用的gradle配置總結

Android開發常用的gradle配置總結

1. Project中build.gradle

project下的build.gradle是基於整個project的配置,主要配置gradle 版本及 全域性依賴倉庫、庫或者其他全部引數。
android studio 現在重要倉庫採用jcenter(),之前版本放在mavenCentral。
另外有時還沒有加入jcenter()倉庫的第三方庫,也需要在這裡配置他們的庫地址。
需要在這裡配置,才能將第三方庫拉下來

buildscript {
     //構建過程依賴的倉庫
    repositories {
        jcenter()
    }

    //構建過程需要依賴的庫
    dependencies {
        //宣告的是gradle外掛的版本
        classpath 'com.android.tools.build:gradle:2.0.0'

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

allprojects {
    //這裡面配置整個專案依賴的倉庫,這樣每個module就不用配置倉庫了
    repositories {
        jcenter()

        maven {
            // LeanCloud 的包倉庫
            url "http://mvn.leancloud.cn/nexus/content/repositories/releases"
        }
    }
}

//配置全域性變數
ext {
    // module依賴庫公共版本號
    SupportXVersion = '23.2.0'
    GsonVersion = '2.6.2'
    LeanCloudVersion = 'v3.13.4'
    JunitVersion = '4.12'

    compileSdkVersion = 22
    buildToolsVersion = "23.0.1"
    minSdkVersion = 10
    targetSdkVersion = 22
    versionCode = 34
    versionName = "v2.6.1"
}
注:大家可能很奇怪,為什麼倉庫repositories需要宣告兩次,這其實是由於它們作用不同,buildscript中的倉庫是gradle指令碼自身需要的資源,而allprojects下的倉庫是專案所有模組需要的資源

2. module中build.gradle

//申明使用外掛,表明要編譯的內容和產物,
//com.android.application 表明該module 為android 應用
//com.android.library 表明為library庫
//java 表名是java庫
apply plugin: 'com.android.application'

//安卓構建過程需要配置的引數
android {
    //編譯SDK的版本
    compileSdkVersion COMPILE_SDK_VERSION as int
    //buildtool 的版本
    buildToolsVersion BUILD_TOOLS_VERSION

    /預設配置,會同時應用到debug和release版本上
    defaultConfig {
        //應用包名
        applicationId APPLICATION_ID
        //支援最小android sdk 版本
        minSdkVersion MIN_SDK_VERSION as int
        // 目標版本
        targetSdkVersion TARGET_SDK_VERSION as int
        //應用版本號
        versionCode VERSION_CODE as int
        //應用版本名稱
        versionName VERSION_NAME

        /// 配置生成的 BuildConfig 檔案中的常量,程式碼引用直接 
        buildConfigField "String", "LOG_TAG", LOG_TAG // 日誌tag
        buildConfigField "String", "LOG_HTTP_TAG", LOG_TAG_HTTP // http日誌tag
        buildConfigField "String", "LOG_WEB_TAG", LOG_TAG_WEB // web日誌tag

      // 預設是UMENG_CHANNEL_VALUE為umeng
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]

      // dex突破65535的限制
        multiDexEnabled true
    }

    //java版本號
    compileOptions{
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    //簽名
    signingConfigs {
        release {
            //簽名檔案
            storeFile file(STORE_FILE)
            storePassword STORE_PASSWORD
            keyAlias KEY_ALIAS
            keyPassword KEY_PASSWORD
        }
    }
    // 為了解決部分第三方庫重複打包了META-INF的問題
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }

    //移除lint檢測的error
    lintOptions {
        abortOnError false
    }

    //編譯型別
    //其中debug, release是gradle預設自帶的兩個build type, 當然你可以定義其他型別。
    //可以針對不停編譯的版本中配置不同的引數,比如混淆、簽名等。preview
    buildTypes {
        debug {
            minifyEnabled false
            zipAlignEnabled false
            shrinkResources false
        }

         preview {
            debuggable false // 是否保留除錯資訊
            minifyEnabled true  //是否混淆
            zipAlignEnabled true // 包優化
            shrinkResources true // 移除不必要的資源

            // 簽名
            signingConfig signingConfigs.release
            // 程式碼混淆規則檔案
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        release {
            //加上字尾
            applicationIdSuffix ".release"
            minifyEnabled true //是否混淆
            zipAlignEnabled true // zip對齊優化
            shrinkResources true // 移除不必要的資源

            // 不顯示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"

            // 簽名
            signingConfig signingConfigs.release
            //混淆檔案的位置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    // 多渠道
    productFlavors {
        //可以設定不同渠道渠道號,應用名稱
        dev { // 開發
            buildConfigField "String", "CHANNEL_NUMBER", '"11111"'
        }
        '360' {
            buildConfigField "String", "CHANNEL_NUMBER", '"11112"'
        }
        GooglePlay {
            buildConfigField "String", "CHANNEL_NUMBER", "11113"'

    }
    // 多渠道批量替換
    productFlavors.all { flavor ->
         //批量修改Manifest佔位符替換
        //在Manifest使用`${UMENG_CHANNEL_VALUE}`,`LEANCLOUD_CHANNEL_VALUE`,打包時將替換成渠道名,例如UMENG_CHANNEL_VALUE="dev";
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name, LEANCLOUD_CHANNEL_VALUE: name]
        // Project Properties->_myAPPBuildVersionName,用於程式整合下命令列修改
        if (project.hasProperty('_myAPPBuildVersionName')) {
            defaultConfig.versionName = _myAPPBuildVersionName
        }
    }

     //定義變數
     //gradle 可以用def定義一些值例如:def KeyPassword = "123123" 
     def releaseTime() {
         return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
     }


    // 批量打包
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                def fileName
                if (variant.buildType.name.equals('release')) {
                    // myAPP_v版本號_渠道名.apk
                    fileName = "myAPP_v${variant.versionName}_${variant.productFlavors[0].name}.apk"
                } else {
                    // myAPP_v版本號_渠道名_時間_編譯型別名.apk
                    fileName = "myAPP_v${variant.versionName}_${variant.productFlavors[0].name}_${releaseTime()}_${variant.buildType.name}.apk"
                }
                output.outputFile = new File(outputFile.parent + "/${variant.buildType.name}", fileName)
            }
        }
    }


}

//依賴第三方庫
dependencies {
   //編譯libs目錄下所以jar包
   //compile files('libs/xxx.jar')   匯入一個特定jar包
    compile fileTree(dir: 'libs', include: ['*.jar'])//匯入所有的jar包
    compile project(':core')
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.android.support:recyclerview-v7:23.1.1'
    compile 'com.android.support:cardview-v7:23.1.1'
}

注意:
  • buildToolsVersion這個需要你本地安裝該版本才行,很多人匯入新的第三方庫,失敗的原因之一是build version的版本不對,這個可以手動更改成你本地已有的版本或者開啟 SDK Manager 去下載對應版本。
  • proguardFiles這部分有兩段,前一部分代表系統預設的android程式的混淆檔案,該檔案已經包含了基本的混淆宣告,免去了我們很多事,這個檔案的目錄在/tools/proguard/proguard-android.txt , 後一部分是我們專案裡的自定義的混淆檔案,目錄就在app/proguard-rules.pro ,在這個檔案裡你可以宣告一些第三方依賴的一些混淆規則,最終混淆的結果是這兩部分檔案共同作用的。
  • 一般重要的資訊,例如簽名信息,可以直接將資訊寫到gradle.properties,然後在然後在build.gradle中引用即可。
  • 多渠道的關鍵在於定義不同的product flavor。
    注意:這裡的flavor名如果是數字開頭,必須用引號引起來。
  • buildTypes是指建構的型別,一般只用兩種預設型別 debug 和 release ,顧名思義 debug 用來配置開發過程中的一些內容;release 用來配置正式釋出版本的內容。有時我們需要釋出介於debug與release之間的preview 版本。

3. Project中setting.gradle

這個檔案是全域性的專案配置檔案,裡面主要宣告Project中所包括的所有module,

//一個Project中所包括的所有module
include ':app', ':model',':lib', ':core'

4. Project中gradle.properties

gradle.properties為gradle的配置檔案,裡面可以定義一些常量供build.gradle使用,比如可以配置簽名相關資訊如keystore位置,密碼,keyalias等,build.gradle就可以直接引用
gradle 中的一些配置引數建議寫到gradle.properties

//編譯版本資訊
APPLICATION_ID = com.jin.myAPP
COMPILE_SDK_VERSION = 23
BUILD_TOOLS_VERSION = 23.0.1
MIN_SDK_VERSION = 15
TARGET_SDK_VERSION = 1
VERSION_CODE = 1
VERSION_NAME = 1.0.0.0

//keystore資訊
STORE_FILE = ../app/mykey.keystore
STORE_PASSWORD = your password
KEY_ALIAS = your alias
KEY_PASSWORD = your password

5. ext配置全域性引數

project的build.gradle中的ext可以為各位module進行全域性配置引數,防止各個module之間的不統一,不可控。而且當我們升級sdk、build tool、target sdk等,幾個module都要更改,非常的麻煩。

ext {
    compileSdkVersion = 22
    buildToolsVersion = "23.0.1"
    minSdkVersion = 10
    targetSdkVersion = 22
    versionCode = 34
    versionName = "v2.6.1"
}
然後在各自module的build.gradle中引用:
android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
   defaultConfig {
      applicationId "com.xxx.xxx"
      minSdkVersion rootProject.ext.minSdkVersion
      targetSdkVersion rootProject.ext.targetSdkVersion
      versionCode rootProject.ext.versionCode
      versionName rootProject.ext.versionName
    }
}

6. resValue 定義資源。

例如resValue "string" 就是字串資源,可以用R.String 來引用對應的字串資源

android {
     defaultConfig {
         resValue "string", "build_time", buildTime()
         resValue "string", "build_host", hostName()
         resValue "string", "build_revision", revision()
      }
 }
  def buildTime() {
     return new Date().format("yyyy-MM-dd HH:mm:ss")
  }

  def hostName() {
     return System.getProperty("user.name") + "@" +InetAddress.localHost.hostName
   }

  def revision() {
    def code = new ByteArrayOutputStream()
       exec {
          commandLine 'git', 'rev-parse', '--short', 'HEAD'
          standardOutput = code
        }
    return code.toString()
    }
上述程式碼實現了動態的添加了3個字串資源: build_time、build_host、build_revision, 然後在其他地方可像如引用字串一樣使用如下:
 // 在Activity裡呼叫
getString(R.string.build_time) // 輸出2015-11-07 17:01
getString(R.string.build_host) // 輸出[email protected],這是我的電腦的使用者名稱和PC名
getString(R.string.build_revision) // 輸出3dd5823, 這是最後一次commit的sha值

7. PlaceHolder

manifest的一些值我們可以用PlaceHolder處理。例如

在gradle中改成
 manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]

可以放在defaultConfig中設定預設值,或者放在productFlavors中根據不同渠道修改成不同值。或者批量修改

  productFlavors.all { 
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] 
    }

8. 匯入某個project

如果你的app是多模組的,假設有兩個模組app和lib,並且app模組是依賴lib的,這時候我們就需要在app模組的build.gradle中的dependencies結點下配置依賴:

compile project(':lib')
並且你需要在settings.gradle中把lib模組包含進來:
include ':lib',':app'
此外,這種情況下lib模組是作為庫存在的,因而它的build.gradle中的外掛宣告通常應該是這樣的:
apply plugin: 'com.android.library'

而且,作為library的模組lib的build.gradle檔案的defaultConfig中是不允許宣告applicationId的,這點需要注意。

9. 引用本地aar:

  • 首先將你的庫通過android studio 執行打包成aar檔案。執行後在/build/output/aar資料夾中。
  • 首先將aar檔案放到模組的libs目錄下,然後在該模組的build.gradle中宣告flat倉庫:
    repositories{
       flatDir {
          dirs 'libs'
      }
    }

  • 最後在dependencies結點下依賴該aar模組:
    dependencies{
      compile (name:'xxx',ext:'aar')
    }

10. BuildConfig

在build.gradle中配置buildConfigField引數,編譯後會在..\app\build\generated\source\buildConfig資料夾下會自動生成對應版本對應module的BuildConfig.java。BuildConfig就會包含對應版本的配置資訊。程式中可以直接引用這些資料。例如BuildConfig.DEBUG。

public final class BuildConfig {
    public static final boolean DEBUG = Boolean.parseBoolean("true");
    public static final String BUILD_TYPE = "debug";
    public static final String FLAVOR = "360";
    public static final int VERSION_CODE = 45;
    public static final String VERSION_NAME = "3.2.0.0";
    // Fields from build type: debug
    public static final String HOST_IMG_SERVER = "img";
    public static final String HOST_SERVER = "test";
    // Fields from product flavor: 360
    public static final String CHANNEL_NUMBER = "232100";
}

11. module 調整目錄結構sourceSets

預設情況下,java檔案和resource檔案分別在src/main/java和src/main/res目錄下,在build.gradle檔案,andorid{}裡面新增下面的程式碼,便可以將java檔案和resource檔案放到src/java和src/resources目錄下。

sourceSets {
   main {
      java {
          srcDir 'src/java'
      }
      resources {
        srcDir 'src/resources'
     }
   }
}

更簡便的寫法是:

sourceSets {
   min.java.srcDirs = ['src/java']
   min.resources.srcDirs = ['src/resources']
}

12. Gradle常用命令

上面大家接觸了一些命令如 ./gradlew -v ./gradlew clean ./gradlew build, 這裡注意是./gradlew,./代表當前目錄,gradlew代表 gradle wrapper,意思是gradle的一層包裝,大家可以理解為在這個專案本地就封裝了gradle,即gradle wrapper, myAPP/gradle/wrapper/gralde-wrapper.properties**檔案中聲明瞭它指向的目錄和版本。只要下載成功即可用grdlew wrapper的命令代替全域性的gradle命令。

理解了gradle wrapper的概念,下面一些常用命令也就容易理解了。

./gradlew 下載更新gradle
./gradlew -v 版本號
./gradlew assemble 構建專案輸出
./gradlew check 執行檢測和測試任務
./gradlew clean 清除9GAG/app目錄下的build資料夾
./gradlew build 執行check和assemble,檢查依賴並編譯打包
這裡注意的是 ./gradlew build 命令把debug、release環境的包都打出來,如果正式釋出只需要打Release的包,該怎麼辦呢,下面介紹一個很有用的命令assemble<build type="" name="">, 如</build>
./gradlew assembleDebug 編譯並打Debug包
./gradlew assembleRelease 編譯並打Release的包所有渠道的
./gradlew assembleWandoujiaRelease 編譯並打包豌豆莢的Release版本
./gradlew assembleWandoujia 編譯並打包豌豆莢的所有版本
./gradlew installRelease Release模式打包並安裝
./gradlew uninstallRelease 解除安裝Release模式包


相關推薦

Android開發常用gradle配置總結

1. Project中build.gradle project下的build.gradle是基於整個project的配置,主要配置gradle 版本及 全域性依賴倉庫、庫或者其他全部引數。 android studio 現在重要倉庫採用jcenter(),之前版本放在mavenCentral。 另外有時還沒

Android Studio 2.2 ndk開發環境 gradle配置

AndroidStudio2.2中 對於ndk/jni 建議使用cmake進行編譯 而對於純粹的android程式設計師來說,cmake不是經常接觸的方案,我在遇到jni相關時也遇到了一些問題,這裡拋磚引玉吧 開發環境: Android SDK/NDK Android St

Android開發常用的開源專案總結[一]

最近Android開發的過程中,遇到一些常見的需求,開源專案可以滿足需求,使用開源專案可以迅速的把APP框架搭起來,提升開發效率,再次總結一下,方便後續的開發流程。   001 檔案下載  FileDownloader      7.

Android開發常用知識總結

1、在Android應用程式中,選單中通過點選選單呼叫手機中另一個已經安裝的軟體,如視訊監控程式 Intent intent = new Intent(); ComponentName comp =

Android開發——常用的程式碼混淆配置

前言 在Android開發當中,必不可少的是混淆配置。可是我們要做程式碼混淆呢?我來跟大家分享一下我開發的時候做程式碼混淆檔案配置吧! 程式碼混淆的好處 程式碼混淆,增加逆向之後的解讀的難度; 精簡程式碼,刪掉沒有用到的程式碼,減小apk的體積。

Android開發Gradle筆記整理2-Gradle常用命令及UMeng多渠道打包實戰

Title:Android開發之Gradle筆記整理2——Gradle常用命令及UMeng多渠道打包實戰 Date:2015-04-06 21:54:47 Category:Android Develop Tag:技術,生活,Android Develop

Android Studio常用功能配置,讓開發更高效(一)

1、程式碼提示不區分大小寫 File | Settings 開啟設定,選擇Editor | General | Code Completion Case sensitive completion

Android測試 常用adb命令總結

文件夾復制 管理器 over 撥號 tomat 坐標 eclipse 行修改 rem 針對移動端 Android 的測試, adb 命令是很重要的一個點,必須將常用的 adb 命令熟記於心, 將會為 Android 測試帶來很大的方便,其中很多命令將會用於自動化測試的腳本當

android studio】 gradle配置成本地離線zip包

html onu androi com 1.5.0 str 技術 5.0 使用場景 原文:【android studio】 gradle配置成本地離線zip包 關鍵詞:dist

Android studio中gradle配置打jar包和生成Javadoc文件

Android studio 中生成Javadoc 使用Android studio提供的生成Javadoc的方法(之前沒有想要使用這種方式的原因是因為當時以為使用這種方式的話每次生成都需要選擇想要生成的java檔案, 過於麻煩), 最後發現, 使用這種方式只有配置過一次規則之後, 這個規則

Android常用ADB命令總結

1. 檢視當前執行的Activity 方法一: adb shell logcat | grep ActivityManager 方法二: adb shell dumpsys activity activities 2. 檢視安裝包資訊 輸出安裝包資訊:

Android之build.gradle配置簽名

1 問題 android簽名除了我們用android studio build->generate Signed Apks ... 我們還可以自己用build.gradle構建,容易忘記還是記錄下來       2 配置如下 1

android 開發環境變數配置

環境變數配置<java部分>:  變數名(N):  JAVA_HOME 變數值(V):  C:\Program Files\Java\jdk1.8.0_05 變數名(N): &n

記錄Android開發常用框架

目前比較流行的開發方式組合:RxJava+Retrofit+MVP,這個可以看看下面這個使用https://github.com/youxin11544/MVP-RxJava-Hybride;https://github.com/ReactiveX/RxJavahttps://github.com/

Android開發藝術探索——————要點總結

  Activity異常情況的生命週期: 預設情況下,Activity不做特殊處理,當系統配置發生改變後,Activity會被銷燬並重建 。由於Activity是在異常情況下終止的,系統會呼叫onSaveInstanceState來儲存當前Activity的狀態(在onStop之前)。當Acti

Android開發常用的依賴和外掛

依賴 //image-loader依賴 implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' //tablayout依賴 implementation 'com.androi

android開發之svg全面總結

VectorDrawable Vector Drawable是Google從Android 5.0開始引入的一個新的Drawable子類,能夠載入向量圖(低版本中需要做相容,如何相容低版本下文提及),android中vector Drawable通過配置xml再設定到要使用的控制元件

Android開發常用的測試用具

1. adb 安卓除錯橋(android debug bridge),是一個通用命令列工具,其允許您與模擬器例項或連線的 Android 裝置進行通訊。可以實現安裝、解除安裝以及除錯應用等功能。 2. fiddler Fiddler是一個http協議除錯代理工具,它能夠記錄並檢查所有

Android開發常用功能

new Thread(new MyThread()).start();   4.取消的話將isLive設定為false就行了 2.Android延時操作 下面是三種方法: 跟上面的定時操作異曲同工 一、執行緒  new Thread(new Runnable(){          public void r

前端開發常用es6知識總結

專案開發中一些常用的es6知識,主要是為以後分享小程式開發、node+koa專案開發以及vueSSR(vue服務端渲染)做個前置鋪墊。 專案開發常用es6介紹(點選檢視詳細) 1、塊級作用域 let const  2、箭頭函式及this指向 3、promise、