我想有我的Gradle构建创建一个发布签名apk文件使用Gradle。

我不确定代码是否正确,或者我在做gradle构建时是否缺少一个参数?

这是build.gradle/build.gradle中的一些代码。节文件:

android {
    ...
    signingConfigs {
        release {
            storeFile(file("release.keystore"))
            storePassword("******")
            keyAlias("******")
            keyPassword("******")
        }
    }
}

Gradle构建成功完成,在我的build/apk文件夹中,我只看到…-release-unsigned.apk和…-debug-unaligned.apk文件。

对如何解决这个问题有什么建议吗?


当前回答

这是Kotlin构建脚本(build.gradle.kts)的另一个答案,与Willi Mentzel的答案不同。

它尝试从本地读取。属性文件,返回到OS环境变量。它在像GitHub Actions这样的ci中特别有用(你可以在存储库设置中创建环境秘密)。

注意,我使用的是Kotlin 1.6.10和Gradle 7.4.2和Android Gradle Plugin (AGP) 7.0.4。

import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
// ...

val environment = System.getenv()
fun getLocalProperty(key: String) = gradleLocalProperties(rootDir).getProperty(key)
fun String.toFile() = File(this)

android {
    signingConfigs {
        create("MySigningConfig") {
            keyAlias = getLocalProperty("signing.keyAlias") ?: environment["SIGNING_KEY_ALIAS"] ?: error("Error!")
            storeFile = (getLocalProperty("signing.storeFile") ?: environment["SIGNING_STORE_FILE"] ?: error("Error!")).toFile()
            keyPassword = getLocalProperty("signing.keyPassword") ?: environment["SIGNING_KEY_PASSWORD"] ?: error("Error!")
            storePassword = getLocalProperty("signing.storePassword") ?: environment["SIGNING_STORE_PASSWORD"] ?: error("Error!")
            enableV1Signing = true
            enableV2Signing = true
        }
    }

    buildTypes {
        release {
            signingConfig = signingConfigs["MySigningConfig"]
            isMinifyEnabled = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
}

如前所述,你可以有一个本地。属性文件在你的项目的根属性值:

signing.keyAlias=My key
signing.keyPassword=zyxwvuts
signing.storePassword=abcdefgh
signing.storeFile=C\:\\Users\\Mahozad\\keystore.jks

... 或者你可以在你的操作系统上设置/创建环境变量;例如,创建一个名为SIGNING_KEY_ALIAS的环境变量:

Windows命令提示符:setx SIGNING_KEY_ALIAS“我的密钥” Linux终端:export SIGNING_KEY_ALIAS="My key"

注意:正如其他答案所提到的,不要添加您的本地。属性文件到你的版本控制系统(如Git),因为它将你的秘密信息,如密码等暴露给公众(如果它是一个公共存储库)。

用上面提到的3种方法中的任意一种生成APK。

其他回答

你也可以使用gradle的-P命令行选项来帮助签名。在你的构建中。gradle,像这样添加singingConfigs:

signingConfigs {
   release {
       storeFile file("path/to/your/keystore")
       storePassword RELEASE_STORE_PASSWORD
       keyAlias "your.key.alias"
       keyPassword RELEASE_KEY_PASSWORD
   }
}

然后像这样调用gradle build:

gradle -PRELEASE_KEYSTORE_PASSWORD=******* -PRELEASE_KEY_PASSWORD=****** build

如果您愿意,可以使用-P来设置storeFile和keyAlias。

这基本上是Destil的解决方案,但带有命令行选项。

有关gradle属性的更多细节,请查看gradle用户指南。

现在是2019年,我需要用V1 (jar签名)或V2(完整APK签名)签署APK。我谷歌了“生成签名apk gradle”,它把我带到了这里。我把原来的解加到这里。

signingConfigs {
    release {
        ...
        v1SigningEnabled true
        v2SigningEnabled true
    }
}

我最初的问题:如何从构建开始使用V1 (Jar签名)或V2(完整的APK签名)。gradle文件

这是对user672009的回复,也是对sdqali的帖子的补充(他的代码会在IDE的“Run”按钮构建调试版本时崩溃):

您可以使用以下代码:

final Console console = System.console();
if (console != null) {

    // Building from console 
    signingConfigs {
        release {
            storeFile file(console.readLine("Enter keystore path: "))
            storePassword console.readLine("Enter keystore password: ")
            keyAlias console.readLine("Enter alias key: ")
            keyPassword console.readLine("Enter key password: ")
        }
    }

} else {

    // Building from IDE's "Run" button
    signingConfigs {
        release {

        }
    }

}

为了补充其他答案,你也可以放置gradle。属性文件与build一起放在您自己的模块文件夹中。Gradle,以防您的密钥库特定于一个项目。

对于Kotlin脚本(build.gradle.kts)

您不应该将签名凭据直接放在build.gradle.kts文件中。相反,凭证应该来自不受版本控制的文件。

放置一个文件签名。找到特定于模块的build.gradle.kts的属性。别忘了把它添加到你的。gitignore文件!

signing.properties

storeFilePath=/home/willi/example.keystore
storePassword=secret
keyPassword=secret
keyAlias=myReleaseSigningKey

build.gradle.kts

android {
    // ...
    signingConfigs {
        create("release") {
            val properties = Properties().apply {
                load(File("signing.properties").reader())
            }
            storeFile = File(properties.getProperty("storeFilePath"))
            storePassword = properties.getProperty("storePassword")
            keyPassword = properties.getProperty("keyPassword")
            keyAlias = "release"
        }
    }

    buildTypes {
        getByName("release") {
            signingConfig = signingConfigs.getByName("release")
            // ...
        }
    }
}