【问题标题】:Why zipaligning after the signing-process?为什么要在签名过程之后进行 zipaligning?
【发布时间】:2015-01-24 10:20:19
【问题描述】:

我最近问自己为什么在 android 中我们必须先签名然后然后 zipalign apk。我搜索了一些背景信息,这些过程在技术上是如何工作的。我还是有点不高兴,因为这些描述并没有真正从技术上解释为什么这个序列是必要的。

但让我们从头开始:

我知道在 apk-build-process 中必须遵循以下顺序

  1. 很多先前的步骤...
  2. 创建 apk 文件
  3. 签署 apk 文件(修改 apk)
  4. zipaligning apk 文件(修改 apk)

我在这里找到了一些信息:
zipalign

所以很明显 zipalign 会将内部对齐到 4 字节边界,以便所有内容都可以使用 mmap 加载。 似乎签名过程会破坏这种对齐方式。因此,签名后必须在流程结束时调用 zipaligning。

但是为什么可以在不破坏 apk 签名的情况下重新对齐 apk 内容!?
apk 被修改,修改后的签名不应该是有效的 apk,我想......

也许有人比我在这里找到的技术背景信息更多:
Signing your application

谢谢,如果有人有一些有用的、技术上更详细的信息。
卢克

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为它与包后处理有关,而不是与编程有关。跨度>
  • 我不确定,但我相信签名是基于 APK 的逻辑内容,而不是它们在 ZIP 存档中的物理位置。

标签: android sign android-build zipalign


【解决方案1】:

APK 的数字签名是通过散列 APK 组件来执行的。因此,您正在保护单个文件的内容,而不是它们在内存中的位置。换句话说,APK 内容是签名的,而不是 APK 本身作为单个文件。正如您正确指出的那样, zipalign 只是在 APK 中填充文件,以便它们从对齐的边界开始,从而更有效地 mmap(2)(并且能够轻松地丢弃文件)。但是,内容不会改变,因此不会违反签名。

【讨论】:

  • 您的回答将完美地解释这个事实,为什么这个订单是必要的。我很确定,apk 中的那些 paddy 字节在签名时会被忽略。很高兴你能提供一个链接到你的签名描述。坦克
  • 忽略字节是正确的 - 再次,签名是基于每个文件的(每个文件都有一个 SHA1 值 - 你可以查看 MANIFEST 文件)。至于链接 - 这是来自 Jonathan Levin 的一本关于 Android Internals 的书,其中详细介绍了确切的过程(虽然它是一本书,而不是一个网站)。但是,我们不确定 SO 是否允许链接或背书 - 因此我们建议在此处使用 Google,并且仅将其作为对您问题的直接回答。
  • 感谢您的回答。这本书似乎很有趣,如果谷歌也能提供更详细的信息,我将不胜感激。谷歌大多提供高质量的文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 2021-05-14
  • 2012-12-18
相关资源
最近更新 更多