我正在为我们部署给客户的设备(LG p509-Optimus 1)开发一个自动应用程序更新解决方案。我们控制着这些设备,目前在它们上安装了一个自定义内核(但不是一个完整的自定义ROM)。由于我们试图在设备上自动更新我们的应用程序,我们需要用我们控制的密钥对系统进行签名,这样我们就可以用相同的密钥对应用程序进行签名(以获得INSTALL_PACKAGES权限)
我在设备上运行AOSP构建时遇到了一些问题(使用LG发布的设备源代码),我正试图退一步评估我们的选择。我有几个问题:
- 把system.img从电话上取下并放弃内容可行吗?如果是,系统apk位于哪里?我浏览了PackageManager的源代码,它使用一个系统包(似乎被称为"android")来比较应用程序,看看它们是否被允许拥有系统权限
- 这里有没有人为设备创建了一个自定义ROM,可以就如何将我们的签名作为系统签名提供一些建议
任何见解都将不胜感激。
好吧,我们想好了。我不打算详细介绍(写得太多),但对于任何一个偶然发现这一点的人来说,以下是基本要点:
如果你想更改系统签名的密钥,你需要执行以下步骤:
- 从正在运行的手机中提取
/system/
目录 - 检查
.apk
文件(来自/system/app
和/system/framework
),找出哪些文件使用与framework-res.apk
相同的密钥进行签名。我使用了链接到这里的脚本的修改版本来确定要签署哪些APK - 如果
/system/app
中与framework-res.apk
共享签名密钥的APK已被odex,则需要对其进行解odex - 放弃APK和
framework-res.apk
,并将它们打包在update.zip
中(谷歌如何做到这一点)
在我的特定设备上,我不得不从/system/framework
中退出/system/framework/framework-res.apk
和/system/framework/lge-res.apk
,还必须从/system/app
文件夹中取消odex并签署20个.apks
,以使一切顺利运行。
"系统apk"是/system/framework/framework.jar
。我从未尝试过对系统映像进行重新签名,但我已经编写了系统映像的一部分代码(不在正常的apk项目中),它成为了这个jar的一部分。该目录中还有其他jar,可能也需要重新签名。
签名是随机创建的,并放置在构建环境中的两个文件build/target/product/security/platform.pk8
和build/target/product/security/platform.x509.pem
中。我不知道如何从普通的密钥存储中提取这些密钥,但我已经能够将它们从一个固件构建复制到另一个固件,以确保两个映像都具有相同的平台密钥。此外,我还可以使用以下命令更改APK的签名:java -jar signapk.jar platform.x509.pem platform.pk8 Old.apk New.apk
。您将在您的构建中找到signapk.jar,位于out/host/linux-x86/framework/signapk.jar