ReactNativeのAndroid 64bit対応時に読んでおきたいメモ

> **2019 年 8 月 1 日以降**、Google Play で公開するアプリは 64 ビット アーキテクチャをサポートする必要があります。64 ビット CPU は、高速かつ豊かなエクスペリエンスをユーザーに提供します。64 ビット バージョンのアプリを追加することで、パフォーマンスを向上し、将来のイノベーションに備え、64 ビット ハードウェアのみで構成されたデバイスに対応できるようになります。

Android Developers: [Support 64-bit architectures](https://developer.android.com/distribute/best-practices/develop/64-bit#look_for_native_libraries_using_apk_analyzer)より

--- 

今回ReactNativeで作成したアプリを64bitに対応させる必要があったのでそのメモです。
ReactNative側のIssueを漁るの辛すぎたからから記事にした。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">react-nativeのandroid 64bit対応、なんかいろんなissueがあって混乱してるんですが、すでに64bit対応やってよって人いたりしないかな...<br><br>日本語の情報やgoogleのブログでは32bitが含まれているかの確認方法は書いてあるが含まれていた場合のネクストアクションがわからないので困っている</p>&mdash; hand_dot (@hand_dot) <a href="https://twitter.com/hand_dot/status/1132912802652233733?ref_src=twsrc%5Etfw">May 27, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

下記の記事も参考にさていただきました。ありがとうございました。
[React Native製 Android アプリの64bit対応
](https://qiita.com/sekitaka_1214/items/5656c680a069880f3129#comment-bc9a96261ac358293278)

# Step1 react-nativeのバージョンを確認する

とりあえず自分のreact-nativeのバージョンを確認して、`0.59.1`以下であれば先にバージョンアップを行ってください。
下記の画像にあるように[リリースノート](https://github.com/facebook/react-native/releases)では`0.59.0`と`0.59.1`で64bit対応が行われているため、最低でも`0.59.1`に頑張ってやってください。

<img width="947" alt="スクリーンショット 2019-05-28 18.12.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204698/2c0cf4e8-8368-0976-1b97-82bb58585fb2.png">
<img width="918" alt="スクリーンショット 2019-05-28 18.12.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204698/676b3a87-4313-278e-8b91-fce9f7b3b9a0.png">


[ReactNativeのバージョンアップ時に読んでおきたいメモ](https://qiita.com/hand-dot/items/b3f8afc64ccd1713726b)という記事もあるので、ご参考までに。




# Step2 64ビットライブラリがあるかチェックする
次に、自分のアプリに対応が必要かチェックしていきます。自分のアプリで使用されている32bitライブラリに対して64bitのライブラリがあればOKです。

[APK Analyzer を使用してネイティブ ライブラリを探す](https://developer.android.com/distribute/best-practices/develop/64-bit#look_for_native_libraries_using_apk_analyzer) 方法についてはGoogleの公式を参考にチェックしていきましょう。

下記を参考にしながら各32ビットアーキテクチャに対して、対応する64ビットアーキテクチャがあるか確認します。

|プラットフォーム|32 ビット ライブラリのフォルダ|64 ビット ライブラリのフォルダ|
|:----------------|:-----------------|:------------------:|
| ARM|lib/armeabi-v7a|lib/arm64-v8a|
| x86|lib/x86|lib/x86_64|

下記は対応が必要な例です。
32ビットアーキテクチャに対して、対応する64ビットアーキテクチャがないですね。
![スクリーンショット 2019-05-28 18.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204698/747c580d-3262-e726-0f99-fb4310f83ec1.png)

---

# Step3 build.gradleを修正

下記はあくまでも自分の作業環境にて、`0.57.5`から`0.59.8`に上げたときの修正内容です。参考にしてください。
https://pvinis.github.io/purge-web/ このサイトから自分のバージョンに合わせて`/android/app/build.gradle`の差分をみて適応していけばOKです。


```diff:/android/app/build.gradle
      defaultConfig {
         applicationId "com.rndiffapp"
@@ -103,16 +107,13 @@ android {
         targetSdkVersion rootProject.ext.targetSdkVersion
         versionCode 1
         versionName "1.0"
-        ndk {
-            abiFilters "armeabi-v7a", "x86"
-        }
     }
     splits {
         abi {
             reset()
             enable enableSeparateBuildPerCPUArchitecture
             universalApk false  // If true, also generate a universal APK
-            include "armeabi-v7a", "x86"
+            include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
         }
     }
     buildTypes {
@@ -126,7 +127,7 @@ android {
         variant.outputs.each { output ->
             // For each separate APK per architecture, set a unique version code as described here:
             // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
-            def versionCodes = ["armeabi-v7a":1, "x86":2]
+            def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3, "x86_64": 4]
             def abi = output.getFilter(OutputFile.ABI)
             if (abi != null) {  // null for the universal-debug, universal-release variants
                 output.versionCodeOverride =
```

---

# Step4 ビルドして確認

Step2で行ったようにAPK Analyzer を使用して下記の画像のように32ビットアーキテクチャに対して、対応する64ビットアーキテクチャがあればOKです。


**x86**(lib/x86_64が追加された)
![スクリーンショット 2019-05-28 18.25.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204698/6866f9b3-ba71-2762-25f2-a8e54268c188.png)


**ARM**(lib/arm64-v8aが追加された)
![スクリーンショット 2019-05-28 18.25.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204698/809ff8f2-77e5-075c-7617-bc4340eed3d6.png)

あとは64bitに対応しているデバイスで動作検証を行っていきます。下記ように64bitライブラリのみ使用するアプリをインストールしてください。

```
$ adb install --abi arm64-v8a PATH/TO/YOUR/APK.apk
```

あとはテストしていきましょう！幸運を祈る！