Android項目中的properties大閱兵

背景

最近在封裝一個分享功能庫,因為沒有自己的騰訊\微信\微博開放平臺賬號,所以使用了公司項目的api_key和keystore,于是帶來了一個問題,這些信息是絕對不能提交到github上去的,所以每次提交代碼時,都需要把相關的代碼刪除。某次,提交代碼時忘了這一步操作,誤將這些敏感的信息push到了github上,急忙使用git命令來挽救這次失誤:

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

在挽救回這次操作之后,我開始反思、尋找更好的解決方法,最終目標是讓 代碼脫敏 ,即無論怎么迭代代碼,push時都不用再擔心會把敏感信息誤提交了

配置文件

首先,我們先來回顧一下Android Studio里的Project板塊,當展示模式切換成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用戶請自行google確定它的位置。也有部分用戶可能會沒有這個文件,此時應該自己創建一個,它會在我們日常工作中提供非常大的幫助。

global_properties.jpeg

打開這個文件,我們可以看到,里面默認配置了gradle的JVM最大可用內存、持久代可用大小、以及一些gradle的優化參數,這些配置是所有項目共享的。

跟隨這一思路,當我們有某些配置是所有項目都會用到的,那么就可以把它配置在這個文件中,這樣就不必每次新建、clone一個項目之后,還要去一一配置。比如bintray、nexus的賬號信息。

由于這個文件并不在項目下,所以我們可以大膽的把敏感信息配置在里面,而不用擔心會push到git上。

gradle.properties(Project Properties)

顧名思義,這個文件是項目級的配置文件,由于它會被提交到git上,所以不適合配置敏感信息,此處就不多做介紹。一般這個配置文件中會配置項目級的功能開關,比如android.useAndroidX、android.enableJetifier等。

在現在比較流行的組件化開發中,module是application還是library的開關通常也會配置在這里。

local.properties(SDK Location)

這個文件中默認配置了本地的sdk、ndk路徑。該文件的header中寫到:

This file must NOT be checked into Version Control Systems

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

系統環境變量

除了上述3種配置文件之外,某些情況下,我們還可以使用系統環境變量來配置敏感信息。但是由于它是系統級的,某些情況下可能會無法正常讀取,甚至極端情況下會因為配置錯誤,導致系統宕機。所以,除非不得不配置在系統環境變量中,否則建議不要配置成系統環境變量。

讀取上述配置文件

在上一部分,我們了解了在一個 Android 項目中可以使用到的配置文件類型,現在來看一下,當配置完成之后,我們怎么讀取使用這些配置。

gradle.properties(Global AND Project)

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

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

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

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

  1. 在Android項目的build.gradle中,可以直接用KEY來獲取參數值
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類去手動加載它,然后讀取其中的參數

 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")

系統環境變量

雖然不建議這種配置方式,但是還是簡單地介紹下讀取方法,由于它是系統級參數,所以在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")
    }
  }

最佳實踐

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

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

末尾

安利一下使用kotlin語言封裝的分享庫RxShare,使用RxJava實現一行代碼完成分享。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,514評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,373評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,975評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,743評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,199評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,414評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,951評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,780評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,218評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,649評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,889評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,673評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,653評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,782評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,898評論 6 342
  • 今天是中秋節,依舊是在一群人的狂歡中享受孤獨。 最后一幕讓我想到蘇永康的《愛一個人好難》——“站在天平的兩端,一樣...
    谷同學V閱讀 279評論 0 1
  • 鳥哥的linux
    JsDu閱讀 285評論 0 0