Featured image of post Apple Silicon Macに移行する

Apple Silicon Macに移行する

M1 Macが発売されてもう1年以上が経ちます。最初は流石にRosettaがあるとはいえ、ネイティブアプリが少なく問題が起こったり性能が低下するケースも少なくなかったので、すぐにApple Silicon Macを購入しようとは思わなかったのです。それが今はネイティブアプリも増え、OSのアップデートもあったので十分移行しても良いタイミングになっている気がしました。そして今年、M1 ProとM1 Maxを搭載した新しいMacが発表され、既存のintelチップ搭載モデルと比べメリットが多いと思ったので購入を決めることになりました。

新しいMacについてはチップの性能という面でも、改善されたハードウェア(ディスプレイやスピーカ、キーボードなど)という面でもかなり良いものになっている印象はありますが、ここではあえてそれらについては述べません。多くのベンマークやレビューなどで明らかになっていることが多いと思いますので、ここではintel機からの移行経験に関して述べさせてください。

移行方法

まず、Apple Silicon Macに移行を決めてから、以下のような基準を立てました。

  • 既存のMacからマイグレーションする
  • なるべくネイティブアプリを使う

マイグレーションをすると決めた理由は、現在利用中のアプリの設定を最初から見直したくないものが多かったからです。アーキテクチャが違うのでマイグレーションを行わない方と比べ何か問題になる可能性もあるかと思いましたが、実際使用中の今までは特に問題はなかったので、最初から全てをやり直すということがめんどくさい場合はマイグレーションをしても良さそうです。

また、移行には「移行アシスタント」を使いました。この場合、選べる移行の方法は以下の通りです。

  • TimeMachine
  • Macから移行
    • Wi-Fiを使う
    • Thunderboltケーブルで接続

TimeMachineを使うと最新の状態が反映されないので、使っているMacから移行することにしました。また、データのコピーにかかる時間が最も短いというのでThunderboltで二つのMacを直結して移行を行なっています。移行には時間は思ったよりそう掛からなく、終わった直後の状態は既存のものと変わらなかったです。

移行後はApple Siliconネイティブアプリを使いたいので、アプリの情報を一つ一つ確認してUniversalではないものからバイナリを切り替えていくことにしました。

バイナリの確認

まずマイグレーションが終わった時点で、インストールされているアプリがApple Siliconネイティブであるかどうかを見分ける方法は以下があります。

  • Finderから「情報を見る」
  • アクティビティモニタの「種類」をみる
  • 「このMacについて」→「システムレポート」→「ソフトウェア」→「アプリケーション」から探す
  • Is Apple Silicon ready?から探してみる

他にもintell版のアプリの場合は最初実行時にRosettaをインストールするか確認するダイアログが出るのでそれで確認するという方法もあります。主にターミナルで使うプログラミング言語などがそうですね。ただ、一度でもRosettaをインストールしたらintell版のバイナリでもダイアログなしで実行されてしまうので、全体の移行が終わるまではRosettaをインストールしない方が良いかと思います。

アプリケーションの切り替え

以下はUniversal Binary(IntelとApple Siliconの両方に対応)を提供しているので、Intel機から移行した場合でも特に何もしなくて良いです。

一つ、Macs Fan Controlの場合、私はメニューバーにCPUの温度を表示するために使っているのですが、温度を表示する項目を選択する際にintell機だと「CPU PECI」を選べる方が一般的かなと思いますが、Apple Siliconだとそのような項目がありません。しばらく全体的な温度をみたところ、「CPU Performance Core」が最も温度が高いように見えたので、温度を確認したい場合はそれを選んでおいた方がいいかなと思います。

バイナリを切り替える必要があるケース

以下はApple Silicon用のバイナリを別途提供しているので、ホームページからダウンロードして既存のアプリを上書きするだけで対応できました。

ただ、DockerはデスクトップアプリそのものはApple Siliconネイティブを使うとしても、イメージがamd64のみ対応するというケースも多いので、ここは色々と検証が必要かなと思います。私の環境ではまだMySQL(5.7)がApple Siliconに対応してなかったのですが、特に問題なく動いています。

Homebrew

Rosettaを使って既存のintell版バイナリを使うこともできるらしいのですが、Apple Siliconに対応したバージョンはインストールされるパスが違うし(既存は/usr/local、Apple Silicon版は/opt/homebrew)、Apple Silicon版だとインストールされるパッケージは基本的にApple Siliconネイティブになるか、intell版でも新しくビルドしてくれるらしいので、使っていたintell版を消して新しくインストールし直すことにしました。

アンインストールとインストールは、別に何も意識する必要はありませんでした。公式ホームページに出ている通り、以下のコマンドを実行するだけで良いです。自動でintell版を消してくれて、新しくインストールする場合はApple Silicon版になります。

# アンインストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"

# インストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

ただ、homebrewでインストールしたパッケージ関しては自分の場合はとりあえず全部削除しておいて、後で必要になったらそれだけインストールしようという方針でしたが、以下のコマンドで使っていたパッケージのリストがバックアップできるらしいです。

/usr/local/homebrew/bin/brew bundle dump

開発環境

開発環境の構築に関しては色々なケースがあるので、こちらで別途説明します。

JetBrains IDE

JetBrains社の製品(+ Android Studio)ならToolboxで簡単に管理ができるのですが、このアプリ自体もApple Silicon対応のバイナリに変える必要があります。

ToolboxをApple Siliconネイティブに切り替えた後は、メニューからIDEをアンインストール後に再インストールするだけです。もしToolboxを使ってない場合は、使っているIDEのバイナリをダウンロードし直す必要があります。

ちなみに、ToolboxからインストールされるIDEは~/Applications/JetBrains Toolboxの配下にLauncherが置かれ、それをシステムレポートなどで確認するとintel版のバイナリになっています。ただ、実行時はちゃんとApple Siliconネイティブになっているので(アクティビティモニタから確認可能)安心してください。

Visual Studio Code

Visual Studio Codeの場合は、Universal/Intel/Apple Silicon用のバイナリを全部提供していました。多分あえてIntelバージョンをインストールしてなかったら、自然にUniversalにアップデートされていたのではないかと思います。

あえてUniversalを使う必要はなく、サイズが小さいのでApple Siliconバージョンをダウンロードしたほうがいいかなと思います。

また、最近はモブプロなどでVisual Studio Live Shareを使うケースが多いかなと思いますが、こちらはまだApple Siliconに対応していません。こちらはGitHubのissueで今後対応する予定だというので、当面は待つしかないですね。

Java

Javaの場合、intellだとどのベンダのものを選んでも大差ないですが、Apple Siliconだと少し話が変わってきます。なぜかというと、ベンダ別にApple Siliconに対応しているJDKのバージョンが違うからです。Rosettaを使っていない場合、「bad CPU type in executable」というエラーが発生するので、インストールされているバージョンが

各ベンダ別のApple Silicon対応済みのLTSバージョンのJDKの一覧は以下の通りです。

JDK対応バージョン
Amazon Corretto17
Azul Zulu1.8, 11, 17
Bellsoft Liberica1.8, 11, 17
Eclipse Temurin17
Microsoft17
Oracle Java SE17
SapMachine11, 17

上記のJDKのうち、一部はintellijでもダウンロードできるものとなっていて、intellij上ではApple Silicon対応バージョンをaarch64と表示していますのでインストール時は必ず確認しましょう。

他にもRed HatIBM Semeruなどがありますが、こちらの場合はApple Silicon用のJDKを提供していません。

最近はどのJDKを選んでも特に問題はないかと思いますので、17を選ぶならOracleのでも良いし、他も好みで選んでも良さそうな気がします。私の場合はずっとAdpotOpenJDKを使っていたので、今回もTemurinを選びました。ただ、Temurinだと11がApple Siliconに対応してないので、そこはZuluを選んでいます。インストールにはhomebrewを使いました。

Apple Siliconとは直接的な関係はないですが、以下のコマンドで使うJDKのバージョンを簡単に切り替えできるのでさまざまなベンダのJDKを使ってみるのもありかもですね。

export JAVA_HOME=`/usr/libexec/java_home -v 11`
$ java -version
openjdk version "11.0.13" 2021-10-19 LTS
OpenJDK Runtime Environment Zulu11.52+13-CA (build 11.0.13+8-LTS)
OpenJDK 64-Bit Server VM Zulu11.52+13-CA (build 11.0.13+8-LTS, mixed mode)
$ export JAVA_HOME=`/usr/libexec/java_home -v 17`
$ java -version                                  
openjdk version "17.0.1" 2021-10-19
OpenJDK Runtime Environment Temurin-17.0.1+12 (build 17.0.1+12)
OpenJDK 64-Bit Server VM Temurin-17.0.1+12 (build 17.0.1+12, mixed mode)

GraalVMの場合は、まだApple Siliconに対応していません。ただ2020年からGithubのissueがオープンの状態であって、Linux+aarch64に対応したバイナリは提供している状態なので、いずれはリリースされるかと思います。

Kotlin

Kotlinは1.5.30からApple Siliconサポートが発表されていますが、これはKotlin/Nativeに関するものなのでKotlin/JVMの場合だとJavaの方だけ気をつけたらいいと思います。こちらもhomebrewでインストールし、特に問題はありませんでした。

Gradle

Gradleの場合はv6.8.3を使うプロジェクトがあったので、Javaの設定が終わった後にビルドしてみると以下のようなエラーが出ました。(依存関係やプロジェクトの設定によってエラーの種類は変わる可能性があるかと思います)

Java 17で実行した場合

Java 17(Temurin)で実行した場合、Gradleそのものが実行時にエラーを吐きます。おそらくrefelction関係でdeprecatedになっていたAPIを使っているのが問題になったのではないかと思います。

> java.lang.IllegalAccessError: class org.gradle.internal.compiler.java.ClassNameCollector (in unnamed module @0x8f1317) cannot access class com.sun.tools.javac.code.Symbol$TypeSymbol (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.code to unnamed module @0x8f1317

Java 11で実行した場合

Java 11で実行するとコンパイルまでは行われるようですが、テスト(junit)の実行で以下のような問題が起こりました。

*** java.lang.instrument ASSERTION FAILED ***: "result" with message agent load/premain call failed at src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 422
FATAL ERROR in native method: processing of -javaagent failed, processJavaStart failed
Process 'Gradle Test Executor 1679' finished with non-zero exit value 134

調べてみると、Gradleはv6.9からApple Siliconに対応したようだったので、ラッパーを最新にバージョンアップ。gradle/wrapper/gradle-wrapper.propertiesのバージョン指定を変えるだけでも対応できますが、以下のコマンドを使っています。

./gradlew wrapper --gradle-version=7.3.1 --distribution-type=bin

いきなりv6.8.3からv7.3.1にアップデートしたのですが、テストまで正常終了しています。このプロジェクトはKotlin + Spring bootの構成なので、もし同じような構成のプロジェクトがあるとしたらJava/Kotlin/Gradleのバージョンアップをおこなってからアプリのビルドを試してみましょう。

Ruby / Python / Go

RubyとPythonに関してはmacOS上ですでにインストール済みの状態ですが、バージョンやプロジェクトの設定などによっては問題が起こる可能性もあるのでhomebrewでインストールしました。このブログで使っているjekyllはrubyをインストールし直したので同じくインストールし直す必要がありました。こちらもhomebrewでインストールができ、既存のプロジェクトにおいてはなんの問題もなく実行することができました。

Pythonの場合、既存のプロジェクトのパッケージを再インストールする必要がありました。でもrequirements.txtがあれば特に問題にはならないくらいです。

Goの場合も1.16からApple Siliconに対応しているので、特にバージョンの指定が必要なケースでなければ、homebrewで最新をインストールしても良いかなと思います。ただ、既存のプロジェクトのGOROOTやGOPATHの問題があるので、ホームページから別途ダウンロードして設定する必要のあるケースもあるかと思います。

Rosettaを使うしかないケース

多くのアプリがApple Siliconに対応してきましたが、バージョンアップそのものが終わったり、Rosettaを通じて問題なく動く(からApple Silicon対応は後回しにするという政策の)アプリに関してはネイティブのバイナリが存在しない場合もあるので、仕方なくRosettaを使うしかないかなと思います。

ソースコードをダウンロードして、ローカルでビルドするという方法もあるかと思いますが、使われているSwiftのバージョンが低い場合はXCodeですぐにビルドできない場合もあったりしました。いつかはRosettaのサボートも終わりそうなので、長期的な観点ではこのようなアプリは他のものに代替した方が良いかもしれません。

Mattermost

MattermostはSlackと似たようなコミュニケーションツールで、サーバにインストールすることで無料利用ができるしマークダウンのサポートが優秀だったりするのでプライペートでよく使っています。ただ残念なことに、こちらはまだApple Silicon用の正式リリース版がないようです。

正式リリースの予定はあるようなのでバージョンアップまでintell版を使うという選択肢もありますが、GitHubのリポジトリを見るとUniversalとApple Silicon用のバイナリのベータ版も存在しているので、どうしてもRosettaを使いたくない場合はこちらを選んでみても良いかもしれません。

KeyboardCleanTool

KeyboardCleanToolは、アプリを実行している間に全てのキー入力を無視するという単純なツールです。キーボードが汚れて拭きたいときによく使っていますね。残念ながらこちらもまだApple Siliconに対応していません。同じ会社で開発しているBetterTouchToolはUniversalバイナリで提供されていますが、その対応ができたのも11月のことなので他の製品が全部Apple Siliconに対応するにはかなり時間がかかるかもしれません。

このようなアプリは特にネイティブにならなくても困らないものなので、Apple Siliconネイティブ対応はかなり優先順位が低い感がありますね。

OneDrive

Microsoft社の製品にしてはかなり珍しいケースですが、対応が遅れていますね。ただ、今月PreviewとしてUniversalバージョンが利用できるようになったらしいので、もうすぐApple Siliconネイティブ版が出るかもしれません。その際にはApp Storeで自動的にアップデートされるはずなので、待つだけですね。

Flutter

Dartはv2.14からNative対応しているのですが、Flutterはまだ未対応らしく、公式を見てもRossettaを推奨しています。なのでRosettaを入れて実行した方が早いですね。

他に、flutter doctorを実行していくつか問題が出るケースがあるかと思います。そういう場合は以下の手順で対応できました。

  • cmdline-tools component is missingと出る場合
    • Android StudioからAppearance & Behavior -> System Settings -> Android SDK -> SDK Tools -> Android SDK Command-Line Toolsにチェックを入れる
  • CocoaPods installed but not workingと出る場合
    • brew install cocoapodsでインストール

最後に

移行が終わって本格的にApple Silicon Macを使ったのはまだ一週間経たないくらいの短い期間ですが、思ったより移行がスムーズで、ネイティブ対応済みのアプリも多かったので、M1が発表された直後の私のように互換性に疑問を持った方がいるとしたら(十分な事前調査を前提として)新しいMacに移行するのもありかも知れないと思います。

最初はAppleが公式的に全てのMacをApple Siliconに移行するまで2年という計画を立てたという話をしていましたが、ユーザとしてはより時間がかかるのではないかと思っていました。しかし、実際に触ってみると、今でも十分移行ができる状態になっていると思います。

では、また!

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy