在设备上退出 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.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
【讨论】:
似乎 framework-res.apk 是我正在寻找的系统签名锚。仍在为让所有适当的文件辞职而烦恼,但这是一个开始。谢谢!以上是关于在设备上退出 system.img的主要内容,如果未能解决你的问题,请参考以下文章