使用新的签名功能自动 Gradle 构建和签名

Automating Gradle build and signing with new signing feature

我有一个 Android Studio 项目和一个创建该项目发布版本的 C# 脚本:首先我使用 CMD.exe 创建一个未签名的发布 APK,然后我使用 jarsigner 签署应用程序(这是构建 apk 所必需的,甚至无需打开 Android Studio 并能够更改密钥存储)。

我最近更新了 Android Studio,现在当我直接从 IDE 生成签名 APK 时,有一个新选项:签名版本 - V1(Jar 签名)和 V2(完整 APK 签名) ).此次更新后,如果我使用 C# 脚本构建 APK,则 Google Play 不接受 APK 文件:它表示我的 APK 未优化,我应该使用优化工具并重新上传。我相信这两个变化是相关的。

我的问题是如何使用 jarsigner 选择签名版本?我在 jarsignergradlew 帮助中没有找到相关选项。

这是我的 C# 简化代码:

//assemble an unsigned APK
Process cmd = new Process()
cmd.StartInfo.FileName = "CMD.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();        
cmd.StandardInput.WriteLine(@"cd /d """ + Application.StartupPath + @"""");
cmd.StandardInput.WriteLine(@"gradlew assembleRelease");
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();

//sign the APK
string args = @"-keystore """ + keyPath + @""" -storepass " + alias + 
@" """ + Application.StartupPath + 
@"\app\build\outputs\apk\app-release-unsigned.apk"" " + aliasPas;
Process java = new Process();
java.StartInfo.FileName = Path.Combine(GetJavaInstallationPath(), "bin\jarsigner.exe");
java.StartInfo.Arguments = args;
java.StartInfo.UseShellExecute = false;
java.Start();
java.WaitForExit();

https://source.android.com/security/apksigning/ 您可以阅读有关 v1 和 v2 签名方案的信息。使用 jarsigner,您可以创建 v1 签名方案。据我所知,jarsigner 无法进行 v2 签名。

我不认为 v1 签名是您遇到问题的原因,因为它说的是缺少优化,而不是缺少签名。我觉得这只是巧合。

实际上我完全不知道你为什么要有 C# 脚本,你可以使用 Gradle 构建文件中的 jarsigner 就好了,不需要使用任何外部包装脚本。

我建议您查看并修复构建脚本以进行正确的签名和优化,而不是使用一些自制的 C# 脚本。也许这已经有所帮助。

我最终只使用 Gradle 工具来构建和签署发布 APK(从管道中排除了分离的 Java jarsigner 进程)。

这是应用级 build.gradle 文件中的新签名配置:

signingConfigs {
    release {
        storeFile file(RELEASE_STORE_FILE)
        storePassword RELEASE_KEY
        keyAlias RELEASE_KEY_ALIAS
        keyPassword RELEASE_KEY_PASSWORD
        v1SigningEnabled true;
        v2SigningEnabled true;
    }
}

如您所见,我添加了 v1SigningEnabledv2SigningEnabled 字段。密钥库信息取自 gradle.properties 文件,如 this 主题中所述,我只是调整了我的脚本以更改文件内容,其中包含我需要更改密钥库的内容。现在 APK 文件上传没有任何错误。