React Native 生成​​签名的 APK “未设置用于签名配置发布的 KeyStore 文件”

Posted

技术标签:

【中文标题】React Native 生成​​签名的 APK “未设置用于签名配置发布的 KeyStore 文件”【英文标题】:React Native Generating Signed APK "KeyStore file not set for signing config release" 【发布时间】:2017-11-06 00:12:22 【问题描述】:

我正在尝试生成签名的 APK。我的 password.keystore 文件位于 \Dictionary\android\app 中,当我在 cmd 上运行 gradlew assembleRelease 时,出现错误:

任务“:app:validateSigningRelease”执行失败。

没有为签署配置发布设置密钥库文件

我应该将 password.keystore 文件存储在哪里?因为当我评论 if (project.hasProperty("password.keystore") 时,它似乎可以工作,但会出现以下错误:

无法处理传入事件“ProgressComplete”(ProgressCompleteEvent)

我应该如何写我的 if 条件或者我应该在哪里存储 password.keystore 文件?

源码如下:

signingConfigs 
  release 
    if (project.hasProperty("password.keystore")) 
      storeFile file("password.keystore")
      storePassword "password"
      keyAlias "username"
      keyPassword "password"
    
  

【问题讨论】:

您似乎正在尝试生成签名的 APK .. 对吧? @Codesingh 是的,似乎project.hasProperty("password.keystore") 返回 false 所以当我排除 if 语句时,代码运行。但我显然在 \Dictionary\android\app 中有一个名为 password.keystore 的文件。 一旦我在这部分应用程序开发中也是 struct 然后我开始从 android studio 窗口顶部的构建选项生成签名 apk。 【参考方案1】:

keystore 文件必须位于 android/app 文件夹中。

消息'Keystore file not set for signing config release'表示android/app/build.gradle文件中没有signingConfig。

buildTypes 
    release 
        // other settings
        signingConfig signingConfigs.release
    

对于测试,您可以在 android/app/build.gradle 中硬编码设置,而不是在 gradle.properties 中进行设置。这为我解决了 'Keystore 被篡改,或密码不正确'

的问题
  signingConfigs 
    release 
        //if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) 
            storeFile file("key.keystore")
            storePassword "****"
            keyAlias "myKey"
            keyPassword "****"
       // 
    

【讨论】:

推荐这个硬编码的解决方案,特别是如果你用完了时间:)【参考方案2】:

就我而言,我的项目使用的是 RN 版本 0.59,而我使用的是 0.60 RC 文档。所以里面app/build.gradle

如果是 0.59 版:

if (project.hasProperty('MYAPP_RELEASE_STORE_FILE'))

如果是 0.60 版:

if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE'))

区别在于RELEASE 变为UPLOAD

【讨论】:

你救了我的命,我已经将 RN 从 0.57 升级到 0.60 并蹩脚地复制了旧的 gradle.properties,然后我注意到你提到的更改,它解决了我的问题。谢谢你【参考方案3】:

我找到了解决办法!

如果您像我一样关注了React Native's official instructions,请将关注添加到您的gradle.properties

MYAPP_RELEASE_STORE_FILE=<your-app>.keystore
MYAPP_RELEASE_KEY_ALIAS=<keystore-alias>
MYAPP_RELEASE_STORE_PASSWORD=<password>
MYAPP_RELEASE_KEY_PASSWORD=<password>

然后是我完全误解的部分。

app/build.gradle-文件中,您应该替换字符串。如果你的gradle.properties 和我粘贴的一样,你的app/build.gradle 应该是这样的:

signingConfigs 
    release 
        if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) 
            storeFile file(MYAPP_RELEASE_STORE_FILE)
            storePassword MYAPP_RELEASE_STORE_PASSWORD
            keyAlias MYAPP_RELEASE_KEY_ALIAS
            keyPassword MYAPP_RELEASE_KEY_PASSWORD
        
    

我最初所做的是替换字符串(即 'MYAPP_RELEASE_STORE_FILE' 为我的密钥库文件的路径),但您根本不应该替换任何变量。我猜你可以看到我们在gradle.properties 中创建的字符串和我们在app/build.gradle 中创建的发布配置之间的联系。

记得把你的.keystore文件也放在android/app里面。

【讨论】:

【参考方案4】:

project.hasProperty 将在您的 gradle.properties 文件中查找名为 password.keystore 的变量。

进入~/.gradle,查看是否有gradle.properties 文件,如果有,请确保变量password.keystore 存在,它应该指向您的密钥库文件:password.keystore=password.keystore

虽然您应该将其命名为不同的名称,例如 MYAPP_RELEASE_STORE_FILE=password.keystore。然后,当您运行 ./gradlew assembleRelease 时,您的项目将拥有它正在寻找的属性,以下将解析为 true 并允许 gradlew 设置所有 signingConfigs.release 属性:

if (project.hasProperty(MYAPP_RELEASE_STORE_FILE)) 
    storeFile file(...)
    storePassword your_password_property
    ...

【讨论】:

【参考方案5】:

我遇到了完全相同的问题。结果我忘了编辑 gradle.properties 文件。它应该是这样的:

android.useDeprecatedNdk=true

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias

【讨论】:

这是为我解决的问题!我们在 RN 59.3 上不确定这是否相关,以前从未遇到过这个问题,非常感谢你们的帮助!!【参考方案6】:

我实际上更喜欢使用环境变量将这些参数存储在应用程序仓库之外,因为它包含密码等敏感信息。

signingConfigs 
    release 
        if (System.env.MYAPP_RELEASE_STORE_FILE != null) 
            storeFile       file(System.env.MYAPP_RELEASE_STORE_FILE)
            storePassword   System.env.MYAPP_RELEASE_STORE_PASSWORD
            keyAlias        System.env.MYAPP_RELEASE_KEY_ALIAS
            keyPassword     System.env.MYAPP_RELEASE_KEY_PASSWORD
        
    

完成后,我可以加载一个 bash 脚本,其中包含如下详细信息

# path to my keystore
export MYAPP_RELEASE_STORE_FILE=/path/to/key.file
# ...

通过这种方式,签名配置与 repo 完全隔离。这可以防止您对您的秘密进行意外提交。

【讨论】:

【参考方案7】:

确保gradle.properties 中使用的别名与创建keystore 时使用的别名相同(使用keytool

【讨论】:

【参考方案8】:

在探索了有关此问题的所有答案后,没有一个答案有帮助!

所以尝试了下面的实验,它有帮助!!!!

my-release-key.keystore文件放在你项目文件夹的android目录下。

【讨论】:

my-release-key.keystore 表示文件的路径,或者更具体地说是./my-release-key.keystore。它从 android 目录工作,因为那是 Gradle 用于特定执行的工作目录。如果您愿意,可以硬编码绝对路径【参考方案9】:

使用 ./gradlew bundleRelease 而不是 ./gradlew assembleRelease

【讨论】:

【参考方案10】:

我放在 android/gradle.properties 中的 gradle.properties 文件,它对我有用,如果我们将它放在这个位置,它看起来像最新的 react .gradle/gradle.properties 文件,它不会从他们那里挑选出来。

【讨论】:

这解决了我的问题。当我使用 react-native 0.61 时,我将所有密钥库变量放在 android/.gradle/gradle.properties 中,一切都很好。现在我切换到 react-native 0.64,这不再有效。我必须将密钥库变量放在android/gradle.properties【参考方案11】:

确保您已将 .keystore 文件放在 app 文件夹中,并进行如下 gradle 更改:

    signingConfigs 
    release 
        storeFile file(RELEASE_STORE_FILE)
        storePassword RELEASE_STORE_PASSWORD
        keyAlias RELEASE_KEY_ALIAS
        keyPassword RELEASE_KEY_PASSWORD
    

【讨论】:

【参考方案12】:

在我的 gradle.properties 文件中是这样的

MYAPP_RELEASE_STORE_FILE=<your-app>.keystore
MYAPP_RELEASE_KEY_ALIAS=<keystore-alias>
MYAPP_RELEASE_STORE_PASSWORD=<password>
MYAPP_RELEASE_KEY_PASSWORD=<password>

在我的 build.gradle 文件中

release 
            if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) 
                storeFile file(MYAPP_UPLOAD_STORE_FILE)
                storePassword MYAPP_UPLOAD_STORE_PASSWORD
                keyAlias MYAPP_UPLOAD_KEY_ALIAS
                keyPassword MYAPP_UPLOAD_KEY_PASSWORD
            
        

我在我的 gradle.properties 中使用 RELEASE 而不是 UPLOAD。只需将 gradle.properties 中的 RELEASE 更改为 UPLOAD,问题就消失了。

【讨论】:

以上是关于React Native 生成​​签名的 APK “未设置用于签名配置发布的 KeyStore 文件”的主要内容,如果未能解决你的问题,请参考以下文章

react native 生成APK

从 React Native 应用程序生成 Apk,JDK 错误

React Native v0.59.2 android签名apk卡在启动画面

如何利用Android Studio打包React Native APK

react-native 签名

React Native Build Apk