【问题标题】:Android build apk: control MANIFEST.MFAndroid 构建 apk:控制 MANIFEST.MF
【发布时间】:2018-03-22 01:45:34
【问题描述】:

Android 构建 apk:

假设一个 apk 包含一个具有 META-INF/MANIFEST.MF 的库 jar(例如 foo.jar),这对于它的功能很重要。但是在 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


    【解决方案1】:

    您应该查看 Android Gradle 插件的 packagingOptions 配置块。

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

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

    查看文档

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

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

    是的,如果您重新打包 apk,您需要使用密钥库对其进行签名才能成功安装它。您可以选择使用您 sdk 中构建工具中的 apksigner 使用 v2/v1(或针对较低 api 的应用程序)签名方案之一对其进行签名。

    虽然没有必要这样做(如果您已在 buildscript 中设置签名配置),但如果 packagingOptions 适合您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 2023-03-29
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      相关资源
      最近更新 更多