Android 源碼中如何生成一個platform JKS 文件?
首先我們需要在源代碼環境中將 build/target/product/security/ 文件夾 copy 到本地。
下邊的操作需要在 ubuntu 或者 mac 下。
重要安全提醒:
platform密鑰是系統級私鑰,擁有它就能簽出系統權限應用。不要把它放到公共機器 / 共享位置,謹慎保管,必要時改密碼并限制訪問。
1) 先看看文件格式(確認 pk8 是二進制還是 PEM)
file platform.pk8
# 或
head -n 3 platform.pk8
- 如果看到
-----BEGIN開頭,那就是 PEM 格式私鑰(可以直接用)。 - 如果是二進制(比如
data/DER),需要先把它轉換成 PEM。
2)(如果需要)把 platform.pk8 轉成 PEM 私鑰
僅當 platform.pk8 不是 PEM(即是 DER/PKCS8 二進制)時運行:
openssl pkcs8 -in platform.pk8 -inform DER -out platform.key.pem -nocrypt
如果 platform.pk8 已經是 PEM,就把它重命名/復制為 platform.key.pem:
cp platform.pk8 platform.key.pem
3) 用證書 + 私鑰 導出 PKCS#12(.p12)
把 cert 和私鑰合成一個 .p12(后面用 keytool 導入到 JKS):
openssl pkcs12 -export \
-inkey platform.key.pem \
-in platform.x509.pem \
-name platform \
-out platform.p12
- 上面會提示你設置一個導出密碼(
Export Password)。記住它,后面導入時需要(示例中我們用p12pass說明,運行時請用安全密碼)。
如果你想在命令行里直接設置密碼(不建議在公共 shell 歷史中出現),可以:
openssl pkcs12 -export -inkey platform.key.pem -in platform.x509.pem -name platform -out platform.p12 -passout pass:p12pass
4) 把 PKCS#12 導入 Java Keystore(.jks)
用 keytool 將 .p12 轉成 platform.jks:
keytool -importkeystore \
-deststorepass android \
-destkeypass android \
-destkeystore platform.jks \
-srckeystore platform.p12 \
-srcstoretype PKCS12 \
-srcstorepass p12pass \
-alias platform
- 這里
-deststorepass/-destkeypass我示例用了android(方便演示),實際請用強密碼替換。 -srcstorepass要填第 3 步時你設的導出密碼(上例是p12pass)。
5) 驗證 keystore 內容
keytool -list -v -keystore platform.jks -storepass android
輸出里應該能看到 alias platform,以及證書信息(Subject/Issuer/有效期等)。若看到就成功了。
6) 用 platform.jks 給 APK 簽名(示例:apksigner)
建議用 apksigner(Android build tools 提供):
# 使用 apksigner(Android build-tools >= 24)
apksigner sign --ks platform.jks --ks-pass pass:android --ks-key-alias platform app-system-signed.apk
或者用 jarsigner(舊法):
jarsigner -keystore platform.jks -storepass android -keypass android app-release-unsigned.apk platform
然后最好用 zipalign(如果是最終安裝包)和 apksigner verify 驗證簽名:
# zipalign (android sdk build-tools)
zipalign -v 4 app-release-unsigned.apk app-aligned.apk
apksigner verify --verbose --print-certs app-aligned.apk
額外說明(常見問題)
- 如果
openssl pkcs12報錯 “Mac verify error:invalid password?”:說明你提供的-passout/交互密碼不匹配,重試并確認密碼。 - 如果
platform.pk8是加密私鑰(很少見),需要先用 openssl 解密(需要原始密碼)。 - 系統簽名要求與 ROM 中的
platform.x509.pem/platform.pk8一致:如果你用的是源碼樹同目錄下的 key,那么在制作系統鏡像時簽名一致,App 能拿到android:sharedUserId="android.uid.system"/signature|system等特權。 - 如果你只是本地測試并不想替換設備系統的 platform key,更安全的做法是在自建的測試 ROM 中使用該 key 簽名或把簽名后的 apk 放到
/system/priv-app/并設置正確權限。直接在俗稱的“普通設備”上用 platform key 安裝可能受系統限制(廠商 ROM 與密鑰不同)。
簡短命令總覽(一鍵版,假設 pk8 為二進制)
# 轉成 PEM(如果已經是 PEM 可跳過)
openssl pkcs8 -in platform.pk8 -inform DER -out platform.key.pem -nocrypt
# 導出 p12(會詢問導出密碼)
openssl pkcs12 -export -inkey platform.key.pem -in platform.x509.pem -name platform -out platform.p12
# 導入到 JKS(示例密碼:android / p12pass,實際請換強密碼)
keytool -importkeystore -deststorepass android -destkeypass android -destkeystore platform.jks \
-srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass p12pass -alias platform
# 驗證
keytool -list -v -keystore platform.jks -storepass android
如何將 jks 文件導入到項目的gradle中?
1. 放置位置
常規做法是把 platform.jks 放在工程目錄下的某個子目錄(例如 app/keystore/platform.jks),不要放進版本控制,只在本地或 CI 構建機上保管。
2. 配置 gradle.properties(推薦)
在項目根目錄的 gradle.properties 中寫上 keystore 信息(可以避免明文寫在 build.gradle 里):
MY_KEYSTORE=app/keystore/platform.jks
MY_KEYSTORE_PASSWORD=android
MY_KEY_ALIAS=platform
MY_KEY_PASSWORD=android
這里密碼要替換成你創建 jks 時設定的。
3. 配置 app/build.gradle → signingConfigs
android {
signingConfigs {
platform {
storeFile file(MY_KEYSTORE)
storePassword MY_KEYSTORE_PASSWORD
keyAlias MY_KEY_ALIAS
keyPassword MY_KEY_PASSWORD
}
}
buildTypes {
release {
signingConfig signingConfigs.platform
minifyEnabled false
shrinkResources false
}
debug {
// 如果需要調試也走 platform 簽名(一般系統 App 要這樣)
signingConfig signingConfigs.platform
}
}
}
4. 構建 & 簽名
這樣執行 ./gradlew assembleRelease 就會自動用你 platform.jks 里的 key 來簽名 APK。
5. 額外提醒 ??
- 普通設備上安裝不了:因為你拿到的
platformkey 跟設備出廠的 system.img 里用的不一樣,只有在你自己編的系統(刷機)里,才能識別為“系統簽名”。 - 真機系統 App 場景:如果你控制了固件(比如手表項目),就可以在同一套 key 下簽 ROM 和 APK,這樣 Gradle 打出來的包就能擁有系統簽名權限(例如
android:sharedUserId="android.uid.system"或signature|system權限)。 - 密鑰最好不要隨項目源碼走,建議本地配置或 CI 配置注入。

浙公網安備 33010602011771號