Android Studio:如何使用 Gradle 生成签名的 APK?

Posted

技术标签:

【中文标题】Android Studio:如何使用 Gradle 生成签名的 APK?【英文标题】:Android Studio: how to generate signed APK using Gradle? 【发布时间】:2014-01-22 04:10:33 【问题描述】:

我在 Google 和 SO 上搜索过,但找不到我的答案。

这是我第一次使用 Gradle 系统,现在我正在生成一个签名的 APK 以上传到 Google Play(项目是从 eclipse 导入的)。

现在,我已经阅读了 here 部分,您应该将 signingConfigs 添加到您的 build.gradle

我已经添加了这些行,现在我看到您需要运行 ./gradlew assembleRelease 但在我的 CMD 中运行它会返回

'gradle' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

我也尝试右键单击 build.gradle 并运行它,说它是成功的,但是一旦我查看 build/apk 文件夹,只有一个名为 app-debug-unaligned.apk 的文件。

那么,如何使用 Gradle 系统生成签名的 APK?

【问题讨论】:

见***.com/questions/20876069/… @ScottBarta 部分成功了,一旦我切换到发布模式并运行 gradle,我仍然遇到错误,但使用 he build > generate signed apk via the menu 它最终成功了!谢谢我在提供的链接上为你投票。 使用 gradle 文件中的 v1(jar 签名)或 v2(完整 apk 签名)版本签名?解决方案:***.com/questions/57943259/… 这能回答你的问题吗? How to build a 'release' APK in android Studio? 【参考方案1】:

根据buildType,可以通过三种方式生成构建。 (在您的情况下,它已发布,但可以命名为任何您想要的名称。)

    进入Android Studio右侧面板的Gradle Task,在Module Tasks下搜索assembleReleaseassemble(#your_defined_buildtype)

    转到左侧面板中的构建变体并从下拉列表中选择构建

    在文件浏览器中进入项目根目录并打开 cmd/terminal 并运行:

    Linux:./gradlew assembleRelease or assemble(#your_defined_buildtype)

    Windows:gradlew assembleRelease or assemble(#your_defined_buildtype)

如果你想做一个发布版本(仅),你可以使用 Build > Generate Signed apk。对于其他构建类型,只有上述三个选项可用。

您可以在 module/build 目录中找到生成的 APK,其中包含构建类型名称。

【讨论】:

如果您的 build.gradle 中有构建配置,这只会构建一个签名的 apk。如果您将其存储在源代码管理工具中或与其他人共享,您应该考虑将签名密钥的凭据与源代码分开。 Build > Generate Signed apk ...就这么简单【参考方案2】:

可以获取任何现有的 Android Studio gradle 项目并从命令行构建/签名,而无需编辑任何文件。这使得将您的项目存储在版本控制中同时保持您的密钥和密码分开非常好:

./gradlew assembleRelease -Pandroid.injected.signing.store.file=$KEYFILE -Pandroid.injected.signing.store.password=$STORE_PASSWORD -Pandroid.injected.signing.key.alias=$KEY_ALIAS -Pandroid.injected.signing.key.password=$KEY_PASSWORD

【讨论】:

由于我们需要将源代码传递给同伴,这是对我们的密钥库内容保密的最佳方式。谢谢。 无论如何要知道这些 android.injected.signing.* 属性的存在吗? 我从Android Studio团队的Xav那里得到了这个信息,不知道还有没有其他类似的变量。 我收到 java.lang.RuntimeException: com.android.ide.common.signing.KeytoolException: 无法从存储“C:\Users\somedirectory\Desktop\someKey.jks”读取密钥 XXXXXX : 在密钥库 C:\Users\somedirectory\Desktop\someKey.jks 中找不到别名为“XXXXXX”的密钥。这是为什么呢?【参考方案3】:

您可以使用此代码

android 
   ...
    signingConfigs 
        release 
            storeFile file("../your_key_store_file.jks")
            storePassword "some_password"
            keyAlias "alias_name"
            keyPassword "key_password"
        
    

    buildTypes 

        release 
            signingConfig signingConfigs.release
        
    
   ...

然后从你的终端运行

./gradlew assembleRelease

您将在以下位置获得 apk

your-android-app/build/outputs/apk/your-android-app-release.apk

【讨论】:

@ozcanovunc 请再次检查您的密钥库路径可能是您的路径定义错误。 执行此操作时,您的build.gradle 可能会被检查到版本控制中,您的密码也是如此!当安全性在您的项目中很重要时,请考虑采用另一条路线。 gradle assembleRelease 不工作。使用而不是 gradlew assembleRelease 出于安全原因,可以从单独的文件中读取签名凭据【参考方案4】:

我认为这可以帮助您https://www.timroes.de/2013/09/22/handling-signing-configs-with-gradle/ 然后只需从Build Variants 中选择Release

【讨论】:

【参考方案5】:

这适用于 Kotlin DSL (build.gradle.kts)。 您可以在项目根目录的 local.properties 文件中定义属性,也可以将它们定义为环境变量(这对于 GitHub Action 等 CI 特别有用)。

// See https://***.com/q/60474010
fun getLocalProperty(key: String) = gradleLocalProperties(rootDir).getProperty(key)

fun String?.toFile() = file(this!!)

// Could also use System.getenv("VARIABLE_NAME") to get each variable individually
val environment: Map<String, String> = System.getenv()

android 
    signingConfigs 
        create("MyAppSigningConfig") 
            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 
        getByName("release") 
            signingConfig = signingConfigs["MyAppSigningConfig"]
            // ...
        
    

myProject/local.properties 文件:

signing.keyAlias=foo
signing.keyPassword=bar
# also called keystore
signing.storePassword=abcdefgh
signing.storeFile=C\:\\my-files\\my-keystore.jks

不要将您的 local.properties 文件添加到您的版本控制系统(如 Git),因为它会将您的秘密信息(如密码等)公开(如果它是公共存储库)。

使用this answer 提到的 3 种方式之一生成您的 APK。

【讨论】:

【参考方案6】:

如果您居住在某些国家/地区,请务必使用 ***。

第一步:在命令行中运行这个命令:

keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

它会询问您一些信息,例如密码、姓名……然后输入它们。

第二步:在你的android文件夹中创建一个文件名key.properties。 将这些行写入创建的文件中

storePassword=<password from previous step>
keyPassword=<password from previous step>
keyAlias=key
storeFile=<location of the key store file, such as ~/key.jks>

将 key.properties 文件保密,始终保留 key.properties 文件的备份,切勿公开发布。

第 3 步:在应用级 Gradle 中替换以下行

def keystoreProperties = new Properties()
    def keystorePropertiesFile = rootProject.file('key.properties')
    if (keystorePropertiesFile.exists()) 
        keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    
android 
signingConfigs 
  release 
    keyAlias keystoreProperties['keyAlias']
    keyPassword keystoreProperties['keyPassword']
    storeFile file(keystoreProperties['storeFile'])
    storePassword keystoreProperties['storePassword']
  

buildTypes 
  release 
    signingConfig signingConfigs.release
  


第四步:

keytool -list -v -keystore ~/key.jks -alias key -storepass <password> -keypass <password>

第五步: 我建议使用 android studio 构建 APK。 Build &gt; Generate Signed Bundle/APK...

【讨论】:

【参考方案7】:

构建菜单> 生成签名的apk

【讨论】:

如果你运行它,它会告诉你这不是这样做的方法。此外,如果我上传该 .apk 文件,它会引发一个错误,指出错误检测或某些东西已开启。 它说调试已打开...在android studio中,左侧应该有一个标签显示“构建变体”...单击它并将所有内容从“调试”切换到'release'...之后,再次生成签名的apk... 这不再有效!例如,它构建的 APK 将 BuildConfig.DEBUG 设置为 true。这给我带来了无穷无尽的麻烦,你现在必须使用 gradlew assembleRelease 方法。 @BenClayton 你是绝对正确的!我因此浪费了几个小时! Android Studio 中另一个非常烦人的“错误” - 没有尽头的麻烦...... 我想知道为什么这个简单的步骤不能成为生成签名 apk 的最合适方式,因为它清楚地提到了。这一步生成了应用程序,对我来说非常完美,没有任何麻烦。但是关于 SO 的许多其他答案让我感到困惑,认为我所做的可能不正确或什么。

以上是关于Android Studio:如何使用 Gradle 生成签名的 APK?的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 中 gradle 版本问题

Android Studio无法启动 Gradle ,无法启动守护程序

Android Studio中一套代码多渠道打包

android studio节省C盘空间的配置方法

Android Studio 代码混淆(你真的会混淆吗)

Android Studio Electric Eel提示Gradle插件报错问题的解决方法