使用 React Native 开发应用时,默认是在开发环境下,在 Android 中被称为 debug
模式。开发环境主要包含两个部分:
Metro 运行环境类似于前端中的开发服务器,负责监听和打包 JS 代码。有时候我们想把开发环境的 APK 包丢给别人测试,发现是不行的,因为没有 Metro 运行环境。
Debug 模式的 APK 安装包在这个目录下:
android/app/build/outputs/apk/debug
所以,以安卓为例,我们看如何打一个正式的包。
Android 的正式版被称为 release
版本,在打包前必须做签名
。相比于 debug 版,正式版的剔除了开发用的模块,包体积更小,版本发布也更安全。
1. 生成签名
签名是啥意思?其实就是给这个包绑定一个身份信息,比如是谁开发的,属于哪个公司,还需要设置一些密码。
这些身份信息都通过一个签名文件来设置。在终端使用以下命令生成签名文件:
$ keytool -genkeypair -v -storetype PKCS12 -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
上面命令比较长,直接粘贴即可,需要修改的有两处:
执行命令后控制台会提示你输入口令、姓名、城市等,完成后默认生成文件 my-release-key.keystore
,我们将其拷贝到 android/app 目录下。
2. 设置 gradle 变量
签名生成后,将会在打包时使用。在这之前,还需要设置几个签名相关的 gradle 变量,以便在后续配置中使用。打开 android/gradle.properties 文件,在文件末尾添加变量:
MYAPP_RELEASE_STORE_FILE=my-release-key.keystore # 文件名MYAPP_RELEASE_KEY_ALIAS=my-key-alias # 别名MYAPP_RELEASE_STORE_PASSWORD=xxxx # 口令/密码MYAPP_RELEASE_KEY_PASSWORD=xxxx # 口令/密码
3. 添加构建配置
构建配置文件是 android/app/build.gradle,在该文件下添加签名配置,会用到上一步设置的变量。如下:
android {...defaultConfig { ... }# 签名配置signingConfigs {release {if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {storeFile file(MYAPP_RELEASE_STORE_FILE)storePassword MYAPP_RELEASE_STORE_PASSWORDkeyAlias MYAPP_RELEASE_KEY_ALIASkeyPassword MYAPP_RELEASE_KEY_PASSWORD}}}# 构建类型buildTypes {release {...signingConfig signingConfigs.release # 使用的签名配置}}}
仔细阅读上面配置中的备注,确认配置无误后,就可以执行打包了。
4. 打包
在终端进入 android 目录,然后执行命令:
$ ./gradlew assembleRelease
耐心等待,马上一个 release 版的 APK 包就生成了。
Release 模式的 APK 安装包在这个目录下:
android/app/build/outputs/apk/release
默认情况下,即便是一个空的 React Native 项目,打包后的 APK 体积也有 100M 以上,这是非常可怕的,我们看如何减小。
1. 依据 CPU 架构拆包
打包后的 APK 包含所有 CPU 架构,而针对不同的架构只需要安装一个,因此我们可以将 APK 单独拆分为独立的包。方法是修改 android/app/build.gradle 的以下属性为 true
:
def enableSeparateBuildPerCPUArchitecture = true
重新打包,输出结果变成了这个样子:
多数情况下真机是 ARM 架构,而模拟器是 x86 架构,按照需求安装对应版本。
注意,Debug 模式下不允许拆包,否则会运行错误,请将属性重新设置为 false
2. 压缩包体积
与前端打包时的压缩原理一样,APK 打包时可以压缩 Java 字节码。方法还是是修改 android/app/build.gradle 文件中的属性,如下:
def enableProguardInReleaseBuilds = true
重新打包,发现 APK 体积会变小。