在 Android 应用程序的发布过程中,APK 的签名是一项至关重要的任务。签名确保应用程序的完整性、真实性和安全性。
一、应用程序签名介绍
1、应用程序签名的意义
应用程序签名是将数字签名应用于 Android 应用程序(APK 文件)的过程。它使用密钥对对应用程序进行加密,确保在应用程序发布和分发过程中的完整性和真实性。
- 验证完整性:签名可确保 APK 文件在传输或分发过程中没有被篡改或损坏。
- 验证真实性:签名允许用户验证应用程序的来源和开发者身份,以确保 APK 来自可信的来源。
- 安全性:签名可以防止恶意用户在未经授权的情况下更改应用程序的代码或资源。
2、应用程序签名的流程
(1)生成密钥库:首先,开发者需要使用 keytool 工具生成一个密钥库(JKS 文件),其中包含用于签名的密钥对。
(2)配置构建脚本:开发者需要在构建脚本(如 build.gradle)中配置签名相关的信息,包括密钥库的路径、别名和密码等。
(3) 使用 apksigner 工具进行签名:在构建过程的最后阶段,使用 apksigner 工具对 APK 进行签名,并输出签名后的 APK 文件。

3、应用程序签名的方案
(1)APK 签名方案 V1(JAR 签名)
传统的 APK 签名方案,兼容所有 Android 版本。使用 JAR 签名对 APK 进行签名。
(2)APK 签名方案 V2
引入了增强的签名机制和对 APK 内容的完整性校验。适用于 Android 7.0。
(3)APK 签名方案 V3
引入了进一步增强的签名机制和对 APK 内容的完整性校验。适用于 Android 9.0 及更高版本。
参考官方地址:
应用签名:https://source.android.com/docs/security/features/apksigning?hl=zh-cn
4、签名的重要性和应用场景
(1) 系统应用签名:在 AOSP 中,系统应用必须进行签名,以确保系统的完整性和安全性。
(2) Google Play Store 发布要求:如果你计划将应用程序上传到 Google Play Store,它必须使用符合要求的签名方案进行签名。
(3) 应用程序验证和更新:签名允许设备验证应用程序的完整性,并支持应用程序的安全更新。
二、AOSP 的应用签名
1、AOSP的应用签名文件路径
AOSP的应用签名文件位于 /build/target/product/security 目录下。该目录下包含四个签名文件:
- testkey.x509.pem:用于签名测试应用程序的签名文件。
- platform.x509.pem:用于签名系统应用程序的签名文件。
- shared.x509.pem:用于签名需要与 home/contacts 进程共享数据的应用程序的签名文件。
- media.x509.pem:用于签名 media/download 系统中的应用程序的签名文件。

默认情况下,AOSP 使用 testkey.x509.pem 签名所有应用程序。如果要为应用程序使用其他签名文件,可以将签名文件复制到 /build/target/product/security 目录下,并在应用程序的 Android.mk 文件中指定签名文件的名称。
2、AOSP环境下应用程序指定签名文件
AOSP 使用 Android.mk 配置文件编译代码,LOCAL_CERTIFICATE 属性用于为应用程序指定签名文件
暂时无法在飞书文档外展示此内容
如果您要为应用程序使用自定义签名文件,可以使用 LOCAL_CERTIFICATE_FILE 变量指定签名文件的路径。
暂时无法在飞书文档外展示此内容
请注意,AOSP 中的签名文件都是 .pem 格式的 X.509 证书文件。
3、AOSP环境下应用签名预编译打包
放置应用apk到系统目录中:
.\vendor\ThirdpartApp\skyworth\coocaa\CooDuplexCoreNormalRelease

应用指定平台签名并进行预编译:
.\vendor\ThirdpartApp\skyworth\Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE := CooDuplexCoreNormalRelease
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := coocaa/CooDuplexCoreNormalRelease/CooDuplexCoreNormalRelease.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_ENFORCE_USES_LIBRARIES := false
LOCAL_DEX_PREOPT := false
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform //这里使用平台签名
include $(BUILD_PREBUILT) //预编译
应用打包到out目录下:
.\vendor\ThirdpartApp\skyworth\install.mk
PRODUCT_PACKAGES += \
jxwgb_6.0_zzjz_sign \
jxwgb_ycgk_6.0_one_gps_jxw_sign \
StudyJxw \
CooDuplexCoreNormalRelease \ //应用打包到out目录下
CooParkCoocaaTabletRelease \
CooSnapSolveNormalRelease \
EnglishAISpeakNormalTabletRelease \
SAL \
systemservice \
upgrade \
TeamPresent \
EducateNormalRelease \
brainmarket \
CUCC-DEFAULT-LAUNCHER-pad
4、AOSP中使用定制平台签名文件
定制签名文件存放路径:device/skyworth/common/security

将定制文件拷贝到系统存放签名文件的目录下:build/make/target/product/security

具体的拷贝指令:build/make/envsetup.sh

5、关于平台签名配置字段说明
LOCAL_CERTIFICATE := PRESIGNED
表示使用APK原有的第三方签名(即预签名),通常用于集成无源码的第三方APK到系统镜像中。此时系统不会重新签名,而是直接保留APK自带的签名文件(如META-INF/下的CERT.RSA等)。这种方式适用于需要保持原有签名的场景,例如预装厂商合作应用
LOCAL_CERTIFICATE := platform
表示使用系统平台密钥(platform.pk8和platform.x509.pem)对APK进行签名。这类签名赋予APK系统级权限(如android.uid.system),允许访问受保护的API或资源(如修改系统时间)。平台密钥默认位于build/target/product/security/目录下,是系统核心组件签名的标准方式
6、外部环境内下应用平台签名

signapk.jar可以通过编译aosp源码中的 build\tools\signapk 获得
platform签名密钥可以从aosp源码中的 build/make/target/product/security 获取。其中platform.pk8就是我们的私钥,platform.x509.pem就是我们的公钥。
将需要进行签名的apk放置于工具同级目录下
运行bat脚本,就会生成平台签名的apk
三、Android Studio 的应用签名
1、Android Studio 签名步骤
第一步:在工具栏中,单击 Build > Generate Signed APK Bundle or APK…


第二步:如果还没有生成过签名文件,那么就点击create new 进行创建

第三步:编辑信息

示例:

第四步:生成签名文件
点击ok后,上一个页面就自动填写好了 ,然后现在对应的目录下就会有这个文件了
注意:自己的签名文件密码和别名别忘记了,后续还会用到哦
2、Android Studio使用签名文件打包
第一步:将上一步生成的签名文件拷贝到studio目录中

第二步:配置签名文件

3、Android Studio 选择签名方案
旧版本的 Android Studio 可以选择 V1 或 V2 签名方案,新版本的Android Studio(Android Studio Hedgehog | 2023.1.1)没有此选项了,默认是只有 V2 签名。
server@dev-fj-srv:~$ apksigner verify -verbose demo-release.apk
Verifies
Verified using v1 scheme (JAR signing)


381

被折叠的 条评论
为什么被折叠?



