如何使用Gradle生成已签名和未签名的APK文件?

13

我需要使用Gradle命令行生成未签名和已签名的发布APK (gradlew assembleRelease是我现在使用的命令)

这些apk必须对齐。 我查看了这个链接:使用Gradle构建无签名APK,但似乎这是一种旧的方法,现在不再适用于最新的Android和Gradle编译版本。并且我需要同时生成两个apk,而不仅仅是发布模式或未签名模式。


抱歉我的初始回答有误,我误读了问题。 - Ed Holloway-George
运行 gradle clean assemble (这将执行 assembleDebugassembleRelease)。确保 debug buildType 没有 singingConfig,但 release buildType 有一个。 - Simon Marquis
那么,你解决了你的问题吗? - Stas Parshin
4个回答

9

我知道这个答案很老,但它仍然可以帮助某人不添加额外的功能来达成你的目标(即使在我的情况下,由于项目中有许多依赖项,这可能是具有挑战性的)。

android {
  signingConfigs {
    release { ... }
  }

  productFlavors {
    signed { 
      signingConfig (checkUnsigned() ? null : signingConfigs.release)

    }
}

def checkUnsigned ()  {
    return project.hasProperty("unsigned")
}

为了使用它,只需使用


gradle assembleRelease

或者
gradle assembleRelease '-Punsigned'

用于创建未签名的(CI引用需要加引号,否则可能不需要)

该方案的缺点只有在您想要在一行中组合几种风味时才会出现

gradle assembleRelease assembleDebug assembleRelease '-Punsigned'

assembleRelease检查命令行中的所有属性,因此首先将调用带有参数“-Punsigned”的assembleRelease。我通过使用两个命令解决了这个CI问题 - 一个用于签名版本,另一个用于未签名版本。

gradle assembleRelease assembleOtherFlavour '-Punsigned'
gradle assembleDebug assembleRelease assembleOtherFlavour

永远帮助像我这样的人是不会太晚的:D 谢谢! - equiman
这比添加一个新的构建变体要轻量级。谢谢! - Erik B

7

我认为buildTypesproductFlavors更适合。
你可以通过替换签名配置来扩展发布版本。

buildTypes {
    release {
        ....
        signingConfig signingConfigs.release
    }

    releaseUnsigned.initWith(buildTypes.release)
    releaseUnsigned {
        signingConfig null
    }
}

然后开始构建两个APK文件:
./gradlew assemble

或者,如果您只需要发布版本

./gradlew assembleRelease assembleReleaseUnsigned
or ./gradlew assR assRU

如果您确实想要仅使用assembleRelease任务, 您可以创建以下依赖关系

assembleRelease.dependsOn assembleReleaseUnsigned

只需使用以下内容即可构建

./gradlew assembleRelease

你在哪里添加assembleRelease.dependsOn assembleReleaseUnsigned这行代码? - Khaled Osman
在 app/build.gradle 中的任何位置,dependencies {} 或其他自定义任务之后添加 @KhaledOsman。 - Stas Parshin

4
您链接到的答案是正确的 - 如果您选择的变体(即构建类型+风格组合)没有使用“签名就绪”签名配置,则Gradle将创建未签名的APK。
因此,您可以定义以下设置:
android {
  signingConfigs {
    release { ... }
  }

  productFlavors {
    signed { 
      signingConfig signingConfigs.release // defined above
    }

    unsigned {} // use the default options
  }
}

然后运行./gradlew :app:assembleRelease,将创建您的APK文件:
app/build/outputs/apk
├── app-signed-release.apk
├── app-signed-release-unaligned.apk
└── app-unsigned-release-unsigned.apk

3
我认为签名配置应该在 buildTypes 中进行,而 flavors 则用于应用程序逻辑。 - Stas Parshin

2

对我来说,使用定义新的buildType不起作用。但是在debug/release模式下可以正常工作:

 buildTypes {
         release {
                signingConfig null
            }
         debug {
                signingConfig null
            }
    }

这将创建未签名的APK文件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接