[TOC]
請注意
簽名前,請確認java環(huán)境, Android環(huán)境是否配置正確
生成簽名
# 生成簽名 別名 [myKey] 有效期 50年, 算法 RSA 文件名 [myKey.keystore]
keytool -genkey -alias myKey -keyalg RSA -validity 17820 -keystore myKey.keystore
# 提示,其中國家代碼 中國-CN
此命令試用于 jdk 1.7 及 1.7以下,如果高于請使用如下命令
# 1.8以后的jdk要求時間校準 加入 -tsa http://timestamp.digicert.com 如果出現(xiàn)校驗時間錯誤,請找一個能用的tsa服務(wù)器
keytool -tsa http://timestamp.digicert.com -genkey -alias myKey -keyalg RSA -validity 17820 -keystore myKey.keystore
**命令執(zhí)行后有提示輸入各種信息,首先是 yourStorepass 然后是簽名的各種信息,確認請輸入 y, 最后輸入別名的aliasesPass **
也就是說一個簽名文件,包括
簽名密碼別名別名密碼一個文件 三個字符串
特別的,最好使用時間戳制造簽名文件,這樣可以在簽名到期后,用戶仍然可用
簽名 APK
# 輸入完整信息簽名一個應(yīng)用,注意填寫[]中對應(yīng)的內(nèi)容
# [yourStorepass] 簽名文件密碼 [aliasesPass] 別名密碼 [forSignAPKPath] 要簽名的apk路徑 [aliases] 別名
jarsigner -verbose -keystore myKey.keystore -storepass [yourStorepass] -keypass [aliasesPass] [forSignAPKPath] [aliases]
# 查看幫助
jarsingner -help
校驗簽名
# 查看一個路徑為 [verifyApkPath] 的APK 是否簽名
jarsigner -verify [verifyApkPath]
# 通過一個路徑為 [keystorePath] 的簽名文件,校驗一個 路徑為 [verifyApkPath] 的apk
jarsigner -verbose -verify -keystore [keystorePath] -certs [verifyApkPath]
查看簽名文件信息
# 查看一個路徑為 [keystorePath] 的簽名文件的信息,需要簽名的庫密碼
keytool -list -keystore [keystorePath]
簽名腳本
OSX or Linux
創(chuàng)建文件 my_sign_apk.sh 內(nèi)容為
#!/bin/bash
# setting default key path here
# local OPTIND
# jarsigner -verbose -verify -keystore ${keyPath} -certs ${packagePath}
DEFAULT_KEY_PATH=/Users/sinlov/opt/myShell/myKey.keystore
DEFAULT_STORE_PASS="myPass"
DEFAULT_ALIASES="myAliases"
DEFAULT_KEY_PASS="keyPass"
DEFAULT_DIGESTALG=SHA1
DEFAULT_SIGALG=MD5withRSA
sigalg=${DEFAULT_SIGALG}
digestalg=${DEFAULT_DIGESTALG}
keyPath=${DEFAULT_KEY_PATH}
storepass=${DEFAULT_STORE_PASS}
keypass=${DEFAULT_KEY_PASS}
aliases=${DEFAULT_ALIASES}
packagePath=
IS_VERIFY=false
if [ ! -n "$1" ]; then
echo "unkonw path, please use apk path"
exit 1
else
while getopts "p:k:h:" arg #after param has ":" need option
do
case $arg in
p)
echo "Package path: $OPTARG"
packagePath=$OPTARG
;;
k)
echo "Key Path: $OPTARG"
keyPath=$OPTARG
;;
h)
echo "use -p [packagePath] -k [keyPath] -h Show help"
exit 1
;;
?) # other param?
echo "unkonw argument, please use -p [packagePath] -k [keyPath]"
exit 1
;;
esac
done
fi
#echo "sigalg: ${sigalg}"
#echo "digestalg: ${digestalg}"
#echo "keyPath: ${keyPath}"
#echo "storepass: ${storepass}"
#echo "aliases: ${aliases}"
#echo "keypass: ${keypass}"
#echo "packagePath: ${packagePath}"
jarsigner -verbose -digestalg ${digestalg} -sigalg ${sigalg} -keystore ${keyPath} -storepass ${storepass} -keypass ${keypass} ${packagePath} ${aliases}
- 用法
# 給予運行權(quán)限
chmod +x my_sign_apk.sh
# 查看幫助
./my_sign_apk.sh -h
# 快速簽名
./my_sign_apk.sh -p [apkPath]
# 指定簽名文件簽名
./my_sign_apk.sh -k [keyPath] -p [apkPath]
Windows
新建文件 sign.bat 內(nèi)容為
@echo.============= Start Sign APK=============
@rem please set params with []
jarsigner -verbose -digestalg SHA1 -sigalg MD5withRSA -keystore [YourKeyFullPath] -storepass [storepass] -keypass [keyPass] "%~nx1" [aliases]
pause
- 用法 編輯好對應(yīng)的參數(shù),拖拽
未簽名的 apk 到文件sign.bat圖標即可
Debug簽名簽名APK
Windows debug簽名腳本
jarsigner -verbose -digestalg SHA1 -sigalg MD5withRSA -keystore ~/.android/debug.keystore -storepass "android" -keypass "android" "%~nx1" androiddebugkey
請修改 ~/.android/debug.keystore 改為你用戶目錄下面的 .android\debug.keystore的絕對路徑
保存成signApkDebug.bat 拖拽apk到這個腳本即可
Mac/Linux debug 簽名腳本
新建文件 signApkDebug,輸入內(nèi)容
#!/bin/bash
if [ ! -n "$1" ]; then
echo "unkonw path, please use apk path"
exit 1
else
jarsigner -verbose -digestalg SHA1 -sigalg MD5withRSA -keystore ~/.android/debug.keystore -storepass "android" -keypass "android" $1 "androiddebugkey"
fi
保存內(nèi)容后
chmod +x signApkDebug
配置到環(huán)境變量后就可以在任何地方使用命令
signApkDebug [apkFile]