React Native生成签名APK时出现“未为签名配置发布设置KeyStore文件”的错误。

24

我正在尝试生成已签名的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
@Codesingh 是的,似乎 project.hasProperty("password.keystore") 返回 false,所以当我排除 if 语句时,代码可以运行。但是,我在 \Dictionary\android\app 中明确有一个名为 password.keystore 的文件。 - Benjamin
曾经我也在应用程序开发的这一部分遇到了困难,后来我开始从Android Studio窗口顶部的构建选项中生成已签名的APK。 - Codesingh
13个回答

25

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

错误信息'Keystore file not set for signing config release'表示在android/app/build.gradle文件中没有签名配置。

buildTypes {
    release {
        // other settings
        signingConfig signingConfigs.release
    }
}

为测试,您可以在 android/app/build.gradle 中直接硬编码设置,而不是在 gradle.properties 中进行设置。这样可以为我解决'Keystore was tampered with, or password was incorrect'问题。

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

如果你时间不够,我建议你使用硬编码的解决方案 :) - Masterfego

22
在我的项目中,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

2
你救了我的一天,我已经将RN从0.57升级到0.60,并愚蠢地复制了旧的gradle.properties文件,然后我注意到了你提到的更改,它解决了我的问题。谢谢! - Ibrahim Azhar Armar

16

我找到了一个解决方案!

如果你像我一样遵循了React Native官方指南,那么你需要将以下内容添加到你的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目录下。


5

我更喜欢使用环境变量来存储这些参数,因为它包含像密码等敏感信息,而这些信息应该放在应用程序之外的地方。

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
# ...

这样,签名配置完全与代码库隔离。这可以防止您在提交代码时意外泄露机密信息。


4

我曾经遇到过相同的问题。后来发现我忘了编辑 gradle.properties 文件。它应该像这样:

android.useDeprecatedNdk=true

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

这就是解决我的问题的方法!我们使用的是RN 59.3,不确定是否相关,以前从未遇到过这个问题,非常感谢你们的帮助!! - Sara Inés Calderón

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
    ...
}

2

我把 gradle.properties 文件放在 android/gradle.properties 中,这对我有效。最新的 React 版本中,如果我们把 .gradle/gradle.properties 文件放在此位置,它似乎不会被识别。


1
这解决了我的问题。当我使用react-native 0.61时,我将所有的密钥库变量放在android/.gradle/gradle.properties中,一切都很好。现在我切换到react-native 0.64,这不再起作用了。我必须将密钥库变量放在android/gradle.properties中。 - Fanchen Bao
@FanchenBao 解释得非常好。谢谢! - Des

2

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


1
尝试像这样做:

试着按照这样的方法进行:

           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'
        }
    }

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

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