【问题标题】:Prevent zipalign from compressing .wav files防止 zipalign 压缩 .wav 文件
【发布时间】:2016-03-07 18:11:37
【问题描述】:

我正在尝试重新签署 Android .apk。即它目前是自签名的,我希望用官方证书重新签名。

为此,我

  1. 下载构建档案
  2. 将其从 name.apk 重命名为 name.zip
  3. 解压压缩包
  4. 删除 META-INF
  5. 压缩备份目录
  6. 将 .zip 重命名为 .apk
  7. 使用 jarsigner 使用官方密钥库对 .apk 进行签名
  8. 对已签名的 .apk 运行 zipalign

但是,当我将 .apk 上传并运行到移动设备时,它会在启动时崩溃。这是由以下错误引起的

Caused by: android.content.res.Resources$NotFoundException: File res/raw/my_file.wav from drawable resource ID #0x7f070002
Caused by: java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed

果然,当我查看控制台日志时,我可以看到 zipalign 正在压缩这个文件

res/raw/my_file.wav (OK - compressed)

应该这样做

res/raw/my_file.wav (OK)

如何让 zipalign 不压缩我的 .wav 文件?根据这个答案,Android 不应该压缩 .wav 文件。

FileReader csv : FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed

在运行 zipalign 之前,我还注意到了一个警告。即它在我运行 jarsigner 后出现

No -tsa or -tsacert is provided and this jar is not timestamped. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (2043-01-30) or after any future revocation date.

出现此消息的原因是什么?看起来可能是相关的。

【问题讨论】:

    标签: android code-signing zipalign


    【解决方案1】:

    在资产文件夹中打开压缩文件存在限制。这是因为解压后的文件可以直接内存映射到进程的虚拟地址空间,从而避免了再次需要相同数量的内存进行解压。 您可以阅读此article 以获得参考。

    【讨论】:

    • 但是我怎样才能避免压缩呢?现有版本不压缩 wav 文件,我希望这样做吗?
    【解决方案2】:

    从同事那里得到了解决方案。基本上我不应该提取档案。为了解决这个问题,我做了以下操作

    1. 下载构建档案
    2. 将其从 name.apk 重命名为 name.zip
    3. 从 name.zip 中删除 META-INF

    例如

    7z d name.zip META-INF
    
    1. 将 .zip 重命名为 .apk
    2. 使用 jarsigner 使用官方密钥库对 .apk 进行签名
    3. 对已签名的 .apk 运行 zipalign

    【讨论】:

      猜你喜欢
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2014-10-18
      • 2012-03-17
      • 1970-01-01
      相关资源
      最近更新 更多