我有一个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();
答案 0 :(得分:1)
我最终只使用Gradle工具来构建和签署发布APK(从管道中排除分离的Java jarsigner流程)。
以下是app-level 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文件时没有任何错误。
答案 1 :(得分:0)
在https://source.android.com/security/apksigning/,您可以阅读有关v1和v2签名方案的信息。使用jarsigner,您可以创建v1签名方案。据我所知,jarsigner无法进行v2签名。
我认为v1签名不是你问题的原因,因为它说的是缺少优化,而不是缺少签名。我认为这只是一个巧合。
实际上我根本不知道为什么你有一个C#脚本,你可以使用你的Gradle构建文件中的jarsigner,而不需要使用任何外部包装脚本。
我建议您查看并修复构建脚本,以进行正确的签名和优化,而不是使用一些自制的C#脚本。也许这可能有所帮助。