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.json
Code 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.apk
Code 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.bundle
Code 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=release
Code language: PHP (php)
$ chmod +x run-android-release.sh
$ cd android/; ./gradlew clean; cd ..
$ ./run-android-release.sh
※ application_idをcom.xxxxからclick.xxxxに編集したので、これも疑いましたが、これは原因ではありませんした。