隱藏Android簽名檔案和金鑰資訊

非同步社群發表於2019-03-04

《Android Gradle 權威指南》終於發售上市了,這本書裡包含了很多實用技巧、實戰經驗以及原理分析,今天這篇文章主要介紹下如何隱藏我們打包的簽名金鑰,因為這個不能讓每個開發者都,會有安全隱患,但是我們又可以讓每個開發者打包,在講之前,我們先看下什麼是Gradle,什麼是Android Gradle。

什麼是Gradle

Gradle是一款非常優秀的構建系統工具,它使用可以配置的DSL語言描述構建流程,同時允許我們使用原生的Java和Groovy編碼的方式進行構建,所以相比Ant、Maven這些非常靈活。

在Gradle中,大部分的構建都是通過Gradle的外掛來完成的,外掛是Gradle非常好的一個設計,Gradle提供了一個核心可以擴充套件的平臺,然後通過外掛來擴充套件Gradle的能力,靈活方便。

Gradle本身提供了非常多的外掛,比如java,war,scala等,可以滿足我們的絕大多數需求。如果內建的外掛不能滿足需求,可以使用第三方開發的外掛,甚至自己開發可以滿足自己需求的外掛。

Gradle官網:gradle.org/
Gradle文件:gradle.org/docs
Gradle外掛:plugins.gradle.org/

如果沒有梯子,下載不了Gradle,我這裡有個自己搭建的映象可以使用 mirrors.flysnow.org/

什麼是Android Gradle

剛開始我們做Android開發的時候,採用的是Eclipse+Ant的構建方式,後來Android團隊打算採用基於IDEA的Android Studio的時候,採用了Gradle進行構建,為了能和Android Studio進行無縫整合,Android團隊開發了Android Gradle這個Gradle的第三方外掛,用於Android的開發構建。使用Android Gradle,我們可以更好的:

  1. 程式碼和資源的複用
  2. 很方便的建立App的衍生版本
  3. 可以滿足自定義、擴充套件,而且非常容易
  4. 當然不能少的,可以和Android Studio無縫整合

Android團隊開發了三個Android Gradle外掛,但是他們都屬於一套程式碼庫。這三個外掛名字分別為:

  1. com.android.application
  2. com.android.library
  3. com.android.library

從名字上看,其實他們分別對應我們Android的 Android App開發,Android Lib庫開發以及Android Test測試工程的開發。

使用這三個外掛也非常容易,和Gradle使用其它外掛的方式一樣,因為這是一個非內建自帶的,第三方外掛,所以我們首先得宣告classpath的依賴,才可以使用,和jdk的classpath很像。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath `com.android.tools.build:gradle:2.2.3`
    }
}複製程式碼

我們配置裡倉庫為jcenter,這樣當我們配置依賴的時候,gradle就會去這個倉庫裡尋找我們的依賴。

然後我們在dependencies{}配置裡我們需要的是Android Gradle2.2.3版本的外掛。

buildscript{}這部分配置可以寫到根工程的build.gradle指令碼檔案中,這樣所有的子工程就不用重複配置了。
以上配置好之後,我們就可以應用我們的Android Gradle外掛了。

apply plugin: `com.android.application`

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"
}複製程式碼

android{}是Android外掛提供的一個擴充套件型別,可以讓我們自定義Android Gradle工程。compileSdkVersion是編譯所依賴的Android SDK的版本,這裡是API Level;buildToolsVersion是構建該Android工程所以的構建工具的版本。

以上應用的是一個App工程外掛,應用Android Library外掛和Android Test外掛也類似的,只需要換成相應的id即可。

隱藏Android簽名檔案和金鑰資訊

很多團隊一開始的成立的時候,十來個人,三五條槍,就開始創業了,每個組基本上就一個人,扛起所有。開始的時候,大家都不知道這款產品是否可以成功,所以也都沒想那麼多,只能小步快跑,快速迭代,佔領市場,搶佔使用者,這才是最重要的。

隨著產品越做越好,團隊越來越大,組內成員越來越多,就開始注重團隊協作,編碼規範,效能安全,團隊建設等等,因為只有做到這些,整個團隊的工作效率和產出才能更高,才能有團隊的威力,越到最後靠的是團隊,而不是一個人。

說著說著快跑題了,扯到團隊建設和管理上了O(∩_∩)O~,這個以後有時間再交流,大家有想法也可以加微信公公眾號flysnow_org一起交流。說以上那麼多,就是現在團隊大了,人多了,要正規了。

以前我們都是把App的簽名證照和相關金鑰放在專案中,託管在git上,這樣做非常方便,可以直接訪問打包,並且藉助git這個程式碼管理平臺維護管理。但是簽名資訊這個是我們應用非常重要的資訊,屬於公司重要的資源,所以我們要做到分級管理,保證安全,這也是公司保密措施的一部分,所以基於此,簽名資訊需要隱藏,但是又可以讓大家都可以使用這個簽名打包。

簽名資訊既然不能放在專案中,那麼就需要有個地方存放他們,既然不能在每個開發者的電腦上,那就只能放到構建的伺服器上,所以要實現這個,你還得有自己的專門用於打包發版的伺服器,我們把簽名檔案和金鑰資訊放到伺服器上,在打包的時候去讀取即可,下面我們以使用環境變數的方式為例,當然還有更多方式,比如配置檔案等等。

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    signingConfigs {
        def appStoreFile = System.getenv("STORE_FILE")
        def appStorePassword = System.getenv("STORE_PASSWORD")
        def appKeyAlias = System.getenv("KEY_ALIAS")
        def appKeyPassword = System.getenv("KEY_PASSWORD")
        release {
            storeFile file(appStoreFile)
            storePassword appStorePassword
            keyAlias appKeyAlias
            keyPassword appKeyPassword
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            zipAlignEnabled true
        }
    }
}複製程式碼

然後我們在打包的機器上配置以上環境變數即可,window和linux的方式不一樣,關於配置環境變數這一塊的知識,大家可以自行google一下。

如果你是使用Jenkins這類CI打包,以Jenkins,它的配置裡就可以指定Jenkins使用的環境變數,這樣我們就不用區分linux和window了,只需要在Jenkins裡配置即可。

以上配置好之後,我們就可以進行打包使用了,簽名資訊也做了隱藏,看到這裡,相信大家也意識到了一個問題,那就是每個開發者電腦上並沒有如上的環境變數配置,因為簽名資訊對他們是隱藏的,那麼他們如何進行打包測試呢?這就需要我們兩個一個debug簽名上場了,我們直接使用android自己提供的debug簽名即可,因為我們需要的是簽名,保證可以生成App測試(非debug除錯)即可,比如給測試。

首先我們要從我們自己的電腦目錄上提取出來Android自帶的debug簽名,一般在你的${HOME}/.android/目錄下,找到後拷貝到我們的工程目錄下,其次找到他們的簽名資訊,比如密碼,key等,這是公開的,我們可以參考Android文件。

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    signingConfigs {
        def appStoreFile = System.getenv("STORE_FILE")
        def appStorePassword = System.getenv("STORE_PASSWORD")
        def appKeyAlias = System.getenv("KEY_ALIAS")
        def appKeyPassword = System.getenv("KEY_PASSWORD")

        //當不能從環境變數裡獲取到簽名資訊的時候,就使用專案中帶的debug簽名
        if(!appStoreFile||!appStorePassword||!appKeyAlias||!appKeyPassword){
            appStoreFile = "debug.keystore"
            appStorePassword = "android"
            appKeyAlias = "androiddebugkey"
            appKeyPassword = "android"
        }
        release {
            storeFile file(appStoreFile)
            storePassword appStorePassword
            keyAlias appKeyAlias
            keyPassword appKeyPassword
        }
    }
}複製程式碼

關鍵的邏輯就是在signingConfigs中加了判斷程式碼,如果簽名資訊四要素中的任何一個沒有獲取到,就使用預設的簽名資訊,這樣當我們在打包伺服器進行打包的時候就會使用正式釋出的簽名,因為我們已經在伺服器上配置了簽名資訊的環境變數;當每個開發者自己生成Release包的時候,因為本機沒有配置,就使用預設的簽名。

假如有的開發者有時候也需要使用正式釋出的簽名打正式的包,用於升級測試等目的,也是可以做到的,比如Jenkins,給每個開發者開放一個賬號,他們自己新建個Job就可以打正式的包了,打了之後可以在生成的構建裡下載。

這裡要隱藏我們的簽名資訊,既能保證簽名資訊的安全性,又可以進行正式的打包,其中的關鍵點是一個專有的打包伺服器,如果你們公司還沒有的話,趕緊試試吧,好處多多,從這個小技巧也可以看到Gradle的靈活性,我們和編寫Java程式碼一樣編寫我們的構建打包流程。

小結

《Android Gradle權威指南》已經出版上市,大家可以前往京東、亞馬遜、噹噹等各大商城購買,學習更多的Android Gradle知識,購買連結如下,也可以掃描下面的二維碼和作者互動交流。

京東購書
噹噹購書

【非同步社群試讀】www.epubit.com.cn/book/detail…

掃碼關注
掃碼關注

相關文章