在 React Native 中生成发布 apk

generate release apk in react native

我通过 React Native 创建了一个简单的应用程序。现在完成部署后,我想发布 apk 所以为了根据它 official site 我创建了密钥:

"C:\Program Files\Java\jdk1.8.0_162\bin\keytool.exe" -genkeypair -v -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

我补充说:

MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=mypass
MYAPP_UPLOAD_KEY_PASSWORD=mypass

进入 android/gradle.properties 文件,最后我将 release 部分添加到 android/app/build.gradle 文件的 signingConfigs 部分:

signingConfigs {
    debug {
        storeFile file('debug.keystore')
        storePassword 'android'
        keyAlias 'androiddebugkey'
        keyPassword 'android'
    }
     release {
        if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
            storeFile file(MYAPP_UPLOAD_STORE_FILE)
            storePassword MYAPP_UPLOAD_STORE_PASSWORD
            keyAlias MYAPP_UPLOAD_KEY_ALIAS
            keyPassword MYAPP_UPLOAD_KEY_PASSWORD
        }
    }
}

我将这个标志配置添加到 buildTypes 部分:

buildTypes {
    debug {
        signingConfig signingConfigs.debug
    }
    release {
        minifyEnabled enableProguardInReleaseBuilds
        proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
        signingConfig signingConfigs.release
    }
}

但在 运行 \android> ./gradlew bundleRelease 之后:

PS F:\SafaProject\ReactNative\RNAuditMngm\android> ./gradlew bundleRelease

> Task :app:bundleReleaseJsAndAssets
warning: the transform cache was reset.
Loading dependency graph, done.
info Writing bundle output to:, F:\SafaProject\ReactNative\RNAuditMngm\android\app\build\generated\assets\react\release\index.android.bundle
info Writing sourcemap output to:, F:\SafaProject\ReactNative\RNAuditMngm\android\app\build\generated\sourcemaps\react\release\index.android.bundle.map
info Done writing bundle output   
info Done writing sourcemap output
info Copying 13 asset files
info Done copying assets

> Task :react-native-gesture-handler:compileReleaseJavaWithJavac
Note: F:\SafaProject\ReactNative\RNAuditMngm\node_modules\react-native-gesture-handler\android\src\main\java\com\swmansion\gesturehandler\react\RNGestureHandlerButtonViewManager.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

> Task :react-native-reanimated:compileReleaseJavaWithJavac
Note: F:\SafaProject\ReactNative\RNAuditMngm\node_modules\react-native-reanimated\android\src\main\java\com\swmansion\reanimated\NodesManager.java uses or overrides a deprecated 
API.
Note: Recompile with -Xlint:deprecation for details.
Note: F:\SafaProject\ReactNative\RNAuditMngm\node_modules\react-native-reanimated\android\src\main\java\com\swmansion\reanimated\NodesManager.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.5/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 1m 54s
88 actionable tasks: 84 executed, 4 up-to-date
PS F:\SafaProject\ReactNative\RNAuditMngm\android> 

它只是在 \app\build\outputs\bundle\release 文件夹中创建 app.aab 文件?

如何创建 apk 文件?

这是完整的应用程序 build.gradle

如果你想创建 .apk 然后 运行 命令:

cd android

./gradlew assembleRelease

它将在此处生成发布 apk :

android/app/build/output/apk/release/app-release.apk

如果您想生成要上传到 Play 商店的文件 (.aab):

cd android

./gradlew bundleRelease

这是我生成签名 APK 的方式。

我还将向您展示如何安全地加载您的 gradle 变量,以便可以将项目安全地推送到 Git 而不会暴露您的密码(教程中没有涵盖这令人讨厌的事情) ).

1。生成上传密钥。

您可以使用密钥工具生成私有签名密钥。在 Windows 上,keytool 必须是来自 C:\Program Files\Java\jdkx.x.x_x\bin.

的 运行

keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

此命令提示您输入密钥库和密钥的密码以及密钥的可分辨名称字段。然后它将密钥库生成为名为 my-upload-key.keystore.

的文件

密钥库包含一个密钥,有效期为 10000 天。

2。设置 Gradle 变量并安全地将它们加载到

将 my-upload-key.keystore 文件放在项目文件夹的 android/app 目录下。

在 android 文件夹中创建一个新文件:android/keystore.properties 并添加以下内容(但显然使用您自己的密码)。

MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=YOUR_PASSWORD_HERE
MYAPP_UPLOAD_KEY_PASSWORD=YOUR_PASSWORD_HERE

然后将这个新文件添加到 .gitignore,这样你就可以安全地推送到 github 而不会暴露你的变量:

keystore.properties

接下来,修改您的 android/app/build.gradle 代码以加载您的密钥库属性:

// Load keystore
def keystorePropertiesFile = rootProject.file("keystore.properties");
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

// ...

android{

    // ...

 signingConfigs {
        release {
            if ( keystorePropertiesFile.exists() ) {
                storeFile file(keystoreProperties['MYAPP_UPLOAD_STORE_FILE'])
                storePassword keystoreProperties['MYAPP_UPLOAD_STORE_PASSWORD']
                keyAlias keystoreProperties['MYAPP_UPLOAD_KEY_ALIAS']
                keyPassword keystoreProperties['MYAPP_UPLOAD_KEY_PASSWORD']
            }

        }
  }
    buildTypes {
        release {
            // ...
            signingConfig signingConfigs.release
        }
    }

    // ...
}

这样做可以确保如果其他人从 Git 克隆它而没有 keystore.properties 文件,该项目仍然可以工作 - 完美。

3。手动生成 Android 发布包文件

删除当前 index.android.bundle 文件:

rm android/app/src/main/assets/index.android.bundle

如果不存在这样的文件,您将收到“没有这样的文件或目录”消息。

接下来,生成android包,注意下面是一个命令:

npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

您可能会收到“重复资源”错误(至少我总是这样)。转到 /android/app/src/main/res 文件夹并删除所有以“drawable”开头的文件。

4。生成 Android 签名版本构建 APK

导航至 android 文件夹:

cd android

和运行以下命令生成您的发布 APK:

./gradlew clean && ./gradlew assembleRelease

如果有任何错误,请删除 android/.gradle 和 android/app/build/ 并重试。

您签名的 APK 现在应该位于 android/app/build/outputs/apk/app-release.apk.

构建成功后,从项目的根文件夹 运行 下面的命令在您的设备中测试您的应用程序:

npx react-native run-android --variant=release

如果您有任何问题,请在重新执行上述步骤之前尝试以下操作:

  • 确保在 emulator/phone 上卸载旧应用。
  • 删除旧的 android/.gradle 和 android/app/build 文件夹。
  • Npm 缓存清理 –force。
  • 删除并重新安装 node_modules。

我把这个答案写成 an article 供我自己将来参考,但请随时将其添加为书签 :)