ReactNativeのandroid releaseが動かない

ReactNativeでinitしただけのアプリのandroid releaseが動かないときの対処方法です。react: 16.8.3, react-native: 0.59.8 です。

1. ターミナルで、Task 'installRelease' not found in project が表示された場合

$ react-native run-android --variant=release
info Starting JS server...
info Building and installing the app on the device (cd android && ./gradlew app:installRelease)...

FAILURE: Build failed with an exception.

* What went wrong:
Task 'installRelease' not found in project ':app'. Some candidates are: 'uninstallRelease'.
Code language: JavaScript (javascript)

release apkができているか確認してください。本来は、app-release.apk があるはずです。

# app-release.apkがない!
$ ls ./android/app/build/output/release/
output.jsonCode language: PHP (php)

release apkがない場合は、android/app/build.gradle に署名キーの設定が不足しています。とりあえず、debug用の設定を記述しましょう。

// android/app/build.gradle

    signingConfigs {
        release {
            keyAlias      "androiddebugkey"
            keyPassword   "android"
            storeFile     file('~/.android/debug.keystore')
            storePassword "android"
        }
    }
    buildTypes {
        release {
            〜省略〜
            signingConfig signingConfigs.release
        }
    }Code language: JavaScript (javascript)

2. エミュレータ画面で「問題が発生したため、(アプリ名)を終了しました」と表示された場合

ターミナルの表示では、BUILD SUCCESSFULと表示されました。

しかし、エミュレータ画面(または実機の画面)は白くなった直後、アラートボックスで「問題が発生したため(アプリ名)を終了しました」と表示されて、終了してしまいました。

$ react-native run-android --variant=release
〜省略〜
BUILD SUCCESSFUL in 39s

念のため、release apkができていることを確認しておきましょう。

$ find . -name "*.apk"
./android/app/build/outputs/apk/release/app-release.apkCode language: JavaScript (javascript)

android/build.gradleを見てください。gradleプラグインバージョンは、3.3.1でしょうか?3.4.1でしょうか?

// android/build.gradlw
buildscript {
    〜省略〜
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
Code language: JavaScript (javascript)

react-native init直後は、3.3.1です。android stuidoで開いたとき、gradleをupdateしますかと聞かれて、Updateしたので、3.4.1になっていました。

そんなことは忘れていて、動くプロジェクトと、動かないプロジェクトをdiffして、ようやく判明しました。

対応方法1:3.3.1に戻す

3.4.1 の部分を 3.3.1 に編集してください。次にターミナルで、中間ファイルを削除してから、releaseビルドしてください。

$ cd android
$ ./gradlew clean
$ cd ..

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

対応方法2:3.4.1のまま、手動でbundleする

次の記事によると、原因は、jsがbundleされないため。自力でbundleするとよい、とのことです。

findしてみると、index.android.bundleがありませんでした。

# できていない場合
$ find . -name index.android.bundle
(何も表示されない)

# 正常の場合
$ find . -name index.android.bundle
./android/app/build/intermediates/merged_assets/release/mergeReleaseAssets/out/index.android.bundle
./android/app/build/intermediates/assets/release/index.android.bundle
./android/app/build/generated/assets/react/release/index.android.bundleCode language: PHP (php)

次のような、releaseビルド用のシェルスクリプト run-android-release.shを作ってください。実行すると、releasaeビルドが動きました。

#!/bin/bash

# 必要に応じて、releaseの署名キー情報
. setenv.sh

cd android
./gradlew assembleRelease
cd ..

mkdir -p android/app/src/main/assets

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/

react-native run-android --variant=releaseCode language: PHP (php)
$ chmod +x run-android-release.sh

$ cd android/; ./gradlew clean; cd ..
$ ./run-android-release.sh

※ application_idをcom.xxxxからclick.xxxxに編集したので、これも疑いましたが、これは原因ではありませんした。

タイトルとURLをコピーしました