閱讀774 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Android Gradle 權威指南》隱藏Android簽名文件和密鑰信息

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

A20170851

什麼是Gradle

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

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

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

Gradle官網:https://gradle.org/
Gradle文檔:https://gradle.org/docs
Gradle插件:https://plugins.gradle.org/

如果沒有梯子,下載不了Gradle,我這裏有個自己搭建的鏡像可以使用 https://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知識,購買鏈接如下,也可以掃描下麵的二維碼和作者互動交流。

京東購書
當當購書

掃碼關注

最後更新:2017-08-29 10:03:16

  上一篇:go  世界級難題:把不同物品裝進箱子,如何使箱子表麵積最小?
  下一篇:go  HybridDB for PostgreSQL有哪些內核擴展