react-native发行apk总结

这篇博客记录了在React Native项目中生成发行APK和增量发行包的步骤,包括遇到的错误和解决方法。从执行`./gradlew assembleRelease`到处理资源重复、签名问题,以及解决Gradle编译错误,作者提供了详细的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文只是个人用来记录项目开发过程中遇到的问题、思路及解决方案,具体出现的问题原因,后面空闲下来再做总结。

生成发行的apk

在终端先进入根据目录下的android目录,然后执行./gradlew assembleRelease 表示执行当前目录下的gradlew脚本文件,执行参数是assembleRelease,Gradle 的assembleRelease参数会把所有用到的 JavaScript 代码都打包到一起,然后内置到 APK 包中。

$ cd android  
$ ./gradlew assembleRelease
$ adb install //将安装包安装到手机里面

生成的 APK 文件位于android/app/build/outputs/apk/app-release.apk

生成增量发行包

首先通过rm -rf codepush/**先删了根目录上的codepush目录下的所有内容,然后根据情况分别打包android和ios。

  1. 先开始编译bundle文件
  2. 打包bundle文件
Android
$ react-native bundle --platform android --dev false --entry-file index.js --bundle-output codepush/index.android.bundle --assets-dest codepush/ 
$ zip -r codepush.android.zip codepush //将codepush里面的内容压缩
IOS
$ react-native bundle --platform ios --dev false --entry-file index.js --bundle-output codepush/index.ios.bundle --assets-dest codepush/
$ zip -r codepush.ios.zip codepush //将codepush里面的内容压缩
踩坑
  1. 执行./gradlew assembleRelease时报错:

    1-1 -bash: ./gradlew: Permission denied错误。
    解决方法:执行chmod +x gradlew命令。
    1-2
    /XXX/node_modules/react-native-smart-barcode/android/src/main/java/com/reactnativecomponent/barcode/RCTCapturePackage.java:41: 错误: 方法不会覆盖或实现超类型的方法
    @Override
    ^
    注: 某些输入文件使用或覆盖了已过时的 API。
    注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
    1 个错误

    解决方案: 找到相应的文件,注释掉 @Override。

    1-3
    /xxx/android/app/build/intermediates/res/merged/release/drawable-xhdpi-v4/src_user_images_help.jpg: error: Duplicate file.
    /xxx/android/app/build/intermediates/res/merged/release/drawable-xhdpi/src_user_images_help.jpg: Original is here. The version qualifier may be implied.

    :app:processReleaseResources FAILED

    FAILURE: Build failed with an exception.
    解决方案一: 错误提示是,两个文件重复了,解决思路一是删掉了第一个路径下的文件,再进行编译,结果发现删掉的文件又自动在相同的目录下生成了; 思路二是删除第二个路径下的文件,结果还是自动生成。后来删除了两个路径下的文件就编译通过了。
    解决方案二:在node_modules/react-native/react.gradle的

    def currentBundleTask = tasks.create(
                        name: bundleJsAndAssetsTaskName,
                        type: Exec) {
    

    函数里面的doFirst函数后面添加如下函数:

    doLast {
                        def moveFunc = { resSuffix ->
                            File originalDir = file("${resourcesDir}/drawable-${resSuffix}")
                            if (originalDir.exists()) {
                                File destDir = file("${resourcesDir}/drawable-${resSuffix}-v4")
                                ant.move(file: originalDir, tofile: destDir)
                            }
                        }
                        moveFunc.curry("ldpi").call()
                        moveFunc.curry("mdpi").call()
                        moveFunc.curry("hdpi").call()
                        moveFunc.curry("xhdpi").call()
                        moveFunc.curry("xxhdpi").call()
                        moveFunc.curry("xxxhdpi").call()
                    }
    

    1-4
    FAILURE: Build failed with an exception.
    What went wrong:
    Execution failed for task ‘:app:validateSigningRelease’. Keystore file /xxx/android/app/my-release-key.keystore not found for signing config ‘release’.
    解决方案:
    1-4-1
    在终端执行$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000命令,会自动生成my-release-key.keystore密钥库文件,然后把这个文件放到app目录下。
    1-4-2
    编辑~/.gradle/gradle.properties(全局配置,对所有项目有效)或是项目目录/android/gradle.properties(项目配置,只对所在项目有效)。如果没有gradle.properties文件你就自己创建一个,添加如下的代码(注意把其中的****替换为相应密码)

    {
    MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
    MYAPP_RELEASE_KEY_ALIAS=my-key-alias
    MYAPP_RELEASE_STORE_PASSWORD=*****
    MYAPP_RELEASE_KEY_PASSWORD=*****
    }
    

    1-5 出现[Fatal Error] :3:214: 与元素类型 "item" 相关联的 "name" 属性值不能包含 '<' 字符。 Could not read /Users/apple/Library/Android/sdk/platform-tools/api/annotations.zip的错误
    点击查看解决方案
    1-6 在命令窗口通过./gradlew assembleRelease命令打生产包时报/***/android/app/src/main/res/drawable-land-hdpi/launch_screen.png: Error: The drawable "launch_screen" in drawable-land-hdpi has no declaration in the base drawable folder or in a drawable-densitydpi folder; this can lead to crashes when the drawable is queried in a configuration that does not match this qualifier [MissingDefaultResource]错误,通过androidstudio正常;
    解决方案:在android/app/src/main/res/drawable目录下添加launch_screen.png图片;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值