【问题标题】:Generated APK is not signed if signature v2 is selected如果选择签名 v2,则生成的 APK 未签名
【发布时间】:2019-11-15 13:49:24
【问题描述】:

我正在尝试为我的应用生成一个签名的 APK,如果我只使用签名 V1,它就可以工作。 当我使用签名 V2 然后使用 keytool 检查 apk 时,输出是:

keytool -list -printcert -jarfile app-release.apk
Not a signed jar file

这里是 build.gradle:

def getProps(path) {
    Properties props = new Properties()
    props.load(project.rootProject.file(path).newDataInputStream())
    return props
}

android {
    ...
    signingConfigs {
        debug {
            try {
                Properties props = getProps('./local.properties')
                storeFile file(props.getProperty('DEBUG_STORE_FILE', ''))
                keyAlias props.getProperty('DEBUG_KEY_ALIAS', '')
                keyPassword props.getProperty('DEBUG_STORE_PASSWORD', '')
                storePassword props.getProperty('DEBUG_STORE_PASSWORD', '')
                v1SigningEnabled true
                v2SigningEnabled false // enabling this generates unsigned apk
            }
            catch (ex) {
                throw new InvalidUserDataException("You should define RELEASE_STORE_FILE, RELEASE_KEY_ALIAS, RELEASE_STORE_PASSWORD in local.properties.")
            }
        }
        release {
            try {
                Properties props = getProps('./local.properties')
                storeFile file(props.getProperty('RELEASE_STORE_FILE', ''))
                keyAlias props.getProperty('RELEASE_KEY_ALIAS', '')
                keyPassword props.getProperty('RELEASE_STORE_PASSWORD', '')
                storePassword props.getProperty('RELEASE_STORE_PASSWORD', '')
                v1SigningEnabled true
                v2SigningEnabled false // enabling this generates unsigned apk
            }
            catch (ex) {
                throw new InvalidUserDataException("You should define RELEASE_STORE_FILE, RELEASE_KEY_ALIAS, RELEASE_STORE_PASSWORD in local.properties.")
            }
        }
    }

    defaultConfig {
        ...
        // Only productionRelease flavour uses signingConfigs.release;
        // other flavours(i.e. productionDebug, developmentDebug, developmentRelease)
        // use signingConfigs.debug
        // https://stackoverflow.com/questions/30898611/gradle-signing-flavors-with-different-keys-on-android
        signingConfig signingConfigs.release
    }
    buildTypes {
        release {
            ...
        }
        debug {
            ...
            signingConfig signingConfigs.debug
        }
    }
    // Dimensions: environment can be one of [development, production]
    flavorDimensions "environment"
    productFlavors {
        development {
            ...
            signingConfig signingConfigs.debug
            ...
        }
        production {
            dimension "environment"
        }
    }
    ...
}

我还从头开始创建了一个新的 Android 项目,它也有同样的问题。

请注意,我有另一个 Android 项目,它可以生成选择 V1 和 V2 的签名 APK。

为什么添加签名 V2 会导致生成未签名的 APK?

【问题讨论】:

  • 你的 minSdkVersion 是多少?
  • minSdkVersion 24, targetSdkVersion 27, compileSdkVersion 28
  • 顺便说一句,截至今天,我无法在 Windows 上重现 Android Studio 3.5.3 的问题。我想我遇到它时使用的是Android Studio 3.5.2。
  • 我在Android Studio 3.6.1上遇到过,请稍后看我的帖子

标签: android signed-apk


【解决方案1】:

Android 7.0 (24) 中引入了签名 v2,因此当您的minSdkVersion 为 24 或更高时,请同时启用 v1 和 v2,如下所示:

signingConfigs {
        debug {
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }

签名的 apk 不会有 v1,它只是用 v2 签名的。这可以通过apksigner 进行验证,如下所示:

java -jar apksigner.jar verify -v your-signed-apkfile.apk

否则keytool无法识别签名v2,所以提示Not a signed jar file。而只有签名v2的签名apk也是可用的apk,它只能安装在Android 7.0或更高版本上。

如果要同时使用 v1 和 v2 签名,则应将 minSdkVersion 修改为 23 或更低。

希望对你有帮助。

【讨论】:

  • 确实在撰写问题时我有 minsdk 24 并且我试图理解为什么我的启用两个签名的 gradle 设置停止工作(对于我的两个项目之一)。它在我注意到这个问题之前就起作用了,所以我禁用了签署 v1 作为解决方法。现在它再次与两个签名一起工作。
猜你喜欢
  • 2019-07-04
  • 2019-06-21
  • 2017-05-14
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多