1. 程式人生 > >Gradle實現自動打包,簽名,自定義apk文件名

Gradle實現自動打包,簽名,自定義apk文件名

回車 應用 types 背包 sdn 部署 密鑰對 另一個 密鑰庫

Gradle實現自動打包,簽名,自定義apk文件名

什麽是簽名,簽名有什麽用

Android APP都需要我們用一個證書對應用進行數字簽名,不然的話是無法安裝到Android手機上的,平時我們調試運行時到手機上時,是AS會自動用默認的密鑰和證書來進行簽名;但是我們實際發布編譯時,則不會自動簽名,這個時候我們就需要進行手動簽名了!為我們的APK簽名有以下好處:

  • 1.應用程序升級:如果你希望用戶無縫升級到新的版本,那麽你必須用同一個證書進行簽名。這是由於只有以同一個證書簽名,系統才會允許安裝升級的應用程序。如果你采用了不同的證書,那麽系統會要求你的應用程序采用不同的包名稱,在這種情況下相當於安裝了一個全新的應用程序。如果想升級應用程序,簽名證書要相同,包名稱要相同!
  • 2.應用程序模塊化: Android系統可以允許同一個證書簽名的多個應用程序在一個進程裏運行,系統實際把他們作為一個單個的應用程序,此時就可以把我們的應用程序以模塊的方式進行部署,而用戶可以獨立的升級其中的一個模塊。
  • 3.代碼或者數據共享: Android提供了基於簽名的權限機制,那麽一個應用程序就可以為另一個以相同證書簽名的應用程序公開自己的功能。以同一個證書對多個應用程序進行簽名,利用基於簽名的權限檢查,你就可以在應用程序間以安全的方式共享代碼和數據了。 不同的應用程序之間,想共享數據,或者共享代碼,那麽要讓他們運行在同一個進程中,而且要讓他們用相同的證書簽名。 ————上述內容摘自:android 為什麽需要簽名

首先我們看下效果圖

技術分享圖片

一、生成keystone文件

了解下加解密算法的分類

 加解密算法基本上可以分為三類,它們分別是對稱性解密算法、非對稱性加密算法和消息摘要算法。每一類算法中又有多個不同的具體算法。對於這些算法,我們不要求完全掌握,但是對於各類算法的特點和用途是一定要了解的,對於一些常見的名字,如 DES、AES、RSA、DSA、MD5、SHA1 等,一定要熟悉,至少要知道它們分別屬於哪類算法。

  對稱性加密算法使用同一個密鑰對信息進行加密和解密,其信息的安全性一部分取決於加密算法和密鑰的長度,另一部分取決於密鑰在傳遞過程中是否會被截獲或盜取。非對稱性加密算法使用兩個密鑰分別對信息進行加密和解密,這兩個密鑰稱為私鑰/公鑰對。使用私鑰加密的信息必須使用公鑰解密,反之亦然。公鑰可以公開發布,私鑰由加密方保存,絕對不公開,將私鑰被截獲或竊取的可能性降到最低,因此非對稱性加密算法的安全性比對稱性加密算法的安全性更高。既然非對稱性加密算法比對稱性加密算法安全性更高,那對稱性加密算法有什麽存在的必要呢?這是因為對稱性加密算法的運算速度更快。現實中,往往將對稱性加密算法和非對稱性加密算法結合使用,對於要傳輸的大塊數據使用對稱性加密算法加密,然後對加密使用的密鑰使用非對稱性加密算法進行加密,這樣既可以獲得更高的安全性,又可以獲得更高的加解密運算速度。常用的對稱性加密算法有DES算法、AES算法、3DES算法、TDEA算法、Blowfish算法、RC5算法、IDEA算法。常用的非對稱性加密算法有DSA算法、RSA算法、Elgamal算法、背包算法、Rabin算法、D-H算法、ECC算法(橢圓曲線加密算法)。

  消息摘要算法的主要目的是對數據生成摘要。消息摘要算法不需要密鑰,只有輸入相同的數據才能得到相同的摘要,而且不可能從摘要反過來推算出數據。常用的消息摘要算法有MD5算法和SHA-1算法及其大量的變體。它們可以用來保證數據的完整性,在網絡上發布文件時,常同時提供該文件的MD5值就是利用的消息摘要算法的這個特點,一旦該文件被篡改或者在網絡傳輸中出現數據錯誤,再對其進行摘要運算就得不到相同的MD5值。

  對數據進行簽名是我們在網絡中最常見的安全操作。簽名有雙重作用,作用一就是保證數據的完整性,證明數據並非偽造,而且在傳輸的過程中沒有被篡改,作用二就是防止數據的發布者否認其發布了該數據。簽名同時使用了非對稱性加密算法和消息摘要算法,對一塊數據簽名時,會先對這塊數據進行消息摘要運算生成一個摘要,然後對該摘要使用發布者的私鑰進行加密。接收者接受這塊數據後,先使用發布者的公鑰進行解密得到原數據的摘要,再對接收到的數據計算摘要,如果兩個摘要相同,則說明數據沒有被篡改。同時,因為發布者的私鑰是不公開的,只要接收者通過發布者的公鑰能成功對數據進行解密,就說明該數據一定來源於該發布者,他再怎麽抵賴也沒有用。

Keytool介紹

Keytool 是一個Java數據證書的管理工具 ,Keytool將密鑰(key)和證書(certificates)存在一個稱為keystore的文件中在keystore裏,包含兩種數據:密鑰實體(Key entity)-密鑰(secret key)或者是私鑰和配對公鑰(采用非對稱加密)可信任的證書實體(trusted certificate entries)-只包含公鑰

Keytool工具位於JDK 目錄下的bin 目錄下keytool.exe 一般配置了環境變量path都可以直接使用

使用Keytool生成自己的密鑰

keytool -genkey -alias tudou.keystore -keyalg RSA -validity 20000 -keystore tudou.keystore

參數說明:

-alias xxx 產生別名 每個keystore 都有關聯的這個獨一無二的alias 別名通常不區分大小寫

-keyalg RSA 指定加密算法 這裏指定的是 RSA

-validity 20000 指定證書的有效時間 單位:天 這裏指定的是20000天

-keystore xxx 指定密鑰庫的名稱

輸入以上命令以後直接回車,會提示 輸入密鑰庫口令:輸入完成後再重復輸入一遍 (輸入的口令不能少於6位,而且輸入的時候你看不見,安全起見嘛)

回車以後按照提示一步一步設置

  1. 您的名字與姓氏是什麽? ****
  2. 您的組織單位名稱是什麽? ****
  3. 您的組織名稱是什麽? ****
  4. 您所在的您所在的省/市/自治區名稱是什麽? ****
  5. 城市或區域名稱是什麽? ****
  6. 該單位的雙字母國家/地區代碼是什麽? cn
  7. *******是否正確? 輸入y/n即可 y表示正確
  8. 輸入 <biemings> 的密鑰口令 同樣不少於6位 重復輸入即可

如下圖我定義的:

技術分享圖片

查看密鑰證書

keytool -list -v -keystore 密鑰路徑

[root@hejianlai-jenkins ~]# keytool -list -v -keystore tudou.keystore
Enter keystore password: 
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
Alias name: tudou.keystore
Creation date: Jun 26, 2018
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=He, OU=Pcidata, O=Pcidata Group, L=Guangzhou, ST=Guangdong, C=CN
Issuer: CN=He, OU=Pcidata, O=Pcidata Group, L=Guangzhou, ST=Guangdong, C=CN
Serial number: fd5bed2
Valid from: Tue Jun 26 16:30:26 CST 2018 until: Wed Mar 29 16:30:26 CST 2073
Certificate fingerprints:
          MD5:  07:63:47:F3:96:92:E0:6B:49:D7:2F:68:3C:5D:0E:51
          SHA1: DA:46:86:62:8D:22:78:0A:51:66:3F:78:5F:37:91:9F:F4:D6:63:1B
          SHA256: 1D:98:8E:31:01:D4:43:0A:E0:2C:A2:37:4F:83:EB:38:A2:80:45:FD:46:BC:4C:FC:59:B6:A0:4E:D3:B9:72:62
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3
Extensions:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E0 DC CF A9 5B 0C 5D 9C   A2 F8 48 52 4C 83 23 36  ....[.]...HRL.#6
0010: 8B 25 3B C3                                        .%;.
]
]
*******************************************
*******************************************
Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore tudou.keystore -destkeystore tudou.keystore -deststoretype pkcs12".

二、配置build.gradle文件

下面是配置build.gradle文件我的路徑是/app/build.gradle

apply plugin: ‘com.android.application‘
android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"
    defaultConfig {
        applicationId "com.pci.securigydemotest"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.3"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//添加簽名文件
         signingConfigs {
        release {
            storeFile file("/root/keyless.keystore")   //簽名文件全路徑
            storePassword "123456"
            keyAlias "keyless.keystore"
            keyPassword "123456"
        }
}
//設置打包格式
         applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith(‘.apk‘)) {
            // 輸出apk名稱為Pos_v1.0.0_201709251000_.apk
            def fileName = "Securigy_${defaultConfig.versionName}_201806281954_${variant.productFlavors[0].name}_1.3.apk"
            output.outputFile = new File(outputFile.parent, fileName)
        }
    }
}
//自定義apk名字
productFlavors {
    Develop {
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Develop"]
    }
   Alpha {
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Alpha"]
    }

    Beta {
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Beta"]
    }
    Gamma {
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Gamma"]
    }
    Demo {
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Demo"]
    }
    Current {
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Current"]
    }
} 
    }
    buildTypes {
        release {
                          signingConfig signingConfigs.release
            minifyEnabled false
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
        }
    }

在jenkins上構建完之後就可以查看apk是否簽名成功

[root@hejianlai-jenkins apk]#jarsigner -verbose -certs -verify Securigy_1.3_201806281954_Alpha_1.3.apk

技術分享圖片

Gradle實現自動打包,簽名,自定義apk文件名