在React Native中生成发布apk

时间:2019-12-30 09:14:08

标签: react-native react-native-android

我通过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文件的signingConfigs部分中添加了android/app/build.gradle部分:

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.aab文件夹中创建\app\build\outputs\bundle\release文件吗?

我如何创建apk文件?

这是完整的应用build.gradle

2 个答案:

答案 0 :(得分:2)

如果要创建.apk,请运行命令:

  

cd android

     

./ gradlew assembleRelease

它将在此处生成发行版APK:

  

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

如果您想生成一个小玩意(.aab)并上传到游戏商店:

  

cd android

     

./ gradlew bundleRelease

答案 1 :(得分:1)

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

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

1.生成上传密钥。

您可以使用 keytool 生成私有签名密钥。在 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
        }
    }

    // ...
}

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

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

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

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

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

接下来,生成android bundle,注意下面是一条命令:

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

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

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

我将此答案写为 an article 以供将来参考,但请随时将其加入书签:)