如何使用 "APK Signature Scheme v3 and v4" 签署我的应用程序?

How can I sign my app with "APK Signature Scheme v3 and v4"?

在文档中,有关于签名 v3 和 v4 的解释: https://source.android.com/security/apksigning/v3

但是,当我尝试在 android studio 中使用 Build>Generate signed apk/bundle 对我的应用程序进行签名时,我可以只选中 v1(jar 签名)和 v2(完整的 apk 签名)和v3 签名没有选项。

如何使用签名方案 v3 和 v4 对我的应用程序进行签名?

谢谢。

使用命令行手动创建签名版本。

请找到创建 v3 和 v4 方案签名版本的步骤,

  1. Select build-tools.0.0 或更新版本.

    注意:您可以在 SDK 位置找到构建工具文件夹。

    \Users\AppData\Local\Android\Sdk\build-tools.0.0

  2. Zipalign - 对齐未签名的 APK

zipalign -v -p 4 app-production-debug.apk my-app-unsigned-aligned.apk

注:

app-production-debug.apk - 一个。您从 Android studio 通过构建-> 构建捆绑包/APK(s)-> 构建 APK(s)

创建的 Apk 文件

my-app-unsigned-aligned.apk - 该文件将在同一目录中创建(您也可以定义路径)。

  1. Apksigner - 使用您的私钥签署您的 APK

apksigner sign --ks release-keystore.jks --out my-app-release.apk my-app-unsigned-aligned.apk

注意: 一种。发布-keystore.jks - 我们在 build.gradle 文件

中配置的密钥库文件
   android {
                signingConfigs {
                        production {
                            storeFile file('release-keystore.jks')
                            storePassword 'XXXX'
                            keyAlias = 'AAAAA'
                            keyPassword 'XXXX'
                        }
                }
            buildTypes {
                        release {
                            ...............
                            signingConfig signingConfigs.production 
               
                        }
            }
        }

b。 my-app-release.apk - 已签名的发布版本将在同一目录中生成(您也可以定义路径)。

  1. 验证:

apksigner verify --verbose my-app-release.apk

更新以验证 v4:

apksigner verify -v -v4-signature-file my-app-release.apk.idsig my-app-release.apk

  1. 发布apk中可以看到验证过的方案

    验证

    使用 v1 方案(JAR 签名)验证:正确

    已使用 v2 方案(APK 签名方案 v2)验证:true

    已使用 v3 方案(APK 签名方案 v3)验证:true

    已使用 v4 方案(APK 签名方案 v4)验证:true

截至今天,Android Studio 支持 v3 和 v 4 Android Gradle 插件 4.2 要在您的构建中启用其中一种或两种格式,请将以下属性添加到您的模块级别 build.gradle 或 build.gradle.kts 文件:

android {
   ...
   signingConfigs {
      config {
          ...
          enableV3Signing = true
          enableV4Signing = true
      }
   }
}