1

在我的build.gradle文件中,我有以下内容:

    applicationVariants.all { variant ->
      def oldFile;
      if (variant.zipAlign) {
        oldFile = variant.outputFile;
      } else {
        oldFile = variant.packageApplication.outputFile;
      }

      def newFile;
      def newFileReplacement = "";

      if (getVersionName().indexOf(gitSha()) != -1) {
          newFileReplacement = newFileReplacement + "-" + getVersionName() + ".apk";
      } else {
          newFileReplacement = newFileReplacement + "-" + getVersionName() + "-" + gitSha() + ".apk"
      }

      newFile = oldFile.name.replace(".apk", newFileReplacement);

      if (variant.zipAlign) {
        variant.zipAlign.outputFile = new File(oldFile.parent, newFile);
      } else {
        variant.packageApplication.outputFile = new File(oldFile.parent, newFile);
      }
    }

当我运行以下命令:./gradlew clean assembleRelease时,它会为我创建以下 .apk 文件:

MyApp-release-1.2.3-e1ad453.apk
MyApp-release-unaligned.apk

MyApp-release-1.2.3-e1ad453.apk是zipaligned,但另一个不是)

希望它创建的是以下文件:

MyApp-release-1.2.3-e1ad453-unaligned.apk
MyApp-release-1.2.3-e1ad453.apk

whereMyApp-release-1.2.3-e1ad453-unaligned.apk不是 zip 对齐的,并且MyApp-release-1.2.3-e1ad453.apk是 zip 对齐的,因为这似乎是 gradle 默认运行的方式(即它添加到未对齐的文件的名称,而不是添加到文件的名称)。

基本上,似乎正在发生的事情是重命名功能在实际创建文件之前运行,并且只是指定了我应该想要的输出文件。MyApp-release-unsigned.apk这很好,但是否可以在 zipAlign运行之前指定我想要的中间文件?

4

1 回答 1

3

我能够使用以下方法让 gradle 重命名中间文件variant.packageApplication.outputFile

    // This next part renames the .apk file to include the version number
    // as well as the git sha for the commit from which it was built.
    applicationVariants.all { variant ->
      def oldFile;
      if (variant.zipAlign) {
        oldFile = variant.outputFile;
      } else {
        oldFile = variant.packageApplication.outputFile;
      }

      def newFile;
      def newFileReplacement = "";

      if (getVersionName().indexOf(gitSha()) != -1) {
          newFileReplacement = newFileReplacement + "-" + getVersionName() + ".apk";
      } else {
          newFileReplacement = newFileReplacement + "-" + getVersionName() + "-" + gitSha() + ".apk"
      }

      newFile = oldFile.name.replace(".apk", newFileReplacement);

      if (variant.zipAlign) {
        // Set the name of the final output file
        variant.zipAlign.outputFile = new File(oldFile.parent, newFile);

        // Set the name of the intermediate file (input to zipAlign) to contain version
        // information, too
        def oldIntermediateFile = variant.packageApplication.outputFile
        def newIntermediateFile = variant.packageApplication.outputFile.name.replace(".apk", newFileReplacement)
        variant.packageApplication.outputFile = new File(oldIntermediateFile.parent, newIntermediateFile)
      } else {
        // Set the name of the final output file (no intermediate file)
        variant.packageApplication.outputFile = new File(oldFile.parent, newFile);
      }
    }

这里发生的事情是,如果zipAlign被禁用,那么variant.packageApplication.outputFile将是创建的结果文件。如果启用了zipAlignvariant.packageApplication.outputFile则将是创建的中间(未对齐)文件,并且variant.zipAlign.outputFile将是创建的最终(对齐)文件。因此,我让 zipAlign 通过更改 和 的名称来使用不同命名文件variant.packageApplication.outputFile variant.zipAlign.outputFile

给后代的最后一点说明

如果你犯了同样的错误,我最初尝试过:

    variant.zipAlign.outputFile = new File(oldFile.parent, newFile);
    variant.packageApplication.outputFile = new File(oldFile.parent, newFile);

但是,这不起作用,因为未对齐的文件名和对齐的文件名具有相同的名称,并且 zipAlign 将拒绝将文件对齐到自身(即,它必须具有与输入文件名不同的输出文件名)。

于 2014-11-19T19:38:35.477 回答