React NativeでAndroidアプリ @ Windows 備忘録

React Nativeのインストールからリリースビルドまでの備忘録

## 準備

### node.jsをインストール
### Android Studioをインストール

### PATHを通す

- `C:/Program Files/Android/Android Studio/jre/bin`
  - keytool.exe
  - jarsigner.exe
- `%USERPROFILE%/AppData/Local/Android/SDK/tools`
  - android.bat
  - emulator.exe
- `%USERPROFILE%/AppData/Local/Android/SDK/platform-tools`
  - adb.exe

### 環境変数をセット

|              |                                                |
|-------------:|-----------------------------------------------:|
| ANDROID_HOME |        %USERPROFILE%/AppData/Local/Android/SDK |
|    JAVA_HOME |    C:/Program Files/Android/Android Studio/jre |
|    JAVA_OPTS | -DproxyHost=your.proxy.server -DproxyPort=8888 |

プロキシの設定は必要に応じて

### プロジェクトの初期化

```bash
$ npm install -g react-native-cli
$ react-native init AwesomeProject
$ cd AwesomeProject
```

## エミュレータでデバッグ

### エミュレータの起動

1. デバイス名を調べる

```bash
$ android list avd
```

2. 起動

```bash
$ emulator -avd <デバイス名>
```

### デバッグビルドと起動

```bash
$ react-native run-android
```

## 実機でデバッグ(USB接続)

```bash
$ adb reverse tcp:8081 tcp:8081
$ react-native run-android
```

## リリースビルド

### 鍵の作成

```bash
$ keytool -genkey -v -keystore ./android/app/android-release.keystore -alias android-release -keyalg RSA -keysize 2048 -validity 36524
```

### 設定ファイル等の修正

以下の記事を参考にパスワードその都度コンソールで入力するようにする
[Android Studio(Gradle)でapkファイルを作成する時にstorePassword/keyAlias/keyPasswordの指定方法をいくつか検証してみた。](http://qiita.com/shiraji/items/8f55b5295094487ce71a)

```diff
diff --git a/android/app/build.gradle b/android/app/build.gradle
index aef0c43..959f6e1 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -89,6 +89,15 @@ def enableSeparateBuildPerCPUArchitecture = false
  */
 def enableProguardInReleaseBuilds = false
 
+gradle.taskGraph.whenReady { taskGraph ->
+    if(taskGraph.hasTask(':app:assembleRelease')) {
+        def storePasswordValue = new String(System.console().readPassword("Enter store password: "))
+        def keyPasswordValue = new String(System.console().readPassword("Enter key password: "))
+        android.signingConfigs.release.storePassword = storePasswordValue
+        android.signingConfigs.release.keyPassword = keyPasswordValue
+    }
+}
+
 android {
     compileSdkVersion 23
     buildToolsVersion "23.0.1"
@@ -103,6 +112,16 @@ android {
             abiFilters "armeabi-v7a", "x86"
         }
     }
+    signingConfigs {
+        release {
+            if (project.hasProperty('RELEASE_STORE_FILE')) {
+                storeFile file(RELEASE_STORE_FILE)
+                storePassword ""
+                keyAlias RELEASE_KEY_ALIAS
+                keyPassword ""
+            }
+        }
+    }
     splits {
         abi {
             reset()
diff --git a/android/gradle.properties b/android/gradle.properties
index 1fd964e..68738d2 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -18,3 +18,6 @@
 # org.gradle.parallel=true
 
 android.useDeprecatedNdk=true
+
+RELEASE_STORE_FILE=android-release.keystore
+RELEASE_KEY_ALIAS=android-release
```

### ビルド

```bash
$ cd ./android
$ gradlew assembleRelease
```

### インストール

1. デバッグビルドをインストールしたままだと`[INSTALL_FAILED_UPDATE_INCOMPATIBLE: ]`云々
   と署名が違う旨のエラーを吐くのでアンインストールしておく

2. そのままインストールしようとしても`[INSTALL_PARSE_FAILED_NO_CERTIFICATES: ]`云々
   とエラーが出てインストールできないので署名し直してからインストールする

```bash
$ jarsigner -verbose -keystore app/android-release.keystore app/build/outputs/apk/app-release-unsigned.apk android-release
$ adb -d install app/build/outputs/apk/app-release-unsigned.apk
```