我正在为我们部署给客户的设备(LG p509 - Optimus 1)开发自动应用程序更新解决方案。我们可以控制这些设备,并且目前在它们上安装自定义内核(但不是完整的自定义 ROM)。由于我们试图在设备上自动更新我们的应用程序,因此我们需要由我们控制的密钥对系统进行签名,以便我们可以使用相同的密钥对我们的应用程序进行签名(以获得 INSTALL_PACKAGES 权限)。
我在设备上运行 AOSP 版本时遇到了一些问题(使用 LG 发布的设备源代码),我正在尝试退后一步并评估我们的选择。我有几个问题:
任何见解将不胜感激。
好的,所以我们想通了。我不会详细介绍(写得太多),但对于任何偶然发现这一点的人来说,这是基本要点:
如果您想更改系统签名的密钥,您需要执行以下步骤:
/system/
目录.apk
文件(来自 /system/app
和 /system/framework
),找出哪些文件与 framework-res.apk
使用相同的密钥进行签名。我使用了脚本的修改版本链接到这里来确定要签署哪些APK。/system/app
中与framework-res.apk
共享签名密钥的APK已被odex,您需要对其进行反odex。framework-res.apk
并将它们打包到 update.zip
中(谷歌如何做到这一点)。在我的特定设备上,我必须从
/system/framework/framework-res.apk
中退出 /system/framework/lge-res.apk
和 /system/framework
,并且还必须从 .apks
文件夹中删除并签署 20 /system/app
,以使一切顺利运行。
“系统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