在使用react-native 的整个过程中,我深一脚浅一脚的走到今天,着实为自己感到高兴。在此记录踩坑过程,阿门!

官方文档 中有完整打包apk步骤,我们一步步来。

首先,我们需要使用 keytool 生成一个私有秘钥,在Windows上 keytool 命令放在JDK的bin目录中。也就是说,命令必须在JDK安装的bin目录下运行,命令如下:

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key- alias -keyalg RSA -keysize 2048 -validity 10000

接下来的过程中,我需要输入秘钥口令及其他的一些信息,一切都很完美,就在此时,抛出一个错误:

java.io.FileNoFoundException:my-release-key.keystore(拒绝访问。)

这个错误是说找不到my-release-key这个文件,这是由于在安装我的JDK安装到了C盘,命令行在当前路径下没有写入文件的权限。这时,可以选择两种解决方法:

以管理员身份运行cmd,执行上述命令。 有多种方法可以使用,这里只叙述一种,在路径C:\Windows\System32中找到cmd.exe,右键以管理员身份运行。

我们可以将秘钥生成于其他盘,运行如下命令,将<MY_PATH>替换成秘钥保存路径即可。

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias - keyalg RSA -keysize 2048 -validity 20000 -keystore /<MY_PATH>/my-release-key.keystore

接下来,设置gradle变量。官方文档有详细步骤,这里只做简单叙述

将刚刚生成的秘钥放到项目下的android/app文件夹下

编辑或创建~/.gradle/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=*****

最后,生成发行apk包。运行如下命令:

cd android && ./gradlew assembleRelease

在windows 系统下,可能无法识别&&命令,所以讲上述命令分为两步:先运行cd android,进入当前项目下的android文件夹,然后运行./gradlew assembleRelease,就在即将大功告成之际,报了如下错误:

Exception in thread "main" java.util.zip.ZipException: error in opening zip file

这是由于gradle.zip下载有问题,解决方法有二。

  • gradle-2.14.1-all.zip删除后重新运行上述命令,文件会重新下载。
  • 手动下载文件,将其放到对应文件夹
  • gradle-2.14.1-all.zip文件对应位置在个人电脑上有所不同,在我这里是C:\Users\wxl\.gradle\wrapper\dists\gradle-2.14.1-all\8bnwg5hd3w55iofp58khbp6yv

    下载成功之后,再次键入命令,发现这最后一步还是没有迈过去。系统报错:gradlew : 无法将“gradlew”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

    官方文档中有这样一句:

    ./gradlew assembleRelease在macOS、Linux或是windows的PowerShell环境中表示执行当前目录下的名为gradlew的脚本文件,且其运行参数为assembleRelease,注意这个./不可省略;而在windows的传统CMD命令行下则需要去掉./

    所以我在运行时,直接运行gradlew assembleRelease,实际上这样反而会报错,正确的命令就是./gradlew assembleRelease。这一步仅作为参考,可能和windows的系统版本有关。

    这次,打包顺利完成,如图就是我们所打包出来的apk,生成的APK文件位于android/app/build/outputs/apk/app-release.apk