Android 命令列構建和簽署APK

ruomiz發表於2017-11-28

環境

1.JDK

2.SDK

3.Gradle

本文主要是不需要通過 AndroidStudio 完整編譯打包簽名生成apk的過程,可以通過sdk中的apksigner工具完成,也在和使用Gradle來完成。

首先使用 keytool 生成一個私鑰,keytool 位於 JDK 中的 bin/ 目錄中,開啟命令列輸入:

keytool -genkey -v -keystore ruomiz-release-key.jks
-keyalg RSA -keysize 2048 -validity 10000 -alias ruomiz

會在當前目錄生成一個ruomiz-release-key.jks的檔案 採用的RSA非對稱加密,標誌名為 my-alias,有效期為10000天。複製程式碼

構建並簽署APK

命令列形式

1.構建apk

開啟命令列,切換到專案根目錄,或者在專案根目錄下開啟命令列

gradlew assembleRelease
//gradlew assembleDebug 構建除錯的APK複製程式碼

執行完成後會在 module 的 build/outputs/apk 中建立一個未簽名的 apk。這個 apk 暫未簽名,需要用私鑰簽名。

2.對齊未簽署的APK

使用 zipalign 對齊 APK,在 sdk 的 build-tools 下面,需要把上面生成的 APK 拷貝進去:

zipalign -v -p 4 app-release-unsigned.apk app-release-unsigned-aligned.apk複製程式碼

為了方便檢視我將 APK 改了名字

執行成功以後會生成一個對齊的 APK

3.使用私鑰簽署 APK

apksigner 和 zipalign 都在 sdk 的 build-tools 目錄下,將 keytools 生成的簽名檔案( jks 檔案)拷貝進來:

 apksigner sign --ks ruomiz-release-key.jks --out ruomiz-app-release.apk ziptest-release-unsigned-aligned.apk複製程式碼

最後會生成一個 ruomiz-app-release.apk 檔案

可以驗證apk是否簽署成功:

apksigner verify ruomiz-app-release.apk複製程式碼

按照上述步驟已經生成簽名的APK

Gradle簽署 APK

首先需要配置jks的簽名檔案,然後將生成的簽名檔案(jks)拷貝到專案 module下

在專案模組 build.gradle 下新增

android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            storeFile file("生成的簽名檔案.jks")
            storePassword "金鑰庫密碼"
            keyAlias "金鑰標誌名"
            keyPassword "金鑰密碼"
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            ...
        }
    }
}複製程式碼

簽名檔案需要和build.gradle檔案在同一目錄。

編譯

進入專案所在根目錄shift+滑鼠右鍵 ,以命令列形式開啟,執行:

gradlew assembleRelease複製程式碼

將會在專案 module 的 build/outputs/apk/ 中生成一個 app-release.apk (module_name-release.apk)的 APK。這個 APK 檔案已經使用 build.gradle 檔案中指定的私鑰簽署和對齊。

驗證:

可以將生成的 APK 解壓 然後 META-INF 中 有 CERT.RSA 檔案,命令列切換目錄到解壓目錄,執行:

keytool -printcert -file META-INF/CERT.RSA複製程式碼

會出現jks的簽名資訊

相關文章