在设备上退出 system.img

Posted

技术标签:

【中文标题】在设备上退出 system.img【英文标题】:Resigning system.img on a device 【发布时间】:2012-03-17 13:10:45 【问题描述】:

我正在为我们部署给客户的设备 (LG p509 - Optimus 1) 开发自动应用更新解决方案。我们控制了这些设备,目前在它们上安装了自定义内核(但不是完整的自定义 ROM)。由于我们正在尝试在设备上自动更新我们的应用程序,因此我们需要使用我们控制的密钥对系统进行签名,以便我们可以使用相同的密钥对我们的应用程序进行签名(以获得 INSTALL_PACKAGES 权限)。 我在设备上运行 AOSP 构建时遇到了一些问题(使用 LG 发布的设备源代码),我试图退后一步并评估我们的选择。我有几个问题:

    是否可以将 system.img 从电话中拔出并退出内容?如果是这样,系统 apk 位于何处?我浏览了 PackageManager 源代码,它使用一个系统包(似乎称为“android”)来比较应用程序,看看它们是否被允许拥有系统权限。 这里有没有人为设备创建了一个自定义 ROM,可以就如何让我们的签名成为系统签名提供一些建议?

任何见解将不胜感激。

【问题讨论】:

【参考方案1】:

好的,所以我们想通了。我不打算详细介绍(写太多),但对于任何偶然发现此问题的人来说,这里是基本要点:

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

从正在运行的手机中提取/system/ 目录 检查.apk 文件(来自/system/app/system/framework),以确定哪些文件由与framework-res.apk 相同的密钥签名。我使用脚本 linked here 的修改版本来确定要签名的 APK。 如果 /system/app 中与 framework-res.apk 共享签名密钥的 APK 被 odexed,则需要 to de-odex them。 退出 APK 和 framework-res.apk 并将它们打包到 update.zip 中(谷歌如何做到这一点)。

在我的特定设备上,我必须从/system/framework 中同时退出/system/framework/framework-res.apk/system/framework/lge-res.apk,并且还必须从/system/app 文件夹中解压缩并签名20 .apks,以使一切顺利进行。

【讨论】:

在您分享的链接中提到,一旦我们签署了相关的 apk(在系统/应用程序中)和 framework-res.apk,我们就需要 zipalign。但是在这里您提到我们需要 update.zip .都是一样的吗?你能解释一下apks签名后需要做什么吗? 我已经签署了所有相关的 apks。现在,由于我已经对一些 apks 进行了 de-odex(在签名过程之前),因此我不应该在将它们复制回设备之前对它们进行 odex 吗?我不知道该怎么做。你能帮忙吗.. Zipaligning 与 update.zip 不同。有关如何 zipalign 的更多信息,请查看 google 的文档 (developer.android.com/tools/help/zipalign.html)。压缩对齐后,您可以创建 update.zip 类似于他们在forum.androidgadget.co.uk/showthread.php?tid=338 中描述的方式 在将 APK 移回设备之前,您不需要对 APK 进行 odex。 一旦 apk 被压缩对齐,而不是创建 update.zip,我们不能简单地将它们复制到 sd 卡,然后复制到系统/应用程序(与我们最初所做的相反的过程)吗? .此外,由于我们没有将 odex 文件复制回系统/应用程序,因此新签名的 apk 文件不会与其对应的旧 odex 文件(或者 JVM 重新创建的 odex 文件)产生任何问题【参考方案2】:

“系统 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 是我正在寻找的系统签名锚。仍在为让所有适当的文件辞职而烦恼,但这是一个开始。谢谢!

以上是关于在设备上退出 system.img的主要内容,如果未能解决你的问题,请参考以下文章

有人知道iOS设备上的“退出进程”吗?

用户退出应用程序时在设备上安全保存私人数据

GDBSERVER 在启动时退出

在设备上安装给出错误:命令 /usr/bin/codesign 失败,退出代码为 1

退出代码 1 失败

当用户通过向上滑动强制退出应用程序时,可操作的推送通知不会出现在 iOS 8+ 设备上