iOS・tvOS・watchOS デバイスのアーキテクチャについてのまとめ

この記事は CAMPHOR- Advent Calendar 2015 の1日目の記事です.

iOS・tvOS・watchOS アプリを作成しビルドするにあたって, 命令セットアーキテクチャについて理解しておくことは, 適切なバイナリを出力することに役立ちます. また watchOS 2 以降等で対応が必須になっている Bitcode についての理解を深めることにも役立つかもしれません.

この記事では iOS・tvOS・watchOS デバイスのアーキテクチャについての様々な情報をまとめます.

アーキテクチャとは

この記事でのアーキテクチャとは主に CPU の命令セットアーキテクチャ (ISA) のことを指します. 命令セットアーキテクチャでは命令セット, レジスタ, アドレッシングモードなどが定義されています. ISA は CPU に物理的に実装されているので, OS をアップデートしても変わることはありません.

デバイスのアーキテクチャ一覧

iOS・watchOS ・tvOS デバイスで採用されているアーキテクチャの一覧を以下にまとめます. アーキテクチャ名は Apple が Xcode 等で用いている名称です.

アーキテクチャ名 32/64bit 採用しているデバイスの例
armv6 32bit iPhone, iPhone 3G
armv7 32bit iPhone 3GS 以降
armv7s 32bit iPhone 5 以降
arm64 64bit iPhone 5s 以降
armv7k 32bit Apple Watch
i386 32bit Simulator
x86_64 64bit Simulator

より詳細な CPU と命令セットの一覧は Wikipedia の Apple mobile application processors をご覧ください.

armv7 に対応したバイナリは armv7s や arm64 アーキテクチャの CPU でも動作します. (例: arm64 リリース以前にリリースされたアプリも, そのまま arm64 のデバイスで利用できる.) これは Apple の arm64 に対応した CPU が armv7 にも対応していることで実現できています.

i386 (IA-32) や x86_64 (AMD64 / Intel 64) アーキテクチャは Simulator での実行で利用されています.

Xcode での設定

どのアーキテクチャ向けにアプリをビルドするのかについての設定は Xcode の Build Settings で設定することができます. アーキテクチャに関係する設定は Architectures (ARCHS) と Valid Architectures (VALID_ARCHS) です.

Xcode Architectures

基本的にはデフォルトの設定で問題ありませんが, 標準設定には含まれないアーキテクチャ向けにビルドしたい場合や, 64bit アーキテクチャのみに対応したい場合は, 設定を変更する必要があります.

Architectures と Valid Architectures についてはそれぞれ Apple のドキュメントで以下のように説明されています.

Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies more than one architecture, the generated binary may contain object code for each of the specified architectures.

Space-separated list of identifiers. Specifies the architectures for which the binary may be built. During the build, this list is intersected with the value of ARCHS build setting; the resulting list specifies the architectures the binary can run on. If the resulting architecture list is empty, the target generates no binary.

実際に出力されるバイナリには Architectures と Valid Architectures の両方で指定されたものが出力されます.

出力されるバイナリ

複数のアーキテクチャに対応した場合, 1つのバイナリファイルの中に複数のアーキテクチャに対応したバイナリが含まれます. この iOS や OS X 等で利用されるバイナリの形式は Mach-O と呼ばれます.

Mach-O

バイナリファイルにどのアーキテクチャ向けのバイナリが含まれるかは file コマンドを使って簡単に確認することができます.

file command

複数のアーキテクチャに対応すると, その分だけバイナリファイルのサイズが増大してしまいます. (例: arm64 のみのバイナリのサイズ 2.4MB, armv7 と arm64 を含むバイナリのサイズ 4.9MB) この問題は次に説明する App Thinning で解決できるようになります.

Mach-O ファイルサイズ

App Thinning との関係

App Thinning は iOS・watchOS・tvOS アプリの配信を最適化する技術の総称です. アプリのサイズを小さくしたり, 各アーキテクチャに最適化されたアプリを配信できるようになり, ユーザー体験が向上します. 一方で開発者はこれまで以上にアーキテクチャや Bitcode 対応等について注意する必要があります.

Slicing

Slicing は App Thinning を構成する技術の一つで, App Store からアプリをダウンロードする際に, 使用するデバイスにあったバイナリやリソースのみを含むバイナリをダウンロードする技術です. iOS 9 以降と tvOS で対応しています.

例えば armv7, armv7s, arm64 の3つのアーキテクチャに対応したアプリを公開しているとします. このアプリを iPhone 6s を利用しているユーザーがダウンロードする場合, App Store は arm64 アーキテクチャのみを含むバイナリを配信します.

Slicing

Slicing の詳細については Apple のドキュメントを参照してください.

Bitcode

Bitcode も App Thinning を構成する技術の一つです. 従来は, 開発者が機械語にコンパイルしたバイナリを App Store で配信していました. Bitcode に対応した場合, 開発者は機械語の手前の Bitcode にコンパイルしたバイナリをアップロードし, Bitcode から機械語へのコンパイルは Apple が行います.

Bitcode

これにより新しいアーキテクチャが登場した場合も, Apple 側のみで対応することができるようになったり, 最適化技術が進んだ場合は Apple が再コンパイルすることでより最適化したバイナリを配信できるようになったりすることが考えられます.

Bitcode についての詳細は Apple のドキュメントや, 当ブログの Carthage と Bitcode 対応についてのまとめ をご覧ください.

どのアーキテクチャに対応するべきか

基本的には Xcode で Target を作成した時のデフォルト設定を使用すれば問題ないでしょう. Xcode 7.1.1 時点での各 OS のデフォルト設定をまとめます.

  • iOS: armv7, armv64 (Bitcode はデフォルトで有効化されているが無効化可能)
  • watchOS: armv7k (watchOS 2 以降は Bitcode 対応必須)
  • tvOS: arm64 (Bitcode 対応必須)

Bitcode については iOS ではオプションで, watchOS 2 以降と tvOS では必須です. (watchOS 1 で Bitcode 対応が必須ではないのは, watchOS 1 でのアプリは全て iOS デバイス上で動作しているため iOS の設定に準じているものと考えられます.) 今後 iOS でも Bitcode 対応が必須になることも考えられるため, iOS アプリでも早めに Bitcode 対応するのが良いでしょう.

64bit (arm64) 対応は 2015/6/1 以降必須となっています. Xcode で arm64 アーキテクチャ対応を含まないバイナリを生成することは可能ですが, これらは iTunes Connect にアップロードする際に Reject されるはずです.

また, 32bit 対応を行わず, 64bit のみに対応したアプリも配信できるようになりました. これは iOS 9 リリース以降可能になっています.

最後に

64bit アーキテクチャの登場や, Apple Watch 向けの armv7k アーキテクチャの登場, Bitcode 対応など, iOS・tvOS・watchOS デバイスのアーキテクチャに関わる状況は以前より複雑になっています. この記事がこれらの理解の助けになれば幸いです.

はじめにも書きましたが, この記事は “京都の IT 系学生のコミュニティー CAMPHOR-” のメンバーによる CAMPHOR- Advent Calendar 2015 の1日目の記事です. 明日以降の記事もお楽しみに.