Android Gradle 獲取properties文件參數(shù) 解決中文亂碼

一稽穆、前言

當(dāng)我們在Android Studio創(chuàng)建一個工程的時候拇泛,都會存在 local.propertiesgradle.properties 兩個文件卑雁,如下圖

項目結(jié)構(gòu)

Properties其實是Java項目中的配置文件凳怨,不是Gradle獨創(chuàng)的叉讥。因為Gradle語法可以和Java進行混合使用,所以在Java項目上面使用Properties文件的方式芯杀,在Gradle上面也可以使用端考。

獲取 gradle.properties 的內(nèi)容不需要我們額外寫任何代碼,可以直接在build.gradle中進行調(diào)用瘪匿。local.propertiesAndroid Studio 配置SDK和NDK一些路徑跛梗,還不可以直接調(diào)用。

二棋弥、Properties

了解Properties,其實最主要是了解它的數(shù)據(jù)格式诚欠。Properties

數(shù)據(jù)格式以鍵值對的方式:key=value

"#"作為注釋使用

三顽染、Gradle中使用properties

1、gradle.properties

因為 Gradle 內(nèi)置了對 gradle.properties 的調(diào)用方式轰绵,所以 build.gradle 可以直接獲取 gradle.properties 中的內(nèi)容粉寞。
需要注意的是 gradle.properties 中的value是都不需要帶 ""Gradle 會先把值轉(zhuǎn)換為String類型左腔。

gradle.properties:

# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# 版本號
VERSION_CODE=1
# 版本名稱
VERSION_NAME=1.0.0
# 包名
APPLICATION_ID=com.example.properties
# 應(yīng)用名稱
APP_NAME=簡書
# 應(yīng)用渠道
APP_CHANNEL=official
# 是否Debug
IS_DEBUG=true

build.gradle:

apply plugin: 'com.android.application'

// 打印日志
println "VERSION_CODE = " + VERSION_CODE.toInteger()
println "VERSION_NAME = " + VERSION_NAME.toString()
println "APPLICATION_ID = " + APPLICATION_ID.toString()
println "APP_NAME = " + APP_NAME.toString()
println "APP_CHANNEL = " + APP_CHANNEL.toString()
if (IS_DEBUG.toBoolean()) {
    println "IS_DEBUG is true"
} else {
    println "IS_DEBUG is false"
}

android {
    compileSdkVersion 28
    buildToolsVersion "28.0.3"

    defaultConfig {
        applicationId APPLICATION_ID.toString()
        minSdkVersion 19
        targetSdkVersion 28
        versionCode VERSION_CODE.toInteger()
        versionName VERSION_NAME.toString()
    }

    productFlavors {
        official {
            manifestPlaceholders = [
                    APP_NAME: APP_NAME.toString()
            ]
        }
    }
}

AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="${APP_NAME}"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
    </application>
</manifest>

Run:
構(gòu)建APK文件輸出的日志唧垦,可以看到輸出的結(jié)果

打印日志

也可以通過AndroidManifest.xml實時查看,點擊Merged Mainfest:

這里可能很多人都不知道液样,AndroidManifest.xml 中出現(xiàn)Merge錯誤也可以從這里定位

AndroidManifest.xml

2振亮、其他 .properties文件

2-1、第一種獲取方式:

config.properties(新建):

value不需要帶""

VERSION_CODE=1
VERSION_NAME=1.0.0
APPLICATION_ID=com.example.properties
APP_NAME=簡書
APP_CHANNEL=official
IS_DEBUG=true

build.gradle:

本文例子config.properties是放在根目錄下鞭莽,路徑都需要指明坊秸,否則編譯會報"找不到指定文件"

// 默認方式-寫法1
Properties properties = new Properties()
properties.load(new FileInputStream(rootProject.getRootDir().getAbsolutePath() + "/config.properties"))
println "VERSION_CODE = " + properties.getProperty("VERSION_CODE")//也可以properties["VERSION_CODE"]
println "VERSION_NAME = " + properties.getProperty("VERSION_NAME")//也可以properties["VERSION_NAME"]
println "APPLICATION_ID = " + properties.getProperty("APPLICATION_ID")//也可以properties["APPLICATION_ID"]
println "APP_NAME = " + properties.getProperty("APP_NAME")//也可以properties["APP_NAME"]
println "APP_CHANNEL = " + properties.getProperty("APP_CHANNEL")//也可以properties["APP_CHANNEL"]
println "IS_DEBUG = " + properties.getProperty("IS_DEBUG")//也可以properties["IS_DEBUG"]

// 默認方式-寫法2
Properties properties = new Properties()
new File(rootProject.getRootDir().getAbsolutePath() + "/config.properties").withInputStream {
    stream -> properties.load(stream)
}
println "VERSION_CODE = " + properties.getProperty("VERSION_CODE")//也可以properties["VERSION_CODE"]
println "VERSION_NAME = " + properties.getProperty("VERSION_NAME")//也可以properties["VERSION_NAME"]
println "APPLICATION_ID = " + properties.getProperty("APPLICATION_ID")//也可以properties["APPLICATION_ID"]
println "APP_NAME = " + properties.getProperty("APP_NAME")//也可以properties["APP_NAME"]
println "APP_CHANNEL = " + properties.getProperty("APP_CHANNEL")//也可以properties["APP_CHANNEL"]
println "IS_DEBUG = " + properties.getProperty("IS_DEBUG")//也可以properties["IS_DEBUG"]

Run:
構(gòu)建APK文件輸出的日志澎怒,可以看到輸出的結(jié)果

打印日志

2-2褒搔、第二種獲取方式:

config.properties(新建):

value需要帶"",否則獲取不了

VERSION_CODE=1
VERSION_NAME="1.0.0"
APPLICATION_ID="com.example.properties"
APP_NAME="簡書"
APP_CHANNEL="official"
IS_DEBUG=true

build.gradle:

本文例子config.properties是放在根目錄下,路徑都需要指明星瘾,否則編譯會報"找不到指定文件"走孽。

def configSlurper = new ConfigSlurper().parse(new File(rootProject.getRootDir().getAbsolutePath() + "/config.properties").toURL())
println "VERSION_CODE = " + configSlurper.VERSION_CODE
println "VERSION_NAME = " + configSlurper.VERSION_NAME
println "APPLICATION_ID = " + configSlurper.APPLICATION_ID
println "APP_NAME = " + configSlurper.APP_NAME
println "APP_CHANNEL = " + configSlurper.APP_CHANNEL
if (configSlurper.IS_DEBUG) {
    println "IS_DEBUG is true"
} else {
    println "IS_DEBUG is false"
}

Run:
構(gòu)建APK文件輸出的日志,可以看到輸出的結(jié)果

image.png

四琳状、解決中文亂碼

以上匯總情況

情況1:gradle.properties獲取數(shù)據(jù)磕瓷,會出現(xiàn)中文亂碼。
情況2:其他 .properties文件第一種獲取方式算撮,會出現(xiàn)中文亂碼生宛。(原理其實和1是一致的)
情況3:其他 .properties文件第二種獲取方式,沒有出現(xiàn)中文亂碼肮柜。

情況1和情況2的方式陷舅,試了UTF-8編碼解碼之后,得到的還是亂碼的审洞,原因就是出在獲取的時候就是亂碼的莱睁,你再怎么編碼解碼都沒用。

因為情況1和情況2都是通過字節(jié)流來獲取芒澜,所以中文都亂碼了仰剿。。痴晦。java基礎(chǔ)問題呀D纤薄!誊酌!

解決方式1(情況1):

如果你的項目一定要使用 gradle.properties部凑,因為情況1字節(jié)流的方式不能改,所以可以通過URL編碼/解碼來實現(xiàn)碧浊。

簡書 ==>%e7%ae%80%e4%b9%a6【通過UrlEncode編碼之后得到】

image.png

gradle.properties:

# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# 版本號
VERSION_CODE=1
# 版本名稱
VERSION_NAME=1.0.0
# 包名
APPLICATION_ID=com.example.properties
# 應(yīng)用名稱
APP_NAME=%e7%ae%80%e4%b9%a6
# 應(yīng)用渠道
APP_CHANNEL=official
# 是否Debug
IS_DEBUG=true

build.gradle:

最后再通過UrlDecode解碼就可以得到:URLDecoder.decode(APP_NAME.toString(), "UTF-8")

println "APP_NAME = " + URLDecoder.decode(APP_NAME.toString(), "UTF-8")

解決方式2(情況2):

如果你的項目使用新建.properties文件涂邀,可以把情況2字節(jié)流讀取改成字符流讀取

config.properties(和之前一樣):

VERSION_CODE=1
VERSION_NAME=1.0.0
APPLICATION_ID=com.example.properties
APP_NAME=簡書
APP_CHANNEL=official
IS_DEBUG=true

build.gradle:

// 默認方式-寫法1
Properties properties = new Properties()
properties.load(new InputStreamReader(new FileInputStream(rootProject.getRootDir().getAbsolutePath() + "/config.properties")))
println "VERSION_NAME = " + properties.getProperty("VERSION_NAME")

解決方式3:

情況3就是無亂碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市箱锐,隨后出現(xiàn)的幾起案子比勉,更是在濱河造成了極大的恐慌,老刑警劉巖驹止,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浩聋,死亡現(xiàn)場離奇詭異,居然都是意外死亡幢哨,警方通過查閱死者的電腦和手機赡勘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捞镰,“玉大人闸与,你說我怎么就攤上這事毙替。” “怎么了践樱?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵厂画,是天一觀的道長。 經(jīng)常有香客問我拷邢,道長袱院,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任瞭稼,我火速辦了婚禮忽洛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘环肘。我一直安慰自己欲虚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布悔雹。 她就那樣靜靜地躺著复哆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腌零。 梳的紋絲不亂的頭發(fā)上梯找,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音益涧,去河邊找鬼锈锤。 笑死,一個胖子當(dāng)著我的面吹牛闲询,可吹牛的內(nèi)容都是我干的牙咏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嘹裂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摔握?” 一聲冷哼從身側(cè)響起寄狼,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氨淌,沒想到半個月后泊愧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡盛正,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年删咱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豪筝。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡痰滋,死狀恐怖摘能,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敲街,我是刑警寧澤团搞,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站多艇,受9級特大地震影響逻恐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜峻黍,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一复隆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姆涩,春花似錦挽拂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至样刷,卻和暖如春仑扑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背置鼻。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工镇饮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箕母。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓储藐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘶是。 傳聞我的和親對象是個殘疾皇子钙勃,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355