Android 源码中如何生成一个platform JKS 文件?

news/2025/9/25 17:23:34/文章来源:https://www.cnblogs.com/Greg-Lyu/p/19111614

首先我们需要在源代码环境中将 build/target/product/security/ 文件夹 copy 到本地。
下边的操作需要在 ubuntu 或者 mac 下。

重要安全提醒:platform 密钥是系统级私钥,拥有它就能签出系统权限应用。不要把它放到公共机器 / 共享位置,谨慎保管,必要时改密码并限制访问。


1) 先看看文件格式(确认 pk8 是二进制还是 PEM)

file platform.pk8
# 或
head -n 3 platform.pk8
  • 如果看到 -----BEGIN 开头,那就是 PEM 格式私钥(可以直接用)。
  • 如果是二进制(比如 data / DER),需要先把它转换成 PEM。

2)(如果需要)把 platform.pk8 转成 PEM 私钥

仅当 platform.pk8 不是 PEM(即是 DER/PKCS8 二进制)时运行:

openssl pkcs8 -in platform.pk8 -inform DER -out platform.key.pem -nocrypt

如果 platform.pk8 已经是 PEM,就把它重命名/复制为 platform.key.pem

cp platform.pk8 platform.key.pem

3) 用证书 + 私钥 导出 PKCS#12(.p12)

把 cert 和私钥合成一个 .p12(后面用 keytool 导入到 JKS):

openssl pkcs12 -export \-inkey platform.key.pem \-in platform.x509.pem \-name platform \-out platform.p12
  • 上面会提示你设置一个导出密码(Export Password)。记住它,后面导入时需要(示例中我们用 p12pass 说明,运行时请用安全密码)。

如果你想在命令行里直接设置密码(不建议在公共 shell 历史中出现),可以:

openssl pkcs12 -export -inkey platform.key.pem -in platform.x509.pem -name platform -out platform.p12 -passout pass:p12pass

4) 把 PKCS#12 导入 Java Keystore(.jks)

keytool.p12 转成 platform.jks

keytool -importkeystore \-deststorepass android \-destkeypass android \-destkeystore platform.jks \-srckeystore platform.p12 \-srcstoretype PKCS12 \-srcstorepass p12pass \-alias platform
  • 这里 -deststorepass / -destkeypass 我示例用了 android(方便演示),实际请用强密码替换。
  • -srcstorepass 要填第 3 步时你设的导出密码(上例是 p12pass)。

5) 验证 keystore 内容

keytool -list -v -keystore platform.jks -storepass android

输出里应该能看到 alias platform,以及证书信息(Subject/Issuer/有效期等)。若看到就成功了。


6) 用 platform.jks 给 APK 签名(示例:apksigner)

建议用 apksigner(Android build tools 提供):

# 使用 apksigner(Android build-tools >= 24)
apksigner sign --ks platform.jks --ks-pass pass:android --ks-key-alias platform app-system-signed.apk

或者用 jarsigner(旧法):

jarsigner -keystore platform.jks -storepass android -keypass android app-release-unsigned.apk platform

然后最好用 zipalign(如果是最终安装包)和 apksigner verify 验证签名:

# zipalign (android sdk build-tools)
zipalign -v 4 app-release-unsigned.apk app-aligned.apk
apksigner verify --verbose --print-certs app-aligned.apk

额外说明(常见问题)

  • 如果 openssl pkcs12 报错 “Mac verify error:invalid password?”:说明你提供的 -passout/交互密码不匹配,重试并确认密码。
  • 如果 platform.pk8 是加密私钥(很少见),需要先用 openssl 解密(需要原始密码)。
  • 系统签名要求与 ROM 中的 platform.x509.pem/platform.pk8 一致:如果你用的是源码树同目录下的 key,那么在制作系统镜像时签名一致,App 能拿到 android:sharedUserId="android.uid.system" / signature|system 等特权。
  • 如果你只是本地测试并不想替换设备系统的 platform key,更安全的做法是在自建的测试 ROM 中使用该 key 签名或把签名后的 apk 放到 /system/priv-app/ 并设置正确权限。直接在俗称的“普通设备”上用 platform key 安装可能受系统限制(厂商 ROM 与密钥不同)。

简短命令总览(一键版,假设 pk8 为二进制)

# 转成 PEM(如果已经是 PEM 可跳过)
openssl pkcs8 -in platform.pk8 -inform DER -out platform.key.pem -nocrypt# 导出 p12(会询问导出密码)
openssl pkcs12 -export -inkey platform.key.pem -in platform.x509.pem -name platform -out platform.p12# 导入到 JKS(示例密码:android / p12pass,实际请换强密码)
keytool -importkeystore -deststorepass android -destkeypass android -destkeystore platform.jks \-srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass p12pass -alias platform# 验证
keytool -list -v -keystore platform.jks -storepass android

如何将 jks 文件导入到项目的gradle中?

1. 放置位置

常规做法是把 platform.jks 放在工程目录下的某个子目录(例如 app/keystore/platform.jks),不要放进版本控制,只在本地或 CI 构建机上保管。


2. 配置 gradle.properties(推荐)

在项目根目录的 gradle.properties 中写上 keystore 信息(可以避免明文写在 build.gradle 里):

MY_KEYSTORE=app/keystore/platform.jks
MY_KEYSTORE_PASSWORD=android
MY_KEY_ALIAS=platform
MY_KEY_PASSWORD=android

这里密码要替换成你创建 jks 时设定的。


3. 配置 app/build.gradlesigningConfigs

android {signingConfigs {platform {storeFile file(MY_KEYSTORE)storePassword MY_KEYSTORE_PASSWORDkeyAlias MY_KEY_ALIASkeyPassword MY_KEY_PASSWORD}}buildTypes {release {signingConfig signingConfigs.platformminifyEnabled falseshrinkResources false}debug {// 如果需要调试也走 platform 签名(一般系统 App 要这样)signingConfig signingConfigs.platform}}
}

4. 构建 & 签名

这样执行 ./gradlew assembleRelease 就会自动用你 platform.jks 里的 key 来签名 APK。


5. 额外提醒 ⚠️

  • 普通设备上安装不了:因为你拿到的 platform key 跟设备出厂的 system.img 里用的不一样,只有在你自己编的系统(刷机)里,才能识别为“系统签名”。
  • 真机系统 App 场景:如果你控制了固件(比如手表项目),就可以在同一套 key 下签 ROM 和 APK,这样 Gradle 打出来的包就能拥有系统签名权限(例如 android:sharedUserId="android.uid.system"signature|system 权限)。
  • 密钥最好不要随项目源码走,建议本地配置或 CI 配置注入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端面试八股(go 方向)

go 后端面试准备 一、Go语言相关 1、Go里有哪些数据结构是并发安全的?int类型是并发安全的吗?sync 包中的类型sync.Mutex 和 sync.RWMutex:互斥锁,通过加锁机制保证临界区安全 sync.WaitGroup:用于等待一组 gorou…

ArcGIS 不重叠且无缝的拓扑检查和修改

ArcGIS 不重叠且无缝的拓扑检查和修改创建拓扑: 新建数据库→新建dataset→导入要素 dataset右键新建topo 设置容差和规则 拓扑容差: 0.001 默认标准 0.00001 清查标准 注意:容差为分辨率两倍 拓扑规则: 1.不能重…

C++设计模式之创建型模式:工厂方法模式(Factory Method) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【铸网-2025】线下赛 web 详细题解

<?php show_source(index.php); class MGkk8 {public $a;public $b;public function rpl2(){echo(MGrp12;);$b = $this->b;if ($this->a == "RPG") {echo(ifyes;);($b->a)($b->b."&quo…

2025/9/25

A 用时:1h 预期:100pts 实际:100pts 发现有两种做法,可以直接模拟,递推,复杂度分别为 \(O(n^2)\),\(O(n^2\log n)\),而递推可以用 bitset 压一下。 考虑根号分治复杂度为 \(O(B \times n+\frac{n^2\times log …

唐山市政建设总公司网站重庆装修设计公司排名

181/2461/8938产品概述 R&S SMU200A信号发生器旨在满足现代通信系统研发及其生产中遇到的所有要求。R&S SMU200A矢量信号发生器不仅将多达两个独立的信号发生器组合在一个只有四个高度单位的机柜中&#xff0c;还提供无与伦比的RF和基带特性。 Rohde & Schwarz S…

为什么要建设档案网站个人网页设计思路流程内容

142873-41-4脂质过氧化抑制剂1 英文名称&#xff1a;Lipid peroxidation inhibitor 1 中文名称&#xff1a;脂质过氧化抑制剂 化学名称&#xff1a;2,4,6,7-四甲基-2-[(4-苯基哌啶-1-基)甲基]-3H-1-苯并呋喃-5-胺 CAS&#xff1a;142873-41-4 外观&#xff1a;固体粉末 分…

网站建设 云南如何布局网站

标题链接【RM2021 四川站第二期直播】步兵设计及弹道测试https://bbs.robomaster.com/forum.php?modviewthread&tid11504&extrapage%3D1%26filter%3Dtypeid%26orderby%3Ddateline【RM2021 黑龙江站第4期直播】步兵机械设计入门2https://bbs.robomaster.com/forum.php?…

读书笔记:揭开索引的两个常见误区

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学…

国标GB28181平台EasyGBS如何赋能路网数字化管理与应急指挥?

国标GB28181平台EasyGBS如何赋能路网数字化管理与应急指挥?随着智慧交通建设的深入,海量、异构的道路监控设备如何实现统一接入、低延迟调阅与智能分析成为关键挑战。本文探讨基于GB/T28181国家标准的EasyGBS视频平台…

完整教程:Spring Boot 核心注解分类与应用指南

完整教程:Spring Boot 核心注解分类与应用指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

分布式数据库迁移OceanBase——基于网易云音乐自研CDC服务的平滑迁移方案

分布式数据库迁移OceanBase——基于网易云音乐自研CDC服务的平滑迁移方案网易云音乐在大体量的业务数据背后,是何种技术方案在支撑?本文分享网易云音乐PB级分库分表架构向原生分布式数据库架构迁移的技术优化经验。编…

获取用户ip所在城市

整体流程图获取当前登录用户所在城市,是一个非常常见的需求,在很多业务场景中用到。 比如:导航的定位功能默认选择的城市,或者一些防盗系统中识别用户两次登录的城市不一样的会有报警提示。 下载geoip2数据库 geoi…

郑州市网站建设公司石河子规划建设局网站

文章目录 &#x1f4d6; 前言1. 认识URL && 引入http协议2. http协议格式2.1 宏观格式&#xff1a;2.2 实验演示&#xff1a; 3. http的方法3.1 GET方法&#xff1a;3.2 POST方法&#xff1a;3.3 GET vs POST&#xff1a; 4. HTTP的报头和状态码5. http的cookie5.1 htt…

电商外贸网站建设新网域名自助管理平台

ANSYS Fluent和COMSOL Multiphysics以及OpenFOAM这3款CFD软件哪个好&#xff1f;cfd软件中哪款最实用&#xff1f;cfd软件有哪些&#xff1f;今天就给大家带来这几款CFD软件对比分析&#xff0c;一起来看看吧。 ANSYS Fluent ANSYS Fluent 是一种流行的计算流体动力学 (CFD) …

【Proteus仿真】AT89C51单片机串行数据转换为并行仿真 - 实践

【Proteus仿真】AT89C51单片机串行数据转换为并行仿真 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

第13章 day14-15 Webpack逆向

Webpack逆向 Webpack是一个现代的静态模块打包工具,它主要用于前端开发中的模块化打包和构建。通过Webpack,开发者可以将多个模块(包括JavaScript、CSS、图片等)进行打包,生成优化后的静态资源文件,以供在浏览器…

Viper远程配置踩坑记录

尝试etcd做配置中心,就用了Viper。没想到踩了一堆坑,记录一下。 一开始的代码是这么写的,想着先监听再读取: func initViperRemote() {err := viper.AddRemoteProvider("etcd3","http://127.0.0.1:…

深入解析:JVM(六)-- StringTable

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

开发一个彩票网站多少钱济南医院网站建设服务公司

来源&#xff1a;AI科技评论作者&#xff1a;陈彩娴、Mr Bear编辑&#xff1a;青暮近日&#xff0c;图灵奖得主、“贝叶斯网络之父”Judea Pearl在Twitter上分享了一篇新论文“What are the most important statistical ideas of the past 50 years?”&#xff08;过去50年中最…