使用新的签名功能自动 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
选择签名版本?我在 jarsigner
和 gradlew
帮助中没有找到相关选项。
这是我的 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;
}
}
如您所见,我添加了 v1SigningEnabled
和 v2SigningEnabled
字段。密钥库信息取自 gradle.properties
文件,如 this 主题中所述,我只是调整了我的脚本以更改文件内容,其中包含我需要更改密钥库的内容。现在 APK 文件上传没有任何错误。
我有一个 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
选择签名版本?我在 jarsigner
和 gradlew
帮助中没有找到相关选项。
这是我的 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;
}
}
如您所见,我添加了 v1SigningEnabled
和 v2SigningEnabled
字段。密钥库信息取自 gradle.properties
文件,如 this 主题中所述,我只是调整了我的脚本以更改文件内容,其中包含我需要更改密钥库的内容。现在 APK 文件上传没有任何错误。