次の方法で共有


Arm サポートを Windows アプリに追加する

アームベースのデバイスは、電力倹約性、バッテリー寿命の延長、印象的な処理能力により、ますます人気が高まっています。 Windows on Arm では、ますます人気が高まる AI ワークロードと Machine Learning ワークロード用に調整されたニューラル処理ユニット (NPU) がサポートされています。

このガイドでは、Arm64 プロセッサを搭載したデバイス用の Windows アプリにサポートを追加する手順について説明します。 また、Arm64 ベースのバージョンのアプリの作成に干渉する可能性がある、サードパーティの依存関係やプラグインなどの潜在的な問題や阻害要因に対処する方法に関するガイダンスも提供します。

x86 または x64 Windows アプリ用の Arm ベースデバイスでのエミュレーション

Windows 10 の Arm バージョンには、既存の変更されていない x86 アプリを Arm デバイスで実行できるようにするエミュレーション テクノロジが含まれています。 Windows 11 では、そのエミュレーションが拡張され、Arm 搭載デバイスで変更されていない x64 Windows アプリが実行されます。

Arm デバイスで x64 と x86 をエミュレートする機能は大きな前進ですが、このガイドは Arm ネイティブ サポートを追加するのに役立ちます。これにより、アプリでネイティブパフォーマンスの向上と Arm64 搭載デバイスの固有の特性を活用できます。これには、次のものが含まれます。

  • アプリの消費電力を最適化して、デバイスのバッテリ寿命を延ばします。
  • CPU、GPU、および NPU のパフォーマンスを最適化してワークフローを高速化する (特に AI を使用する場合)。

さらに、 カーネル ドライバー はネイティブ Arm64 としてビルドする必要があります。 カーネルにはエミュレーションは含まれません。 この制限は、主に仮想化シナリオに影響します。 ユーザー モードではなく、カーネル モードで実行されている OS またはハードウェアの内部への直接アクセスを必要とするデバイス ドライバーを使用し、まだ Arm64 プロセッサをサポートするように更新されていないアプリについては、「WDK を使用した Arm64 ドライバーのビルド」を参照してください。

プログレッシブ Web アプリ (PWA) は、既にネイティブ Arm64 パフォーマンスで実行されています。

[前提条件]

Arm ベースのデバイス (ネイティブ コンパイル - 実行しているのと同じプラットフォームのコードを生成する) を使用してアプリを更新する場合は、次を使用できます。

  • Visual Studio 17.10 – Preview 1 の概要 (2024 年 2 月)

  • Visual Studio 2022 v17.4 以降 これは、Arm ベースのプロセッサでの Arm64 アプリのビルドとデバッグをネイティブにサポートする Visual Studio の最初の GA リリースです。 Visual Studio 2022 17.4 と Microsoft Visual C++ (MSVC) ネイティブ Arm64 の両方のバージョンは、以前のエミュレートされたバージョンと比較して大幅に優れたパフォーマンスを提供します。

  • (オプション) LLVM (Clang) バージョン12以上 またはそれ以降。 LLVM 12 は、Clang コンパイラ、LLD リンカー、コンパイラ rt ランタイム ライブラリなど、Arm64 上の Windows でホストされている公式バイナリ リリースを追加します。

x64 または x86 Intel ベースのデバイス (クロス コンパイル) を使用して Arm をサポートするように Windows アプリを更新する場合は、次を使用できます。

使用可能なハードウェアやテスト実行のシンプルさなど、クロス コンパイルまたはネイティブ コンパイルのいずれかを選択する場合は、いくつかの要因を考慮してください。

GCC 、GNU コンパイラ コレクション サポートは近い将来を対象とします。

Arm64 ネイティブ サポートを追加する手順

Arm64 デバイスでネイティブに実行するようにアプリを更新するには:

  1. Visual Studio で Arm64 構成をプロジェクトに追加する
  2. 新しくビルドされた Arm64 アプリのテストとデバッグ
  3. Arm デバイスでアプリをビルドしてテスト

アプリが Arm デバイス用に最適化されていることを確認した後:

  1. インストーラーを更新し、更新したアプリを発行
  2. 継続的な更新プログラムの計画

手順 1 - Visual Studio で Arm64 構成をプロジェクトに追加する

デバッグ ターゲットとリリース ターゲットを含む新しい ARM64 ソリューション プラットフォームを既存の x64 または x86 アプリ プロジェクトに追加するには:

  1. Visual Studio でソリューション (プロジェクト コード) を開きます (サポートされているバージョンの前提条件 参照)。
  2. 標準ツール バーの [ソリューション プラットフォーム] ドロップダウン メニュー (または [ビルド] メニュー) で、Configuration Manager 選択します。..
  3. [Active solution platform]\(アクティブ なソリューション プラットフォーム\) ドロップダウン メニューを開き、[ <新規...>を選択します。
  4. [Type or select the new platform]\(新しいプラットフォームを入力または選択する\) ドロップダウン メニューで、ARM64 選択し、[Create new project platforms]\(新しいプロジェクト プラットフォームの作成\) チェックボックスが有効になっている [Copy settings from]\(設定のコピー元\) の値が [x64 に設定されていることを確認してから、[OK]選択します。

おめでとうございます! Arm サポートのアプリへの追加を開始しました。 次に、Arm64 ソリューションが正常にビルドされたかどうかを確認します。

ソリューションが正常にビルドされない場合は、ビルドの失敗の原因となっている問題を解決する必要があります。 最も可能性の高い理由は、依存関係が ARM64 で使用できないということです。これは、以下の トラブルシューティング で説明します。

(省略可能): アプリ バイナリが Arm64 用にビルドされていることを確認するには、PowerShell でプロジェクト ディレクトリを開きます (Visual Studio ソリューション エクスプローラーでアプリ プロジェクトを右クリックし、[ ターミナルで開く] を選択します)。 プロジェクトの新しい bin\ARM64\Debug またはリリース ディレクトリが選択されるようにディレクトリを変更します。 dumpbin /headers .\<appname>.exe コマンドを入力します (<appname> はアプリの名前に置き換えます)。 ターミナルの出力結果を上にスクロールして FILE HEADER VALUES セクションを見つけ、最初の行が AA64 machine (ARM64)されていることを確認します。

手順 2 - 新しくビルドされた Arm64 アプリをテストしてデバッグする

Visual Studio で Arm64 ソリューション プラットフォームをプロジェクトに追加した後、Arm64 ソリューションが正常にビルドされたかどうかを確認するには:

  1. [アクティブ なソリューション プラットフォーム] ウィンドウを閉じます。
  2. ビルド設定を Debug から Releaseに変更します。
  3. [ ビルド ] ドロップダウン メニューで、[ソリューションの リビルド ] を選択し、プロジェクトのリビルドを待ちます。
  4. すべて再構築が成功しました という出力を受け取ります。 そうでない場合は、「トラブルシューティング」セクション 参照してください。

Arm64 をサポートするためにアプリ用にバイナリがビルドされたら、それらをテストします。 このテストでは、デバイスまたは仮想マシンが Arm 上で Windows を実行している必要があります。

Arm デバイス上の Windows で開発している場合は、Visual Studio のローカル デバッグを使用して簡単にセットアップできます。 (Arm プロセッサで実行されていないデバイスを使用して) クロスコンパイルする場合は、Arm デバイス上の Windows または仮想マシンでリモート デバッグを使用して、別のデバイスで Arm64 アプリを実行しているときに Visual Studio で開発エクスペリエンスを有効にする必要があります。

テストに使用できる Arm ハードウェアまたは仮想マシン上の Windows

継続的インテグレーション (CI) とテストに使用するハードウェアを探している場合は、Arm64 ベースのプロセッサを搭載した Windows デバイスの一部を次に示します。

CI とテストをサポートするために、Arm 上で Windows を実行する仮想マシン (VM) のセットアップについては、「 クイック スタート: Azure portal で Arm 仮想マシン上に Windows を作成する」を参照してください。

手順 3 - Arm デバイスでアプリをビルドしてテストする

テスト自動化パスの追加は、継続的インテグレーションと継続的デリバリー (CI/CD) 戦略の重要な考慮事項です。 Windows で実行されている Arm64 ソリューションの場合は、Arm64 アーキテクチャでテスト スイートを実行することが重要です。 このアーキテクチャは、前述の Arm デバイスの 1 つ、または前に示した VM の仮想マシンを使用して、Arm ハードウェア上の実際の Windows である可能性があります。

テストと同じコンピューターで実行すると、アプリのコンパイルが便利になりますが、多くの場合は必要ありません。 代わりに、既存のビルド インフラストラクチャを拡張して、Arm64 のクロスコンパイル出力を生成することを検討できます。

手順 4 - インストーラーを更新し、更新したアプリを発行する

Microsoft Store に発行する場合は、前の手順に従って Arm64 バージョンのアプリをビルドしたら、 パートナー センター ダッシュボード にアクセスし、新しくビルドされた ARM64 バイナリを申請に追加することで、Microsoft Store の既存のアプリ パッケージを更新できます。

Microsoft Store でアプリをまだ発行していない場合は、手順に従って、MSI または EXE、MSIX パッケージ、PWA、またはアプリ アドオンのどちらを送信するかに基づいてアプリ の申請を作成 できます。

独自のインストーラーをビルドする場合は、新しい Arm64 バージョンを正常にインストールできることを確認する必要があります。 WiXSquirrelInnoSetupInstallAwareなど、ほとんどのインストーラー フレームワークは、問題なく Windows on Arm をサポートします。

Web ページからアプリのインストーラーを提供する場合は、User-Agent クライアント ヒント を使用して、顧客がいつ Arm デバイス上の Windows からアクセスするかを検出し、更新された Arm ネイティブ バージョンのアプリを提供できます。 ユーザー エージェント文字列とは異なり、User-Agent クライアント ヒントを使用すると、Arm の顧客と x86 デバイスの顧客を区別できます。

手順 5 - 進行中の更新プログラムを計画する

アプリの Arm64 バージョンを発行したら、アプリの他のバージョンと同じ方法で更新された状態を維持する必要があります。 将来、お客様の混乱を避けるために、バージョンと機能をアーキテクチャ間で調整します。

トラブルシューティング

既存の x64 または x86 Windows アプリの Arm64 バージョンの追加を妨げる、または追加できないようにする一般的な問題は次のとおりです。

ARM64 用にコンパイルされていない依存関係によって、ビルドが成功するのを妨げている

依存関係が原因でアプリをビルドできない場合は、内部、サード パーティ、またはオープンソース ライブラリから、ARM64 アーキテクチャをサポートするようにその依存関係を更新するか、削除する必要があります。

  • 内部依存関係の場合は、ARM64 サポートの依存関係を再構築します。

  • サード パーティの依存関係の場合は、ARM64 サポートを使用して依存関係を再構築するようにメンテナーに要求します。

  • オープン ソースの依存関係については、 vcpkg を調べて、更新先の ARM64 サポートが新しいバージョンの依存関係に含まれているかどうかを確認します。 更新プログラムが存在しない場合は、ARM64 サポートをパッケージに追加することを検討してください。 多くのオープン ソースの保守担当者は、この貢献を高く評価しています。

  • Linaro 組織は、企業やオープン ソース コミュニティと連携して、Arm ベースのテクノロジに基づくソフトウェアを開発しています。 Linaro サービス デスクにリクエストを 提出して、Windows on Arm に関連する不足する依存関係に対するパッケージサポート を更新するために支援を依頼できます。

  • Arm64EC を使用します。 Arm64EC バージョンの依存関係は、x64 バージョンの依存関係を引き続き利用しながら、アプリケーションを再構築するために使用できます。 Arm64EC プロセス内の依存関係からのコードを含む x64 コードは、アプリのエミュレーションで実行されます。 (この場合、Arm64 バージョンの依存関係は使用できません)。

  • アプリ プロジェクトへの依存関係を削除して置き換えます。

コードは、Arm64 以外の特定のアーキテクチャ用に記述されています

  • ARM CPU で使用可能な命令と関数に一致するように、CPU 固有のアセンブリまたはインライン組み込み関数呼び出しを変更する必要があります。 ガイダンスについては、「C または C++ コードでのアセンブリと組み込みの使用の 」を参照してください。

アプリがカーネル ドライバーに依存している

カーネル ドライバー は、ネイティブ Arm64 としてビルドする必要があります。 カーネルはエミュレーションを提供しません。 この制限は、主に仮想化シナリオに影響します。 (ユーザー モードではなく) カーネル モードで実行されている OS またはハードウェアの内部に直接アクセスする必要があるデバイス ドライバーを使用し、まだ Arm64 プロセッサをサポートするように更新されていないアプリについては、「WDK を使用した Arm64 ドライバーのビルド」を参照してください。

さらに、 Windows 上のドライバー は Arm64 としてビルドする必要があり、エミュレートすることはできません。 Arm64 プロセッサをサポートするようにまだ更新されていないソフトウェア ドライバーに依存するアプリについては、「 WDK を使用した Arm64 ドライバーのビルド」を参照してください。

Arm 上の Windows 用ツールチェーン

このガイドの「の前提条件」セクションで共有されている Visual Studio と LLVM (CLANG) のサポートに加えて、Arm64 では次のツールとフレームワークもサポートされています。

サードパーティのフレームワークと同様に、次の機能が含まれます。

サポートが必要ですか? App Assure サービスを活用する

App Assure Arm Advisory Service は、開発者が Arm 最適化アプリを構築するのに役立ちます。 このサービスは、Microsoft の既存の約束に加えて、アプリは Windows on Arm で実行され、問題が発生した場合は Microsoft が修復を支援します。 詳細については、こちらを参照してください

Windows Arm Advisory Services にサインアップします。