Android項(xiàng)目中的properties大閱兵

背景

最近在封裝一個分享功能庫,因?yàn)闆]有自己的騰訊\微信\微博開放平臺賬號用押,所以使用了公司項(xiàng)目的api_key和keystore尊勿,于是帶來了一個問題,這些信息是絕對不能提交到github上去的豆巨,所以每次提交代碼時剩辟,都需要把相關(guān)的代碼刪除。某次往扔,提交代碼時忘了這一步操作贩猎,誤將這些敏感的信息push到了github上,急忙使用git命令來挽救這次失誤:

git reset --hard <commit_id>
git push origin HEAD --force

在挽救回這次操作之后萍膛,我開始反思吭服、尋找更好的解決方法,最終目標(biāo)是讓 代碼脫敏 蝗罗,即無論怎么迭代代碼艇棕,push時都不用再擔(dān)心會把敏感信息誤提交了

配置文件

首先串塑,我們先來回顧一下Android Studio里的Project板塊沼琉,當(dāng)展示模式切換成Android之后,我們會看到有一個Gradle Scripts的集合拟赊,今天的主角都在這里面刺桃,讓我們暫時先忘記日常寫代碼的module,把全部的注意力放在Gradle Scripts部分吸祟。


gradle_scripts.jpeg

在圖中瑟慈,我們可以看到gradle.properties(Global Properties)桃移、gradle.prooperties(Project Properties)、local.properties(SDK Location)等三個配置文件葛碧,而它們就是我們的武器借杰。

gradle.properties(Global Properties)

從文件名后的注釋我們可以知道,它是Gradle全局性的配置文件进泼,在Linux蔗衡、Mac中,它位于/Users/{YOUR_NAME}/.gradle/乳绕,windows用戶請自行g(shù)oogle確定它的位置绞惦。也有部分用戶可能會沒有這個文件,此時應(yīng)該自己創(chuàng)建一個洋措,它會在我們?nèi)粘9ぷ髦刑峁┓浅4蟮膸椭?/p>

global_properties.jpeg

打開這個文件济蝉,我們可以看到,里面默認(rèn)配置了gradle的JVM最大可用內(nèi)存菠发、持久代可用大小王滤、以及一些gradle的優(yōu)化參數(shù),這些配置是所有項(xiàng)目共享的滓鸠。

跟隨這一思路雁乡,當(dāng)我們有某些配置是所有項(xiàng)目都會用到的,那么就可以把它配置在這個文件中糜俗,這樣就不必每次新建踱稍、clone一個項(xiàng)目之后,還要去一一配置吩跋。比如bintray寞射、nexus的賬號信息。

由于這個文件并不在項(xiàng)目下锌钮,所以我們可以大膽的把敏感信息配置在里面,而不用擔(dān)心會push到git上引矩。

gradle.properties(Project Properties)

顧名思義梁丘,這個文件是項(xiàng)目級的配置文件,由于它會被提交到git上旺韭,所以不適合配置敏感信息氛谜,此處就不多做介紹。一般這個配置文件中會配置項(xiàng)目級的功能開關(guān)区端,比如android.useAndroidX值漫、android.enableJetifier等。

在現(xiàn)在比較流行的組件化開發(fā)中织盼,module是application還是library的開關(guān)通常也會配置在這里杨何。

local.properties(SDK Location)

這個文件中默認(rèn)配置了本地的sdk酱塔、ndk路徑。該文件的header中寫到:

This file must NOT be checked into Version Control Systems

然而危虱,這個文件很多時候并不會被VCS忽略羊娃,所以需要手動將它排除。因此埃跷,在把敏感信息配置在這個文件中時蕊玷,我們要確保它沒有被VCS收錄。

系統(tǒng)環(huán)境變量

除了上述3種配置文件之外弥雹,某些情況下垃帅,我們還可以使用系統(tǒng)環(huán)境變量來配置敏感信息。但是由于它是系統(tǒng)級的剪勿,某些情況下可能會無法正常讀取贸诚,甚至極端情況下會因?yàn)?strong>配置錯誤,導(dǎo)致系統(tǒng)宕機(jī)窗宦。所以赦颇,除非不得不配置在系統(tǒng)環(huán)境變量中,否則建議不要配置成系統(tǒng)環(huán)境變量赴涵。

讀取上述配置文件

在上一部分媒怯,我們了解了在一個 Android 項(xiàng)目中可以使用到的配置文件類型,現(xiàn)在來看一下髓窜,當(dāng)配置完成之后扇苞,我們怎么讀取使用這些配置。

gradle.properties(Global AND Project)

  1. 在任意.gradle文件中寄纵,我們可以通過getProperties().get("KEY_NAME")方式來讀取參數(shù)值

def getRepositoryUsername() {
    return getProperties().get('bintray.user')
}

def getRepositoryPassphrase() {
    return getProperties().get('bintray.gpg.password')
}

def getApiKey() {
    return getProperties().get("bintray.apikey")
}

  1. 在Android項(xiàng)目的build.gradle中鳖敷,可以直接用KEY來獲取參數(shù)值
signingConfigs {
        sign {
            storeFile file(ANDROID_STORE_FILE)
            storePassword ANDROID_STORE_PASSWORD
            keyAlias ANDROID_KEY_ALIAS
            keyPassword ANDROID_KEY_PASSWORD
        }
    }

local.properties

由于這個配置文件只供gradle程序使用,所以無法像gradle.properties那樣直接讀取程拭。我們需要通過JDK的Properties類去手動加載它定踱,然后讀取其中的參數(shù)

 Properties properties = new Properties()
    properties.load project.rootProject.file('local.properties').newDataInputStream()
    def APP_ID = properties.getProperty("APP_ID")
    def WB_ID = properties.getProperty("WB_ID")
    def WX_ID = properties.getProperty("WX_ID")
    def QQ_ID = properties.getProperty("QQ_ID")

系統(tǒng)環(huán)境變量

雖然不建議這種配置方式,但是還是簡單地介紹下讀取方法恃鞋,由于它是系統(tǒng)級參數(shù)崖媚,所以在gradle文件中,我們可以通過System.getenv來讀取

def env = { System.getenv it }
signingConfigs {
    sign {
      storeFile file(env("ANDROID_STORE_FILE"))
      storePassword env("ANDROID_STORE_PASSWORD")
      keyAlias env("ANDROID_KEY_ALIAS")
      keyPassword env("ANDROID_KEY_PASSWORD")
    }
  }

最佳實(shí)踐

在上文中介紹了不同的配置文件以及它的讀取方法恤浪。最后畅哑,我想介紹一下在這次封裝分享庫時的一些最佳實(shí)踐

  1. 不同項(xiàng)目間通用的配置建議放在Global Properties中,如Bintray水由、Nexus賬號信息
  2. 項(xiàng)目專有的敏感信息荠呐,如微信\騰訊\微博開放平臺的KEY建議放在local.properties中
  3. Project Properties中只存放不敏感的參數(shù)
  4. 除非必須,否則不要使用系統(tǒng)環(huán)境變量

末尾

安利一下使用kotlin語言封裝的分享庫RxShare,使用RxJava實(shí)現(xiàn)一行代碼完成分享泥张。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呵恢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子圾结,更是在濱河造成了極大的恐慌瑰剃,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筝野,死亡現(xiàn)場離奇詭異晌姚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)歇竟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門挥唠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人焕议,你說我怎么就攤上這事宝磨。” “怎么了盅安?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵唤锉,是天一觀的道長。 經(jīng)常有香客問我别瞭,道長窿祥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任蝙寨,我火速辦了婚禮晒衩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘墙歪。我一直安慰自己听系,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布虹菲。 她就那樣靜靜地躺著靠胜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毕源。 梳的紋絲不亂的頭發(fā)上髓帽,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機(jī)與錄音脑豹,去河邊找鬼。 笑死衡查,一個胖子當(dāng)著我的面吹牛瘩欺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼俱饿,長吁一口氣:“原來是場噩夢啊……” “哼歌粥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拍埠,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤失驶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后枣购,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嬉探,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年棉圈,在試婚紗的時候發(fā)現(xiàn)自己被綠了涩堤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡分瘾,死狀恐怖胎围,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情德召,我是刑警寧澤白魂,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站上岗,受9級特大地震影響福荸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜液茎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一逞姿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捆等,春花似錦滞造、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至明郭,卻和暖如春买窟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背薯定。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工始绍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人话侄。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓亏推,卻偏偏與公主長得像学赛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吞杭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,799評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盏浇,服務(wù)發(fā)現(xiàn),斷路器芽狗,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • 今天是中秋節(jié)绢掰,依舊是在一群人的狂歡中享受孤獨(dú)。 最后一幕讓我想到蘇永康的《愛一個人好難》——“站在天平的兩端童擎,一樣...
    谷同學(xué)V閱讀 272評論 0 1
  • 鳥哥的linux
    JsDu閱讀 231評論 0 0