【问题标题】:Automating Gradle build and signing with new signing feature使用新的签名功能自动化 Gradle 构建和签名
【发布时间】:2017-11-21 11:04:46
【问题描述】:

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

我最近更新了 Android Studio,现在当我直接从 IDE 生成签名 APK 时,有一个新选项:签名版本 - V1(Jar 签名)和 V2(完整 APK 签名)。在此更新之后,如果我使用我的 C# 脚本构建 APK,则 APK 文件不被 Google Play 接受:它说我的 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();

【问题讨论】:

    标签: c# android gradle automation signing


    【解决方案1】:

    我最终只使用 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文件上传没有任何错误。

    【讨论】:

      【解决方案2】:

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

      我不认为 v1 签名是您的问题的原因,因为它谈到缺少优化,而不是缺少签名。我认为这只是一个巧合。

      其实我根本不知道你为什么有一个 C# 脚本,你可以使用 Gradle 构建文件中的 jarsigner 就可以了,而无需使用任何外部包装脚本。

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

      【讨论】:

      • 除了Android Studio之外,还需要使用外部脚本来提供一个单独的GUI应用程序,并且在构建之前还需要做一些其他的准备工作(不能在Gradle中完成)。但我刚刚找到了signingconfig v1SigningEnabledv2SigningEnabled 的新选项,我可以将它们用于可以从我的脚本中调用的Gradle 任务。
      • 我看不到您的 C# 代码在哪里打开 GUI,但如果是用于选择密钥库,您也可以从 Gradle 构建脚本轻松打开 GUI。 Gradle 构建脚本是 Groovy 脚本,因此您可以轻松使用 Groovys SwingBuilder 轻松构建简单的 GUI 以获得一些用户输入。不需要 Android Studio,只需简单的 Gradle。我想说的是,您可以从 C# 代码中执行的所有操作,您也可以在 Gradle 脚本中轻松完成。
      • 再说一次,我不认为缺少 v2 签名是 Play 拒绝您的 apk 的原因,因为只有 v1 签名是完全可以的。它不如拥有 v2 签名安全,但它应该可以正常工作。
      • 我从来没有说缺少 v2 是问题所在,我认为问题在于使用 jarsigner。我解决了这个问题,现在将添加一个答案来解释我的解决方案。
      • 您也可以使用其他信息更新我的答案
      猜你喜欢
      • 2013-07-02
      • 2018-08-22
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多