本文只是个人用来记录项目开发过程中遇到的问题、思路及解决方案,具体出现的问题原因,后面空闲下来再做总结。
生成发行的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。
- 先开始编译bundle文件
- 打包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里面的内容压缩
踩坑
-
执行
./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图片;