Android构建apk:控制MANIFEST.MF

问题描述 投票:0回答:2

Android 构建 apk:

假设一个 apk 包含一个库 jar(例如 foo.jar),该库具有 META-INF/MANIFEST.MF,这对于它的运行很重要。但是APK中有一个包含签名数据的MANIFEST.MF,并且lib jar MANIFEST.MF丢失了。

APK
   META-INF/MANIFEST.MF

有没有办法向 MANIFEST.MF 添加更多属性或将 lib jar MANIFEST.MF 合并到其中?

更新

解压apk后,在MANIFEST.MF中添加一些属性并重新打包apk,

packageDebug {
   doLast {
      // add attributes to MANIFEST.MF
   }
}

错误:

Installation failed with message INSTALL_PARSE_FAILED_NO_CERTIFICATES: 
Failed to collect certificates from /data/app/vmdl1096113886.tmp/base.apk: 
META-INF/CERT.SF indicates /data/app/vmdl1096113886.tmp/base.apk is signed 
using APK Signature Scheme v2, but no such signature was found. Signature stripped?.

MANIFEST.MF 和 CERT.SF 都包含相同的摘要哈希。修改MANIFEST.MF后是否需要重新签名apk? MANIFEST.MF 本身没有摘要哈希。

Scheme V2 签名应该在哪里?

有没有办法在apk签名之前修改apk? packageDebug 的 doLast 来得太晚了。

android jar apk manifest sign
2个回答
1
投票

您应该查看 Android Gradle 插件的

packagingOptions
配置块。

它基本上是一个 DSL 对象,可以用类似的方式配置

android { 
    packagingOptions {
        excludes {
            pickfirsts = [/file1, ...]
            excludes = []
        }
    } 
}

查看文档

通常有一个默认过滤器,排除第三方库的 META-INF 下的正则表达式(在上面的示例中,我们将其设置为空)。

你的用例是什么?因为我还没有遇到过需要查找 manifest.mf 的 jar,除了验证内容的完整性之外。

是的,如果您重新打包 apk,您需要使用密钥库对其进行签名才能成功安装它。您可以选择使用 sdk 中的构建工具中的

apksigner
来使用 v2/v1(或两者都适用于针对较低 api 的应用程序)签名方案进行签名。

虽然没有必要这样做(如果您已在

buildscript
中设置了签名配置),但如果
packagingOptions
适合您。


0
投票

APK 的 v2v3v3.1 签名方案与 v1 JAR 签名完全不同。

虽然 v1 JAR 签名将文件添加到

META-INF
目录,但后来的 APK 签名方案在普通 PKZIP 文件格式部分之间添加了一个新的二进制格式部分。

v4又不同了,我不太明白它是如何工作的。我也无法了解 AAB 捆绑包的签名是如何工作的。

© www.soinside.com 2019 - 2024. All rights reserved.