すべてAppleScriptで組んである、アプリケーションのバイナリアーキテクチャ判定ツール「Uni Detector」。
macOS 11上でCPUアーキテクチャのグラフ表示を行おうとするとクラッシュするという現象を横目に、さすがに開発環境として9年落ちのMacBook Pro Retina 2012が辛くなっていたので、M1 Mac miniに入れ替えてソースコードの改修に着手してみました。
M1 Native動作ほかOSのバグへの対処など
まずは、UniversalバイナリでビルドするようにXcode projectを設定。瞬殺。実機確認ができていないだけで、すでにUniversal Binary化については方法を確認してありました。「Check All」でアプリケーション情報を収集する際のパフォーマンスはIntelバイナリをRosetta 2上で実行したときよりは良好でした。
次に、CPUアーキテクチャのグラフ表示を修正。NSStringのstringWithFormat:メソッドを呼び出すと100%クラッシュするというバグをmacOS 11で仕込まれたことが発覚。同じ働きを行う「回避ルーチン」を作成。さっそく、Uni Detectorに組み込んでみました。
Universal Binary化したら、CPUアーキテクチャの移り変わりを表示したグラフ上の実行中のマシンアーキテクチャ表示インジケータの修正もOK。そして、OSバージョン番号の取得を修正して、現在実行中のOSインジケータも修正。
おおよそ、バージョンアップ前のIntel Mac用バイナリと同等の動作を行うレベルになりました。
ただし、全体的に動作が速くなったりはしません。CPUの速度が速くなっていたとしても、OSの内部機能の呼び出しがmacOS 10.15以降で遅くなっているとのこと。並列処理を行いにくいAppleScriptの処理において、M1 Mac上でアホみたいに速度向上することは(本アプリを試しに動かした感じでは)ありません。
M1 Mac各機種において、SSDへのアクセス速度は大幅に向上しているため(MacBook Pro Retina 2012比)、CPU速度の向上と合わせて大幅な速度向上があるはずでしたが、macOS 10.15以降のOS機能呼び出し(Scripting Bridge経由)が遅くなっており、全体として見るとプラスマイナス・ゼロといった印象。逆にmacOS 11+M1 MacとmacOS 10.14.6+Intel Macでは後者の方が高速という笑えない状況も見えてきました。
GUIアプリケーションの動作およびそれをAppleScriptから動かすやり方については、だいたい期待どおりの速度が出ている感じです。
# その後、macOS 12でAppleScriptの処理速度が回復&向上したことで、M1 Mac上で大幅に実行速度が向上しました
M1対応の「その次」へ
M1対応、macOS 11対応などを行い、Appleが新たに作ったメーカー謹製のありがたーーいバグを回避したあとで、実際に1ユーザーとして使ってみるといろいろ感じることがあります。
macOS 11+M1 MacではiOSのアプリケーションをApp Storeからダウンロードでき、実際にiOSアプリケーションが、macOSアプリケーションと一緒に/Applicationsフォルダに入ります。
iOSアプリも、Zip圧縮されたipa形式ではなく、展開された状態でFinderに表示されます。Finder上に並んでいる様子を見るかぎりではMacアプリケーションと違和感がありません。
ひるがえってUniDetector上に表示されるiOSアプリケーションたち。カテゴリ情報がInfo.plist内に書かれていない(メタデータは別管理)ため、空欄になっています。
また、iOSアプリのカテゴリとMacアプリケーションのカテゴリの整合性も調整する必要があります。サポートする最小限のOSの情報などもiOSのものを表示する必要があることでしょう。
→ iOSアプリのジャンル判定を行う処理を書いて、スクリプトエディタ上では動作しているのですが、Xcode上のCocoa-AppleScriptアプリケーションに組み込むと、Sandboxの制限により機能しませんでした。残念!
macOS 11.0, Big Sur AppleScript関連の変更点 – AppleScriptの穴 says:
[…] NSString’s StringWithFormat:をmacOS 11で実行すると100%クラッシュ macOS 11、NSSortDescriptorでNSArrayを作ると100%クラッシュ […]