问题 如何使用gradle生成签名和未签名的APK?


我需要使用gradle命令行生成unsigned和signed release apks(gradlew assembleRelease 是我现在使用的命令)

apks必须对齐。我查了一下: 使用Gradle构建未签名的APK 但它似乎是一种实现这一目标的旧方法,现在它不起作用,并且在最新版本的android和gradle编译中发生了一些变化。而且我还需要同时生成两个apks,不仅仅是发布模式或无符号模式


11728
2017-08-25 08:57


起源

对我最初的回答表示歉意,我误解了这个问题 - Ed George
跑 gradle clean assemble (这将执行 assembleDebug 和 assembleRelease。确保debug buildType没有singingConfig,但发布版buildType有一个。 - Simon Marquis
那么,你解决了问题吗? - Stas Parshin


答案:


我认为 buildTypes 是比一个更合适的地方 productFlavors
您可以使用替换signingConfig扩展发布版本。

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

7
2017-08-25 11:00





您链接的答案是正确的 - 如果您选择的变体(即构建类型+风味组合)未使用“签名就绪”签名配置,则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

4
2017-08-25 10:50



我认为signingConfig应该在buildTypes中进行,而味道则用于app逻辑 - Stas Parshin
好的,同意。 - Michał Bendowski


我知道这是一个非常古老的答案,但它仍然可以帮助某人在不增加额外味道的情况下实现目标(即使在我的情况下,由于项目中的许多依赖项,它可能具有挑战性)。

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检查命令行中的所有属性,所以首先使用param'-Punsigned'调用allocateRelease 我使用2个命令解决了这个CI问题 - 一个用于签名,另一个用于无符号版本

gradle assembleRelease assembleOtherFlavour '-Punsigned'
gradle assembleDebug assembleRelease assembleOtherFlavour

4
2017-12-12 08:44



从来没有像我这样帮助其他人:D谢谢! - equiman
这比添加新的构建变体更轻。谢谢! - Erik B