(一)打包:
1、生成一个签名密钥:
你可以用keytool命令生成一个私有密钥。在Windows上keytool命令放在JDK的bin目录中(比如C:\Program Files\Java\jdkx.x.x_x\bin),先进入那个目录才能执行此命令:keytool -genkey -v -keystoremy-release-key.keystore -aliasmy-key-alias-keyalg RSA -keysize2048-validity10000 按照操作步骤操作即可 完成后生成my-release-key.keystore文件
2、设置gradle变量:
① 把my-release-key.keystore文件放到你工程中的android/app文件夹下
② 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=*****
3、添加签名到项目的gradle配置文件:编辑项目目录下的android/app/build.gradle
android {
...
defaultConfig { ... }
signingConfigs {
release {
storeFilefile(MYAPP_RELEASE_STORE_FILE)
storePassword MYAPP_RELEASE_STORE_PASSWORD
keyAlias MYAPP_RELEASE_KEY_ALIAS
keyPassword MYAPP_RELEASE_KEY_PASSWORD }
}
buildTypes {
release {
...
signingConfig signingConfigs.release
}
}
}
4、生成发行APK包:进入项目的android目录 然后运行命令
mac: ./gradlew assembleRelease
window:gradlew assembleRelease
生成的APK文件位于android/app/build/outputs/apk/app-release.apk,它已经可以用来发布了
(二)报错信息及处理:What went wrong:
Execution failed for task ':app:processReleaseResources'.
> Failed to execute aapt
1、node_modules_reactnavigation_src_views_assets_backicon.png, but the error uncompiled PNG file passed as argument. Must be compiled first into .flat file.. error: failed parsing overlays.
原因及解决方法:在gradle.properties文件中添加以下行:android.enableAapt2 = false,它实质上使用旧的aapt来获取资源。
2、添加上述问题后可能还会出现Duplicate file, Original is here. The version qualifier may be implied.
原因及解决方法:自定义node_modules / react-native / react.gradle以完美地解决重复文件错误。将以下代码添加到currentBundleTask创建块(在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()
}