1. 程式人生 > >android全域性配置抽取-gradle.properties

android全域性配置抽取-gradle.properties

概述

android工程中有一個非常重要的檔案-gradle.properties,它主要用於儲存一些全域性性配置,例如 jvm 的配置等,除此之外,業務層面的配置也可以抽取出來放在此處,方便各個module呼叫。

預設的 gradle.properties 長這樣:

# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true

如上格式的內容是典型的 ini 格式的檔案,配置項通過回車符來分割。

使用場景

為支援自動化編譯android工程,我們需要把配置集中起來,方便動態替換,有如下要求需要滿足:
1. 應用Id 可以配置 (對應 build.gradle => applicationId)
2. 應用版本 VersionName 和 VersionCode 可以配置 (對應 build.gradle => versionCode | versionName)
3. 應用名稱 Name 可以配置 (對應 AndroidManifest.xml => android:label,這裡有坑,請往下看)
4. 百度定位Key 可以配置 (對應 AndroidManifest.xml => meta-data)
5. 啟動頁面 可以配置 ( 對應 MainActivity.java => 變數)

將如上需要配置的地方抽取出來到統一的地方,那就是gradle.properties檔案。

寫入配置

gradle.properties檔案中,配置如下:

AppID=com.gz.debugtool
AppVersionName=1.0
AppVersionCode=1
StartPage=index.html
BaiduKey=u91cPvSUevIzvOhBdBGU7iv5mSb6mHDs

build.gradle檔案中讀配置

想要在build.gradle 中讀取配置,直接 project.keyName 即可,例如 應用Id 和應用版本的配置如下:

defaultConfig {
     applicationId project.AppID //讀取應用Id
     minSdkVersion 19
     targetSdkVersion 25
     versionCode project.AppVersionCode as int  //讀取版本號 轉換成數字
     versionName project.AppVersionName //讀取版本名稱
}

AndroidManifest.xml中讀配置

在Manifest讀取配置,其實是 Gradle 替換文字的過程,也就是在 Build 階段會動態替換 該檔案中的佔位符。例如 BaiduKey 的配置替換:
在 build.gradle => buildTypes 中先定義需要替換的Key,使用manifestPlaceholders欄位:

buildTypes {
        release {
            manifestPlaceholders = [BAIDU_APPKEY_VALUE: BaiduKey]
            //...
        }
        debug {
            manifestPlaceholders = [BAIDU_APPKEY_VALUE: BaiduKey]
            //...
        }
    }

然後,在AndroidManifest.xml中這樣使用:

<meta-data
     android:name="com.baidu.lbsapi.API_KEY"
     android:value="${BAIDU_APPKEY_VALUE}" >
 </meta-data>

對於manifestPlaceholders的配置,實際是可以有多個的(通過逗號隔開),可以這樣寫:

 manifestPlaceholders = [
     BAIDU_APPKEY_VALUE: BaiduKey,
     Key1: Value1,
     Key2: Value2
 ]

來看看底層原始碼,發現 manifestPlaceHolders 接收 Map 型別的引數,上述配置多個,使用[可能會讓開發者詫異,這只是gradle的語法問題(我們可能習慣來使用 { })。

public void setManifestPlaceholders(Map<String,Object> manifestPlaceholders){
    this.mManifestPlaceholders.clear();
    this.mManifestPlaceholders.putAll(manifestPlaceholders);
    //...
}

MainActivity.java中讀取配置

在java程式碼中讀取配置,其實是動態編譯的過程,它會先在 BuildConfig.java中生成對應的靜態變數, 而後在java程式碼中才能引用。
在 build.gradle => buildTypes 中先定義需要生成靜態變數的的Key ,使用 buildConfigField定義欄位型別type、欄位name以及具體的value(指向gradle.properties的key)

buildTypes {
    release {
        buildConfigField "String", "StartPage", "\"${StartPage}\""
        //...
    }
    debug {
        buildConfigField "String", "StartPage", "\"${StartPage}\""
        //...
    }
}

經過Gradle Sync 後,可以在BuildConfig.java中看到自動生成的程式碼:

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.gz.debugtool";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  // Fields from build type: debug
  public static final String StartPage = "index.html";  //這裡是自動生成的靜態變數
}

在MainActivity.java中使用如下:

String startPage = BuildConfig.StartPage;

來看看底層原始碼,該方法接收三個引數, type、name、value

 public void buildConfigField(@NonNull String type,@NonNull String name,@NonNull String value) {
        ClassField alreadyPresent = getBuildConfigFields().get(name);
        if (alreadyPresent != null) {
            logger.info(
                    "BuildType(${getName()}): buildConfigField '$name' value is being replaced: ${alreadyPresent.value} -> $value");
        }
        addBuildConfigField(AndroidBuilder.createClassField(type, name, value));
 }

中文亂碼問題

gradle.properties 中配置中文,例如AppName=測試應用, 無論哪種方式讀取出來均是亂碼,這是使用過程中遇到的巨大的坑。因此不建議在該檔案中使用中文字元。

相關推薦

android全域性配置抽取-gradle.properties

概述 android工程中有一個非常重要的檔案-gradle.properties,它主要用於儲存一些全域性性配置,例如 jvm 的配置等,除此之外,業務層面的配置也可以抽取出來放在此處,方便各個module呼叫。 預設的 gradle.properties

關於android專案的全域性配置——config.gradle

忙忙碌碌半年,最近工作有點不開心,準備跑路時才發現自己啥都不會。正好趕上畢業季,工作超級難找,只有一年工作的汪哭暈在電腦前。同事一個個跳槽成功,更加激發了本汪學習的動力,好記性不如爛筆頭, frighting!!! 開發比較大的專案,或是進行元件化開發的時候

android studio 中使用gradle.properties

一,為什麼使用gradle.properties? 1,對於專案而言,有時候需要配置某些敏感資訊。比如密碼,帳號等。而這些資訊需要被很多類共同使用,所以必須有一個全域性的配置 2,當需要把專案push到git上時,我們不希望別人看到我們專案的key,tok

Android Studio打包以及Gradle配置構建

otto sign rac color conf wmf git var png 本文轉載 郭霖公眾號 https://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650241610&idx=1&sn

[Android] 配置build.gradle 動態傳參

rop sse 橋梁 ldconfig .cn txt pro rul targe (1)一個Android工程中有一個build.gradle是負責Project範圍的,而Module中又有各自的build.gradle是專門負責模塊的。 (2)在Gradle中Task是

_MyBatis3-topic06.07.08.09_ 全域性配置檔案_引入dtd約束(xml提示)/ 引入properties引用/ 配置駝峰命名自動匹配 /typeAliases起別名.批量起別名

MyBatis3 的全域性配置檔案 : Setting -官方文件 筆記要點 出錯分析   [Intellij idea配置外部DTD檔案] 設定步驟: (同Eclipse中的Catalog設定 )   File-->Setting-->搜尋DTDs -->點選上方的External

Android配置build.gradle自動化編譯signingConfigs和V1,V2簽名

Android配置build.gradle自動化編譯signingConfigs和V1,V2簽名 Android Studio已經提供了打包apk的快捷按鈕,足夠簡單。編譯按鈕為: 但是有時候開發者還想更新需要進一步的自動化,這時候可以通過配置build.gradle檔案時候,在mod

Android配置build.gradle編譯release包以日期加序列號自增長為Version Code以及Version Name區分不同型別(三)

Android配置build.gradle編譯release包以日期加序列號自增長為Version Code以及Version Name區分不同型別(三) 前幾篇文章介紹瞭如何通過配置build.gradle實現在編譯release包時候,Version Code動態的以日期+序列號的形式自

Android配置build.gradle編譯release包時以日期時間加序列號為Version Code且Version Code自動增長(二)

Android配置build.gradle編譯release包時以日期時間加序列號為Version Code且Version Code自動增長(二) Android官方推薦以一個自然增長的整數值為Version Code,比如以基礎數值1為基礎,每次發一個release包時候Version值

Android配置build.gradle實現Version Code編譯release包時自動增長(一)

Android配置build.gradle實現Version Code編譯release包時自動增長(一) 經常的,開發者在上線釋出之前要打出很多測試包給測試團隊測試,每次打出的release包為了區分不同的版本號,需要手動的修改Android裡面的配置檔案build.gradle的vers

Android studio專案中的gradle.properties詳解

Android studio專案中的gradle.properties詳解 在使用Android Studio新建Android專案之後,在專案根目錄下會預設生成一個gradle.properties檔案,我們可以在裡面做一些Gradle檔案的全域性性的配置,也可以將比較私密的資訊放

Android Studio 使用本地gradle配置詳解

由於國內牆的原因,我們的Gradle無法使用 但是我們可以通過去下載我們想要的Gradle版本 然後再AndoidStudio內去配置本地的版本 進而去實現了Gradle的配置 注意一: so我們按照setting->gradle->然後開啟gradle-wrapper.properti

Android Studio 配置 JDK SDK gradle

關於配置問題。一定要找對自己檔案版本。配置路徑。不要以為拷貝過去就感覺可以用了。 一,JAVA JDK環境配置 1,終端建立環境變數配置檔案(第一次配置檔案使用) touch .bash_profile 2,開啟自定義建立的配置(bash_profile) op

Android配置build.gradle的buildTypes動態自動維護debug和release包自定義欄位變數值

Android配置build.gradle的buildTypes動態自動維護debug和release包自定義欄位變數值 在Android編譯出包階段,debug包和正式的release有時候需要作出有所區別的調整。 比如最常見的是App應用程式中Log日誌輸出開關的控制。開發者希望在deb

android studio配置sdk和gradle中的一些問題

因為最近在家裡也要搞一下android專案,家裡筆記本上一直裝的Eclipse,心血來潮給裝上了as。建立專案,配置sdk,gradle環境,又是一個蛋疼的過程。幾經周折終於build gradle finished之後,為了讓以後不在蛋疼,在此記錄一下問題以及解決辦法。

Android Activity左右切換 【全域性配置Activity顯示動畫】

AndroidManifest.xml 注意application節點 的Android:theme屬性 <application android:name=".BaseApp

Android Studio 通過配置build.gradle打包簽名檔案

一在工程下放入簽名檔案 二在gradle裡配置在Android節點下 //簽名設定 signingConfigs { release { sto

Android studio 快速解決Gradle's dependency cache may be corrupt 和 Gradle配置 gradle-3.*-all.zip快速下載

用了好久的AS了,官方版本更新,各種配置工具 也跟著更新。更新後匯入工程時(使用Android工程編譯或者匯入新的工程沒有對應的gradle版本)一些電腦出現一下問題。 Error:Failed

android studio 配置Kotlin報錯Error:Cause: org.gradle.api.internal.file.DefaultSourceDirectorySet.

Unable to find method 'org.gradle.api.internal.file.DefaultSourceDirectorySet。 Error:Cause: org.gradle.api.internal.file.DefaultSourceDirectorySet。

詳細配置android studio中的gradle

這篇部落格著重點在詳細的介紹如何配置gradle,實現諸如多渠道打包,一次生成不同UI的多渠道apk,自定義資源目錄等。如果你對gradle還沒有比較清晰的認識,那麼推薦你在看這篇部落格之前,先看下我的另一篇部落格理解與配置android studio的gradle,這篇