[ Android 编译 ] 如果不指定LOCAL_CERTIFICATE,默认使用哪个key进行签名

[ 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/testkeybuild/target/product/security/releasekey,也就是直接指定的密钥类型。

但是在 keys.conf 中通过 DEFAULT_SYSTEM_DEV_CERTIFICATExxxkey.x509.pem 进行拼接,此时 DEFAULT_SYSTEM_DEV_CERTIFICATE 应该指定的是密钥文件所在目录才对?

这个问题查了半天没搞懂,暂时不管了。有哪位朋友知道的可以指点一下,谢谢~

Android.mk是一个Makefile格式的文件,用于定义Android应用程序模块的编译规则。如果你想创建一个自定义签名的文件,你需要在该文件中指定应用的签名信息,这通常涉及到keystore(密钥库)、alias(别名)以及key password(私钥密码)。以下是一个简单的例子: ``` LOCAL_PACKAGE_NAME := MyApp LOCAL_PATH := $(call my-dir) # 定义签名信息 LOCAL_KEYSTORE_FILE := path_to_your_keystore.jks LOCAL_KEY_ALIAS := your_key_alias LOCAL_KEY_PASSWORD := your_password include $(CLEAR_VARS) PRODUCT_PROPERTY_OVERRIDES += android.bootloader.dump=1 # 开启bootloader签名检查 APP_ABI := arm64-v8a arm32 armeabi-v7a x86 LOCAL_MODULE := myapp LOCAL_MODULE_CLASS := APP LOCAL_MODULE_PATH := /data/app LOCAL_SRC_FILES := main.c libmylib.so # 如果有静态库也要包含 LOCAL_CERTIFICATE := androiddebugkey ifeq ($(LOCAL_DEBUG_GDB),true) LOCAL_CERTIFICATE := androiddebug endif # 如果你有自己的签名,可以替换androiddebugkeyLOCAL_CFLAGS := -DMyApp_SIGNATURE=$(LOCAL_KEYSTORE_FILE)$(LOCAL_KEY_ALIAS):$(LOCAL_KEY_PASSWORD) # 设置签名 ifeq ($(findstring $(LOCAL_KEYSTORE_FILE),$(LOCAL_PROPERTIES)),) $(eval $(call inherit-product,$(LOCAL_PATH)/android.product.prop)) $(LOCAL_PROPRIETARY_ADD prop:$(LOCAL_KEYSTORE_FILE)=$(LOCAL_KEYSTORE_FILE)) $(LOCAL_PROPRIETARY_ADD prop:$(LOCAL_KEY_ALIAS)=$(LOCAL_KEY_ALIAS)) $(LOCAL_PROPRIETARY_ADD prop:$(LOCAL_KEY_PASSWORD)=$(LOCAL_KEY_PASSWORD)) else $(error Key store file $(LOCAL_KEYSTORE_FILE) already set in local.properties) endif include $(BUILD_EXECUTABLE)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值