[iOS・Android] Apple Silicon搭載 Macの環境構築トラップまとめ

Apple Silicon（M1 chip）を搭載したMac（以下 M1 Mac）に、iOS・Androidのアプリ開発環境を整備した際に遭遇したトラップをまとめます。

# 便利なコマンド

- `uname -m`
    - 実行中のシェルが、どのアーキテクチャで実行されているかを確認できる
- `arch -x86_64 実行したいコマンド`
    - x86_64アーキテクチャでコマンドを実行する（`arch -arch x86_64 実行したいコマンド`と同じ）
- `arch -arm64 実行したいコマンド`
    - arm64でコマンドを実行する（`arm64e`でも同じっぽい？）

# iOS・Android共通

## Homebrewを使うなら、インストール先は `/opt/homebrew` のままにしておく

M1 MacにHomebrewをインストールすると、`brew install`を実行した時の保存先は `/opt/homebrew/bin/*` になる。

なお、Rosetta 2を使用してシェルを実行している場合は、`/opt/homebrew`・`/usr/local`どちらにインストールするかを選択するプロンプトがあったはずだが、ここはデフォルト設定にしておく。

---

# iOS

## `rbenv`等は使わない、システムのRubyを使う

- `rbenv`を使うと、CocoaPodsを動作させることができない
    - システムのRubyを使用する
    - CocoaPodsが依存する`ffi`がarm64に対応していないことが原因
    - [M1 macでpod installができない。sudo gem install ffiをしても治らない(rbenvが原因)](https://qiita.com/0ba/items/7c1463a156cef7db67c4)

じきに対応するとは思うが……。

## CocoaPodsが動かない場合

- CocoaPodsが依存する`ffi`のバージョンが古い可能性がある
    - ターミナルアプリ（iTerm2なども）を、Rosetta 2で開くように設定する
    - `bundle update ffi`または`gem update ffi`を実行する
    - [M1 Macでpod installを実行する](https://zenn.dev/akeome/articles/2433d792db022835c7e7)

完全なApple Silicon環境は、まだ遠いようだ…。

## CocoaPodsで導入したライブラリが原因でシミュレータ向けビルドができない場合

これはM1 Macというよりは、Xcode 12なのかもしれないけど……。
いわゆる以下のエラーの問題。

```
building for iOS Simulator, but linking in object file built for iOS, for architecture arm64
```

Intelのときは発生しなかったのに、M1にしたら発生し始めるプロジェクトにも遭遇した。以下のリンクなどをよく参考にさせてもらって、どうにか対応した。

http://blog.be-style.jpn.com/article/187942746.html

https://llcc.hatenablog.com/entry/2020/10/06/122027

プロジェクトによっては、アプリのターゲット、もしくは、プロジェクト自体の方でも「Excluded Architectures」の設定をしないとビルドできないこともあった。

## Mintは`MINT_PATH`と`MINT_LINK_PATH`の変数を指定して実行する

`mint`実行前に `MINT_PATH` と `MINT_LINK_PATH` をセットしておく。このパスは、アクセス権限のあるディレクトリでなければならない。

上記変数を指定しない場合、`mint`でインストールするパッケージは、デフォルトの `/usr/local/lib/mint` にインストールしようとする。しかしBig Surでは（M1 Macでは？）、このディレクトリのオーナーがrootに変わっているため、インストールすることができなくなっている。

https://github.com/MakeAWishFoundation/SwiftyMocky/issues/279
https://github.com/yonaskolb/Mint/issues/188

対策として、上のリンクにあるように `/usr/local/lib/mint` のオーナーを変更する方法もあるが、あまり安全とは言えない。そのため、 `MINT_PATH`や`MINT_LINK_PATH`は、自身の管理できるディレクトリ（例えばプロジェクトのディレクトリ等）に置くのが良さそうだ。

```:例
$ MINT_PATH=${PROJECT_ROOT}/mint/lib MINT_LINK_PATH=${PROJECT_ROOT}/mint/bin `which mint` bootstrap --link
```

## Carthageは特に問題なく動いた

Carthageもなにかトラップがあるだろうと構えていたが、思いの外、問題なく通過できた。

## Fastlaneも特に問題なく動いた

今のところ大丈夫そう。

## Node.jsも問題なく動いた（条件付き）

僕が試したところだと、２つの問題がありそうだった。arm64への対応状況と、npmの挙動について。
なお今回は、`anyenv`経由で`nodenv`をインストールして動作を確認した。

### arm64への対応状況

最新版は対応できているようだが、バージョンによってはarm64に未対応。
ただし、ネイティブアプリ開発の場合は、依然としてRosetta 2を使うため、arm64への対応状況自体は大きな問題にはならなそうだ。

### npmの挙動

グローバルにインストールしたパッケージは動作問題なし。パスも通っていたし、直接コマンドを呼び出して実行することができた。
一方、ローカルにインストールしたものは、うまくパスが通らなかった。
`npm bin`をした際にパスは出るものの、コマンドを`npm exec`で呼ぶ必要があり、直接呼び出すことができなかった。
（anyenvやnodenvの設定の問題かもしれない……）

---

# Android

## インストール時、Intel向けのツールはインストールに失敗する

https://www.rk-k.com/archives/4121

標準インストールでなく、カスタムインストールを選ぶなら、
EmulatorやIntel HAXMのチェックを外すだけで良さそう。

![スクリーンショット 2021-06-01 12.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75329/91ad3f33-b883-29d6-dce7-4028671d6348.png)

## エミュレータはプレビュー版を使う

https://applech2.com/archives/20210407-avd-manager-can-download-apple-silicon-android-emulator.html

`arm-v8a`用のイメージがプレビューで公開されている。AVD Managerでエミュレータを新規で作成するときに、`arm64-v8a`用のイメージを選択できるようになっている。

![スクリーンショット 2021-06-01 16.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75329/516ba127-a743-b2b3-4290-820ad5f9eade.png)

一方で、このウィザードでダウンロードするイメージには、不具合があるRevisionだったりするので注意したい。
例えば、エミュレータを起動していてもオフラインとして検出され、Android Studioからアプリを転送できなかったりする。

https://medium.com/mobile-app-development-publication/m1-android-emulator-not-detected-workaround-c7718f08ba99

もしこのような現象に遭遇したら、いくつかの情報をあたって「動作する」と言われているRevisionのイメージを、手作業でインストールする方が、懸命なことがある。
具体的な方法については、以下のサイトを参考にして行う。

https://nobushiueshi.com/android-studiomac-m1apple-silicon%E3%81%A7android-emulator%E3%81%AEapi-level-30%E3%81%AEarm64-v8a%E3%81%8C%E3%81%AA%E3%81%84%E6%99%82%E3%81%AB%E8%A9%A6%E3%81%97%E3%81%9F%E6%96%B9%E6%B3%95/

イメージをダウンロードするサイトは、こちら。

https://androidsdkmanager.azurewebsites.net/GoogleAPIwithPlaystoreSystemImages

2021/07/19現在、ARM64-v8a向けには、Rev. 9のイメージがある。このRevisionでは、エミュレータがオフラインにならずにアプリをデバッグすることができた。

---

# M1 Macは、iOS開発でトラップが多い

Androidは比較的スムーズに環境構築ができたが、iOSについては、トラップがめちゃくちゃ多かった……。特に、Ruby周りとCocoaPods周りにトラップが多い。

とはいえ、M1 Macがリリースされてから半年以上になるので、このあたりのトラップに対する解決策はネット上にたくさんある。おかげで安心してM1に移行していけそうだ。

そういえば、これを読んでいる人の中には、OSSだけでなく外部ベンダーが開発したクローズドなライブラリを使っている人もいるだろう。そういったライブラリが引き金になってビルドできない場合もあるようなので、早めにM1 Macで検証しておくのが良いだろう……。