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,JDK 错误
React Native v0.59.2 android签名apk卡在启动画面