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阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,825评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,778评论 6 342
  • 今天是中秋节,依旧是在一群人的狂欢中享受孤独。 最后一幕让我想到苏永康的《爱一个人好难》——“站在天平的两端,一样...
    谷同学V阅读 272评论 0 1
  • 鸟哥的linux
    JsDu阅读 231评论 0 0