作者:康林(kl222@126.com)
签名工具是jdk提供。所以在执行下列命令前需要先安装jdk。并设置:
export PATH=$JAVA_HOME/bin:$PATH
生成密钥库(key store)文件
l@l-Lenovo:/home/RabbitCommon$ keytool -genkey -alias RabbitCommon -keyalg RSA -validity 36500 -keystore RabbitCommon.keystore
输入密钥库口令:
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: KangLin
您的组织单位名称是什么?
[Unknown]: Kang Lin Studio
您的组织名称是什么?
[Unknown]: Kang Lin Studio
您所在的城市或区域名称是什么?
[Unknown]: XinHua
您所在的省/市/自治区名称是什么?
[Unknown]: HuNan
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=KangLin, OU=Kang Lin Studio, O=Kang Lin Studio, L=XinHua, ST=HuNam, C=CN是否正确?
[否]: y
创建一个证书文件,名为 RabbitCommon.keystore,别名也为 RabbitCommon.keystore ,加密算法采用 RSA,有效期为 100年。
注:
查看密钥库(key store)文件信息
keytool -list -v -keystore
编译发布(Release)模式下您的应用程序,以获得一个无符号的APK
签名
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore RabbitCommon.keystore my_application.apk RabbitCommon
验证你的apk签名:
jarsigner -verify -verbose -certs my_application.apk
使用zipalign来对齐apk包:
zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
zipalign 确保所有的未压缩数据与特定字节对齐相对于文件,从而降低apk文件的大小。
参考
参考
原理
QtCreator 签名是通过 androiddeployqt 来进行的。
l@l-Lenovo:/opt/Qt5.13.2/5.13.2/android_x86/bin$ ./androiddeployqt --help
Optional arguments:
--sign <url/to/keystore> <alias>: Signs the package with the
specified keystore, alias and store password. Also implies the
--release option.
Optional arguments for use with signing:
--storepass <password>: Keystore password.
--storetype <type>: Keystore type.
--keypass <password>: Password for private key (if different
from keystore password.)
--sigfile <file>: Name of .SF/.DSA file.
--digestalg <name>: Name of digest algorithm. Default is
"SHA1".
--sigalg <name>: Name of signature algorithm. Default is
"SHA1withRSA".
--tsa <url>: Location of the Time Stamping Authority.
--tsacert <alias>: Public key certificate for TSA.
--internalsf: Include the .SF file inside the signature block.
--sectionsonly: Don't compute hash of entire manifest.
--protected: Keystore has protected authentication path.
--jarsigner: Force jarsigner usage, otherwise apksigner will be
used if available.
l@l-Lenovo:/opt/Qt5.13.2/5.13.2/android_x86/bin$ ./androiddeployqt \
--input ${SOURCE_DIR}/App/android-libRabbitCommonApp.so-deployment-settings.json \
--output ${SOURCE_DIR}/android-build \
--android-platform ${ANDROID_API} \
--gradle \
--sign RabbitCommon.keystore rabbitcommon \
--storepass ${STOREPASS}
CI是自动化构建系统,需要密钥库(key store)文件和相关密码,如果用明码,没安全性可言。所以需要对密钥库(key store)文件和相关密码加密。
直接用openssl。
openssl help aes-256-cbc #查看加密与解密用法
openssl aes-256-cbc -K $KEY -iv $IV -in RabbitCommon.keystore -out RabbitCommon.keystore.enc -e
通过travis客户端工具。它实际也是通过 openssl 来进行加密的。
travis encrypt-file RabbitCommon.keystore --add
注意: travis encrypt-file 默认随机产生KEY和IV。如果要加密多个文件,请加参数 -p,显示随机产生的KEY和IV。然后用这个KEY和IV继续加密码后续文件。
travis encrypt-file RabbitCommon.keystore --add -p
travis encrypt-file SecondFile.keystore --add --key [上面打印出来的key] --iv [上面打印出来的iv]
解密密钥库(key store)文件
openssl aes-256-cbc -K $KEY -iv $IV -in RabbitCommon.keystore.enc -out RabbitCommon.keystore -d
+ 然后添加环境变量。**注意**: DISPLAY VALUE IN BUILD LOG 要设置为关闭 - 通过travis客户端
travis encrypt KEY=keypassword --add
travis encrypt IV=keyiv --add