Android 编译使用哪个key签名?
一看Android.mk
在我们内置某个apk的时候都会带有Android.mk,这里面就写明了该APK使用的是什么签名,如:
LOCAL_CERTIFICATE := platform
表明使用的是platform签名
LOCAL_CERTIFICATE := PRESIGNED
表明使用的是apk原本的签名,记住这里的PRESIGNED需要大写
二看产品自定义秘钥
大部分公司在自定义自己的秘钥的时候,都会做出如下修改
- 在产品的mk中指定PRODUCT_DEFAULT_DEV_CERTIFICATE,如:
device/amlogic/产品名/产品名.mk:
# android sign key
PRODUCT_DEFAULT_DEV_CERTIFICATE := vendor/xxxx/android-certs/releasekey
# Here is a customization of which key signature to use
ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),vendor/xxxx/android-certs/releasekey)
BUILD_KEYS := release-keys
endif
- 一旦指定了PRODUCT_DEFAULT_DEV_CERTIFICATE就不会再使用默认的testkey
build/core/config.mk文件:
# The default key if not set as LOCAL_CERTIFICATE
ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)
else
DEFAULT_SYSTEM_DEV_CERTIFICATE := build/make/target/product/security/testkey
endif
.KATI_READONLY := DEFAULT_SYSTEM_DEV_CERTIFICATE
可以看到在没有定义PRODUCT_DEFAULT_DEV_CERTIFICATE的情况下默认使用的是testkey,但是如果我们定义了,就会改换路径为你自定义的路径。
三看编译模式
system/sepolicy/prebuilts/api/30.0/private/keys.conf
[@PLATFORM]
ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/platform.x509.pem
[@MEDIA]
ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/media.x509.pem
[@NETWORK_STACK]
ALL : $MAINLINE_SEPOLICY_DEV_CERTIFICATES/networkstack.x509.pem
[@SHARED]
ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/shared.x509.pem
# Example of ALL TARGET_BUILD_VARIANTS
[@RELEASE]
ENG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
USER : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
不同的编译模式使用了不同的默认密钥
这里很奇怪,DEFAULT_SYSTEM_DEV_CERTIFICATE到底是直接选定了密钥文件还是只是文件存储路径。
总结:
- 内置apk,签名要看mk文件中的LOCAL_CERTIFICATE,指定是谁就是谁
- 如果没有指定LOCAL_CERTIFICATE,使用的是产品自定义的秘钥以及编译模式
- 如果产品没有指定自定义秘钥,那么就是testkey
keystore签名 和 jks 签名
keystore和jks 都是用来签名的,二者其实差不太多,在Android应用签名中,jks文件是keystore的一种具体实现,专门用于Java环境下的应用签名。
- 拥有安卓源码就可以使用系统key文件生成keystore(这种是系统开发者对 APK 签名)
- 而jks 可以使用Android Studio生成(一般是应用开发者对 APK 签名)
源码目录使用.pem和.pk8的签名
使用.pem和.pk8的签名文件签名的过程很简单,我之前的【生成签名文件release key,通过Android源码对apk进行签名】文章的最后一句就是:
注意这是在源码目录下
java -Djava.library.path="prebuilts/sdk/tools/linux/lib64" -jar ./prebuilts/sdk/tools/lib/signapk.jar ./build/make/target/product/security/platform.x509.pem ./build/make/target/product/security/platform.pk8 app.apk app_signed.apk
命令行签名
这里要使用apksigner进行签名,apksigner 包含在 Android SDK Tools 中,可通过 android studio 中 Tools -> Android -> SDK Manager -> SDK Tools 查看是否安装。
安装了 SDK Tools 后,在 %ANDROID_HOME%/build-tools
文件夹下对应的版本就能找到。
下面给出的例子是使用keystore 签名,将文件改成 jks 也是一样的
对齐 对齐工具使用的是Android Apk优化工具Zipalign,对齐命令为:
Zipalign -v 4 src.apk dst.apk
使用 apksigner签名
apksigner sign --ks platform.keystore --ks-key-alias alias --ks-pass pass:password --key-pass pass:password --v1-signing-enabled true --v2-signing-enabled true dst.apk
使用如下方式验证
apksigner verify dst.apk
使用如下方式验证
jarsigner -verify D:\Project\keystore\News.apk
Android Studio 中配置签名
在Android Studio 中配置签名,可以使用keystore ,jks,甚至pk8
signingConfigs {
release {
storePassword "password"
keyPassword "password"
keyAlias "alias"
storeFile file("E:/AndroidProject/keystore/release-platform.pk8")
}
}
权限-signature 签名权限
签名权限描述:
只有当应用A 与 定义权限的应用B 或 OS 使用相同的证书签名时,系统才会向应用授予签名权限。
- 应用A 和 应用B 具有相同的证书签名 :两个LOCAL_CERTIFICATE := PRESIGNED 具有相同证书签名应用。
如果应用B先安装的,而且已经申请过权限,(A和B有相同的证书签名)则系统会在不通知用户或征得用户明确许可的情况下,给A应用自动授予这些signature权限。
- 应用A 和 系统签名应用
使用platform或者testkey等其他签名
除了签名权限之外还有普通权限,特殊权限,运行时权限,这里推荐