在设备上重新签名system.img

18
我正在为设备(LG p509 - Optimus 1)开发一种自动应用更新解决方案,我们会将其部署给我们的客户。我们控制这些设备,目前在它们上安装了一个自定义内核(但不是完整的自定义 ROM)。由于我们试图在设备上进行应用程序的自动更新,因此我们需要使用我们控制的密钥对系统进行签名,以便我们可以使用相同的密钥签署我们的应用程序(以获取 INSTALL_PACKAGES 权限)。
我在设备上运行 AOSP 构建时遇到了一些问题(使用 LG 发布的设备源代码),现在正在退后一步评估我们的选择。我有几个问题:
  1. 仅从手机上拉取 system.img 并重新签署内容是否可行?如果是,系统 apk 位于何处?我查看了 PackageManager 源代码并发现它使用系统软件包(似乎被称为“android”)与应用程序进行比较,以查看它们是否有权限获得系统权限。
  2. 在该设备上是否有人创建了自定义 ROM,并能够提供一些关于如何使我们的签名成为系统签名的建议?
希望能得到任何见解。
2个回答

15

好的,我们已经找到解决方法。我不会详细解释(写太多了),但以下是基本步骤:

如果要更改系统签名使用的密钥,您需要执行以下步骤:

  • 从运行中的手机中提取/system/目录
  • 检查/system/app/system/framework中的.apk文件,以确定哪些文件与framework-res.apk使用相同的密钥进行签名。我使用的是一个修改版本的脚本(在这里给出链接)来查找要签名的APK。
  • 如果/system/app中与framework-res.apk共享签名密钥的APK为odex格式,则需要将其去odex化
  • 重新签名APK和framework-res.apk并将它们打包成一个update.zip(请谷歌如何操作)。

在我的设备上,我不仅需要重新签名/system/framework/framework-res.apk/system/framework/lge-res.apk,还必须对/system/app文件夹中的20个.apks进行去odex化和重新签名,以使所有东西都能正常运行。


在您分享的链接中提到,我们需要在签署相关apk(在system / apps和framework-res.apk中)后进行zipalign。但是在这里,您提到我们需要将其update.zip。这两者是否相同?请解释一下一旦apk被签署后需要做什么? - Basher51
Zipaligning与update.zip不同。有关如何进行zipalign的更多信息,请查看Google文档(http://developer.android.com/tools/help/zipalign.html)。在进行zipalign之后,您可以按照http://forum.androidgadget.co.uk/showthread.php?tid=338中描述的方式创建update.zip。 - natez0r
一旦apk文件被zipalign,我们是否可以将它们直接复制到SD卡,然后再复制到system/app目录下(与我们最初所做的过程相反)而不是创建update.zip文件?此外,由于我们没有将odex文件复制回system/app目录,因此新签名的apk文件是否会与其对应的旧odex文件产生任何问题(或者odex文件是否由JVM重新创建)? - Basher51
谢谢!我已经成功更改了设备的系统签名,并且将我的应用程序作为系统应用运行。除了先前的疑问外,请再澄清一个问题。当我们将系统的签名更改为我们的签名时,那么系统/app文件夹中的应用程序(签名被更改的应用程序)的“更新”会发生什么?每当来自Google Play的应用程序进行更新时,它们是否会得到更新(因为我相信Google Play中的应用程序的签名与现在system/app中的应用程序不同)?续... - Basher51
还是会有弹出对话框之类的东西出现在设备上,提示更新被中止,因为签名不同吗?PS:我只是想确认这种行为,因为我真的不希望那些弹出窗口出现(我可以接受系统应用程序具有不同签名而不进行更新)。 - Basher51
显示剩余5条评论

8
"系统apk"指的是/system/framework/framework.jar。我从未尝试过重新签署系统镜像,但我编写的代码是系统镜像的一部分(不在普通apk项目中),并成为此jar文件的一部分。该目录中还有其他的jar文件可能需要重新签名。
签名是随机创建的,并放置在构建环境中的两个文件中:build/target/product/security/platform.pk8build/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。"

看起来 framework-res.apk 是我正在寻找的系统签名锚点。仍在努力重新签名所有正确的文件,但这是一个开始。谢谢! - natez0r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接