[ Android 编译 ] 如果不指定LOCAL_CERTIFICATE,默认使用哪个key进行签名?
尊重原创,转载请注明出处!
创作不易,如有帮助请点赞支持~
参考:
Android系统签名简介
开发系统应用时,通常情况下我们都会在 Android.mk 中通过 LOCAL_CERTIFICATE
声明应用签名所用的密钥。尤其是当指定 android:sharedUserId="android.uid.system"
时,必须通过 LOCAL_CERTIFICATE := platform
使用 platform key 对应用进行签名。
最近在开发调试的时候,发现 Launcher3 应用的 Android.mk 并没有声明 LOCAL_CERTIFICATE
,那么它到底是使用哪个 key 进行签名的呢?
通过简单的测试可以得出结论,在未修改源码编译环境的情况下,系统源码中编译的应用,如果没有指定 LOCAL_CERTIFICATE
:
1、在 user
模式下就是用 build/target/product/security/releasekey.x509.pem
进行应用签名。
2、在 eng / userdebug
模式下用 build/target/product/security/testkey.x509.pem
进行应用签名。
默认情况下使用的证书路径是在这里定义的 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/target/product/security/testkey
endif
也就是说,如果在源码中定义了 PRODUCT_DEFAULT_DEV_CERTIFICATE
的环境变量,就会使用它作为默认的证书路径。如果没指定 PRODUCT_DEFAULT_DEV_CERTIFICATE
,则使用 build/target/product/security/testkey
作为默认的证书路径。
通过查找资料,发现在 system/sepolicy/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/testkey.x509.pem
USER : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem
最后,这个 DEFAULT_SYSTEM_DEV_CERTIFICATE
到底是在哪里用到的呢?
答案是 build/make/core/package_internal.mk
,它判断了当 LOCAL_CERTIFICATE
为空时,使用 $(DEFAULT_SYSTEM_DEV_CERTIFICATE)
进行签名。
ifeq ($(LOCAL_CERTIFICATE),)
LOCAL_CERTIFICATE := $(DEFAULT_SYSTEM_DEV_CERTIFICATE)
endif
分析到这里,其实就可以验证上面的结论了:
1、在 user
模式下,系统源码中编译的应用,如果没有指定 LOCAL_CERTIFICATE
,默认情况下就是用 build/target/product/security/releasekey/releasekey.x509.pem
进行应用签名。
2、在 eng / userdebug
模式下,系统源码中编译的应用,如果没有指定 LOCAL_CERTIFICATE
,默认情况下就是用 build/target/product/security/releasekey/testkey.x509.pem
进行应用签名。
进一步扩展,可以得到以下结论:
1、如果自己公司的产品需要维护一套自己生成的密钥,可以在 makefile 中通过 PRODUCT_DEFAULT_DEV_CERTIFICATE
环境变量指定自己的证书路径。包括 platform / media / release 等签名都是使用该路径下的证书
2、如果想要在修改 eng / userdebug / user
编译模式下使用的默认密钥,可以修改 system/sepolicy/private/keys.conf
,配置不同编译模式下使用的默认密钥
注:这里经过测试,发现只要指定了 PRODUCT_DEFAULT_DEV_CERTIFICATE
,那么无论在 user
还是
userdebug
模式下,默认使用的都是 PRODUCT_DEFAULT_DEV_CERTIFICATE
只有在未指定
PRODUCT_DEFAULT_DEV_CERTIFICATE
的情况下,eng / userdebug
模式下才会使用
testkey 作为默认密钥
遗留问题:
上面指定的 DEFAULT_SYSTEM_DEV_CERTIFICATE
都是 build/target/product/security/testkey
或 build/target/product/security/releasekey
,也就是直接指定的密钥类型。
但是在 keys.conf 中通过 DEFAULT_SYSTEM_DEV_CERTIFICATE
和 xxxkey.x509.pem
进行拼接,此时 DEFAULT_SYSTEM_DEV_CERTIFICATE
应该指定的是密钥文件所在目录才对?
这个问题查了半天没搞懂,暂时不管了。有哪位朋友知道的可以指点一下,谢谢~