Android 编译使用哪个key签名?

文章目录

Android 编译使用哪个key签名?

一看Android.mk

在我们内置某个apk的时候都会带有Android.mk,我们都知道系统内置的apk是不能卸载的,那能不能reinstall呢?这里面就写明了该APK使用的是什么签名,如:

makefile 复制代码
LOCAL_CERTIFICATE := platform

表明使用的是platform签名,对于这句而言,不论你内置的apk有签名与否,install之前都会将apk做resign的操作,会签系统签名。这样以来,我们再次install该apk的时候 ,由于签名不同 ,是不能进行安装升级的。

makefile 复制代码
LOCAL_CERTIFICATE := PRESIGNED

表明使用的是apk原本的签名,记住这里的PRESIGNED需要大写。这样就告诉编译器不用去resign,一直保留我们自己的签名,这样我们就可以成功的install和升级了。

案例:编译时不对AdobeAcrobat进行系统签名,使用apk原本的签名,可以解决无法通过谷歌商店更新的问题。

二看产品自定义秘钥

大部分公司在自定义自己的秘钥的时候,都会做出如下修改

1.在产品的mk中指定PRODUCT_DEFAULT_DEV_CERTIFICATE,如:

device/amlogic/产品名/产品名.mk:

makefile 复制代码
# 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

2.一旦指定了PRODUCT_DEFAULT_DEV_CERTIFICATE就不会再使用默认的testkey。

build/core/config.mk文件:

makefile 复制代码
# 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

properties 复制代码
[@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

不同的编译模式使用了不同的默认密钥。

总结:

  1. 内置apk,签名要看mk文件中的LOCAL_CERTIFICATE,指定是谁就是谁
  2. 如果没有指定LOCAL_CERTIFICATE,使用的是产品自定义的秘钥以及编译模式
  3. 如果产品没有指定自定义秘钥,那么就是testkey
相关推荐
QuantumLeap丶12 分钟前
《Flutter全栈开发实战指南:从零到高级》- 22 -插件开发与原生交互
android·flutter·ios
2501_9159214334 分钟前
混合开发应用安全方案,在多技术栈融合下构建可持续、可回滚的保护体系
android·安全·ios·小程序·uni-app·iphone·webview
AllBlue1 小时前
unity嵌入安卓界面,如何显示状态
android·unity·游戏引擎
QuantumLeap丶1 小时前
《Flutter全栈开发实战指南:从零到高级》- 21 -响应式设计与适配
android·javascript·flutter·ios·前端框架
用户69371750013842 小时前
24.Kotlin 继承:调用超类实现 (super)
android·后端·kotlin
00后程序员张2 小时前
Fastlane 结合 开心上架,构建跨平台可发布的 iOS 自动化流水线实践
android·运维·ios·小程序·uni-app·自动化·iphone
游戏开发爱好者82 小时前
iOS 性能测试的工程化方法,构建从底层诊断到真机监控的多工具测试体系
android·ios·小程序·https·uni-app·iphone·webview
帅得不敢出门3 小时前
Android11~13 Framework实现Ntp服务器多域名轮询同步时间
android·服务器·python·framework·github
2501_916008893 小时前
iOS App 混淆的真实世界指南,从构建到成品 IPA 的安全链路重塑
android·安全·ios·小程序·uni-app·cocoa·iphone