从同事那里转来的文章。
>>>我的博客<<<
编译react native项目,并最终打包成安卓的apk包
-entry-file 指定入口文件 因为要打包ios平台,所以指定为rn项目的index.ios.js作为入口
–bundle-output 指定输出的jsbundle文件路径和文件名 指定到rn项目的ios工程文件夹下,记得一定要先创建bundle文件夹,不然终端会报文件夹找不到的错误
–platform 指定平台类型
–assets-dest 指定资源文件夹路径 assets文件夹的路径,包含图片、node模块等资源
–dev 是否为开发模式 如果设置为false,不会产生警告,并且bundle会被压缩
还有其他命令,比如:transformer、prepack、bundle-encoding等,可以到官网查看具体介绍。
第十章 离线打包发布
10.2 Android打包发布
1)将js代码打包成jsbundle包
-
在android工程中创建assets文件夹,可以用命令行创建,也可以手动创建,命令如下:
mkdir android/app/src/main/assets
- 在工程的根目录输入如下命令进行打包
react-native bundle --entry-file demo/index.js --bundle-output ./android/app/src/main/assets/index.android.jsbundle --platform android --assets-dest ./android/app/src/main/res/ --dev false
【注意:上述命令中 “demo/index/.js”是你工程的安卓入口文件目录】
- 在
MyApplication.java
中的ReactNativeHost中添加
getBundleAssetName`方法,该方法的返回值,必须与上一步中生成的jsbundle文件的文件名保持一致。
@Nullable
@Override
protected String getBundleAssetName() {
return "index.android.bundle";
}
2)利用命令行打包安卓APK
Android要求所有应用都必须有一个签名证书才允许安装在手机上,所以,在把应用发布到应用市场之前必须生成1个签名的apk包。
-
生成签名秘钥
在Windows上
keytool
命令放在JDK的bin目录中(比如C:\Program Files\Java\jdkx.x.x_x\bin
),你可能需要在命令行中先进入那个目录才能执行此命令。在mac上,建议在工程目录下生成:$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
【注:keystore名称可自己修改】
这条命令会要求你输入密钥库(keystore)和对应密钥的密码,然后设置一些发行相关的信息。最后它会生成一个叫做my-release-key.keystore
的密钥库文件。
在运行上面这条语句之后,密钥库里应该已经生成了一个单独的密钥,有效期为10000天。--alias参数后面的别名是你将来为应用签名时所需要用到的,所以记得记录这个别名。
-
设置gradle变量
把
my-release-key.keystore
文件放到你工程中的android/app
文件夹下。-
在
android
工程的gradle.properties
文件中加入如下代码:MYAPP_RELEASE_STORE_FILE=my-release-key.keystore MYAPP_RELEASE_KEY_ALIAS=my-key-alias MYAPP_RELEASE_STORE_PASSWORD=hongchuang MYAPP_RELEASE_KEY_PASSWORD=hongchuang
-
添加签名到gradle配置文件
编辑你项目目录下的
android/app/build.gradle
,添加如下的签名配置:... android { ... defaultConfig { ... } signingConfigs { release { storeFile file(MYAPP_RELEASE_STORE_FILE) storePassword MYAPP_RELEASE_STORE_PASSWORD keyAlias MYAPP_RELEASE_KEY_ALIAS keyPassword MYAPP_RELEASE_KEY_PASSWORD } } buildTypes { release { ... signingConfig signingConfigs.release } } } ...
-
生成签名apk包
cd android
./gradlew assembleRelease
./gradlew assembleRelease
在macOS、Linux或是windows的PowerShell环境中表示执行当前目录下的名为gradlew的脚本文件,且其运行参数为assembleRelease,注意这个./
不可省略;而在windows的传统CMD命令行下则需要去掉./
。
Gradle的assembleRelease
参数会把所有用到的JavaScript代码都打包到一起,然后内置到APK包中。如果你想调整下这个行为(比如js代码以及静态资源打包的默认文件名或是目录结构等),可以看看android/app/build.gradle
文件,然后琢磨下应该怎么修改以满足你的需求。
生成的APK文件位于android/app/build/outputs/apk/app-release.apk
,它已经可以用来发布了。
-
测试签名包
输入以下命令来安装上一步生成的签名包,来进行测试。
cd android
./gradlew installRelease
注意
installRelease
参数只能在你完成了上面的签名配置之后才可以使用。 你现在可以关掉运行中的packager了,因为你所有的代码和框架依赖已经都被打包到apk包中,可以离线运行了。在debug和release版本间来回切换安装时可能会报错签名不匹配,此时需要先卸载前一个版本再尝试安装。
-
启用Proguard代码混淆来缩小apk文件大小(可选)
Proguard是一个Java字节码混淆压缩工具,它可以移除掉React Native Java(和它的依赖库中)中没有被使用到的部分,最终有效的减少APK的大小。
【启用Proguard之后,你必须再次全面地测试你的应用。Proguard有时候需要为你引入的每个原生库做一些额外的配置。参见
app/proguard-rules.pro
文件。】启用方法是修改android工程的
build.gradle
文件,设置minifyEnabled
选项为true
buildTypes { release { signingConfig signingConfigs.release minifyEnabled true proguardFile 'proguard.txt' } }
3)利用androidStudio打包生成apk
-
利用AndroidStudio生成签名秘钥
具体方法是,androidStudio—>Build—>Generate Signed apk—>点击【next】—>【Create new】
如下图所示:
然后进入创建窗口,选择keystore路径,key store密码,然后下面如图所示输入公司及开发者信息,信息输入完成后点击【ok】即可生成keystore。
此处的keystore password 跟key Alias 以及password 需要记住,当利用keystore打包时需要填写。
-
利用AndroidStudio打包生成签名apk
方法还是,androidStudio—>Build—>Generate Signed apk—>点击【next】—>【Choose existing】—>选择上一步生成的keystore文件路径—>输入keystore相关信息—>【Next】
然后选择apk存储路径—>Signature Versions 选择【V2(Full APK Signature)】—>【Finish】然后等待apk 打包完成即可
到这里,打包工作就完成了,把apk上传应用商店即可。
常见问题
1、build失败
在国内不适用代理的话build失败是常见的,有些包下载不下来。
另外如果有个别包就是下载失败,可以尝试调换repository里的顺序,比如我的环境里有个common-1.0.0.jar死活下载不下来,调了顺序,将google放成第一个就成功了。
repositories {
jcenter()
google()
mavenCentral()
maven { url 'https://maven.fabric.io/public' }
}
另外,bugild失败如果本地有代理的话,在android studio里正确配置代理也是一种办法。