React Native生成签名APK"KeyStore文件未设置为签署配置版本"

Ben*_*min 16 gradle gradlew build.gradle android-gradle-plugin react-native

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

任务':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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Yor*_*uba 22

密钥库文件必须在Android设备/应用程序文件夹中.

消息'未设置签名配置版本的密钥库文件'必须这样做,android/app/build.gradle文件中没有signedConfig.

buildTypes {
    release {
        // other settings
        signingConfig signingConfigs.release
    }
}
Run Code Online (Sandbox Code Playgroud)

对于测试,你可以硬编码android/app/build.gradle中的设置,而不是在gradle.properties中设置它.这给我解决了'Keystore被篡改或密码不正确'的问题

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


Sca*_*der 12

就我而言,我的项目使用的是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,然后我注意到你提到的更改,它解决了我的问题。谢谢你 (2认同)

小智 9

我找到了解决方案!

如果您像我一样按照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>
Run Code Online (Sandbox Code Playgroud)

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

app/build.gradle-file中,不应替换字符串。如果您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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我最初所做的是用我的密钥库文件的路径替换字符串(即“ MYAPP_RELEASE_STORE_FILE”),但是您根本不应替换任何变量。我想您会看到我们在其中创建的字符串与我们在其中创建gradle.properties的release-config 之间的联系app/build.gradle

记住也要包含.keystore-file文件android/app


EFr*_*eak 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

# path to my keystore
export MYAPP_RELEASE_STORE_FILE=/path/to/key.file
# ...
Run Code Online (Sandbox Code Playgroud)

这样签名配置就与存储库完全隔离。这可以防止您意外泄露您的秘密。


JmJ*_*JmJ 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
    ...
}
Run Code Online (Sandbox Code Playgroud)