React Native构建Release成功仅生成app-release-unsigned.apk问题
嘿,我完全懂你现在的困惑——明明终端飘着BUILD SUCCESSFUL的提示,翻遍输出目录却只拿到一个未签名的APK,再加上对Gradle打包这块不太熟,肯定有点头大对吧?别慌,咱们一步步把这个问题捋清楚。
首先得先搞明白:生成app-release-unsigned.apk其实是React Native release构建的正常中间步骤,但要得到能用来发布的签名APK,还得完成签名配置这关键一环。你大概率是在文档流程里漏了签名配置的部分,或者配置没生效。
下面是针对你的情况的具体解决步骤,我尽量说得直白点,避开复杂的Gradle术语:
第一步:先确认你有没有生成签名密钥
如果你还没创建过签名密钥,先在终端里执行这个命令(记得把括号里的内容换成你自己的信息):
keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
执行完会生成一个my-upload-key.keystore文件,把它放到你的项目android/app/目录下(别把这个文件提交到版本控制里!)
第二步:配置Android项目的签名信息
打开android/app/build.gradle文件,找到android代码块,按下面的方式添加/修改签名配置:
android { // 其他已有的配置... signingConfigs { release { // 如果你把密钥文件放在app目录下,路径就这么写 storeFile file('my-upload-key.keystore') storePassword '你创建密钥时设置的密钥库密码' keyAlias '你创建密钥时设置的别名(比如上面的my-key-alias)' keyPassword '你创建密钥时设置的密钥密码' } } buildTypes { release { // 其他已有的配置(比如minifyEnabled之类的)... // 这一行是核心!必须让release构建使用上面的签名配置 signingConfig signingConfigs.release } } }
⚠️ 要是担心密码明文泄露,可以把密码移到android/gradle.properties文件里:
在gradle.properties里添加:
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore MYAPP_UPLOAD_STORE_PASSWORD=你的密钥库密码 MYAPP_UPLOAD_KEY_ALIAS=my-key-alias MYAPP_UPLOAD_KEY_PASSWORD=你的密钥密码
然后把build.gradle里的签名配置改成:
signingConfigs { release { storeFile file(MYAPP_UPLOAD_STORE_FILE) storePassword MYAPP_UPLOAD_STORE_PASSWORD keyAlias MYAPP_UPLOAD_KEY_ALIAS keyPassword MYAPP_UPLOAD_KEY_PASSWORD } }
第三步:重新执行构建命令
先清理一下之前的构建缓存,避免旧配置干扰:
cd android && ./gradlew clean
然后重新构建release版本:
./gradlew assembleRelease
(Windows系统直接执行gradlew assembleRelease就行)
现在再去android/app/build/outputs/apk/release/目录看看,应该会同时出现app-release.apk(这就是签名好的可发布APK)和app-release-unsigned.apk(中间产物,不用管它)
几个容易踩的小坑
- 确认密钥文件的路径正确:如果你的
my-upload-key.keystore没放在app目录下,要调整storeFile的路径,比如file('../my-upload-key.keystore') - 一定要检查
buildTypes的release块里有没有signingConfig signingConfigs.release这一行,很多人就是漏了这个,导致Gradle只生成未签名APK - 要是之前配置过签名但没生效,先执行
./gradlew clean再重新构建,缓存有时候会搞事情
你的node和npm版本虽然偏旧,但只要和你使用的React Native版本兼容,就不会影响打包,核心问题还是Gradle的签名配置没跟上。
内容的提问来源于stack exchange,提问作者Jamie Jamier

