CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Surface Duo エミュレータの環境構築とUnityのサンプルアプリを実行する方法


2020/8/12 21:10追記

この記事を書いた数時間後、MicrosoftよりSurface Duoについて発表がありました。

techcommunity.microsoft.com

この記事によると、$1399で9/10より販売開始、MDM、Enterprise、Surface Duo experience for employees and protect work dataなどの用語があることから、この発表では民生向けではなく企業向けの販売を意識しているようにみえます。 (民生向け販売をするかは記事からはわからず)

あと、US Onlyなのか、そうでないかも読み取れませんでした。

日本で発売されたら試したいなと思いますが、もう少し状況みてからですね。


Surface Duoというタブレットが近日発売されるという噂があります。

www.itmedia.co.jp

元々は発売は2020年のホリデーシーズン (冬頃?)と言われていましたが、どうやら早くなる可能性があるらしいです。

そこで、Surface Duo のアプリ開発方法を調べてみました。元がAndroidなので開発方法はいろいろありますが、今回は一部がUnityに対応しているのを見つけたので、Unityで開発する方法を調べてみました。

これは2020/8/12時点に試したPreview版の試行結果です。今後Surface Duoの開発方針変化があった場合、ここに書かれている内容ではできない可能性があります。あらかじめご了承ください

試した環境

MacOS X 10.15.6
Android Studio 3.6.3

Windows10、Linux (Ubuntu、Debian)でも実行できるようですが、この記事では省略します。

1. Surface Duoとは?

2画面のAndroidタブレットです。公式サイトではプロモーションムービーで紹介されています。

www.microsoft.com

当然ながら現時点では実機がないですが、エミュレータは公開されており、それを使うことで最低限の動きは確認できます。

2. Surface Duoのエミュレータ環境構築方法

Microsoft が詳細なドキュメントを後悔しています。こちらにあります。

英語版
Get the Surface Duo SDK - Dual-screen | Microsoft Docs

日本語版
Surface Duo SDK を入手する - Dual-screen | Microsoft Docs

エミュレータを起動させるまでの大まかな手順は以下の通りです。

(1) Android Studioをインストール
(2) Android StudioのSDK Managerを使って必要なツールをインストール
(3) Surface Duo SDKをダウンロード
(4) ダウンロードしたファイルを解凍し、中にあるrun.shを実行→Surface Duo エミュレータが起動する

2.1 Android Studioをインストール

インストール方法は色々紹介されているのでとくに説明不要と思いますが、以下の公式リンクよりインストーラをダウンロードし、画面の指示にしたがってインストールします。

Install Android Studio  |  Android Developers

2.2 Android StudioのSDK Managerを使って必要なツールをインストール

Surface Duo SDK プレビューの前提条件
SDK マネージャーを使用して、必要なすべての開発ツール (Android SDK Build-Tools、Android SDK Platform-Tools、Android Emulator) を確実に最新の状態にします。

引用元:Surface Duo SDK を入手する - Dual-screen | Microsoft Docs

これは、以下の赤枠にチェックをつけてインストールします。Android StudioのSDK Managerを起動して、SDK Platforms、SDK Toolsを選択し、それぞれチェックをつけます。

SDK Platforms and SDK Tools settings on Android Studio

2.3 Surface Duo SDKをダウンロード

以下のURLにアクセスし、"Download"ボタンを選択します。

Download Surface Duo SDK Preview Release from Official Microsoft Download Center

SDK lists of Surface Duo

今回はMacを選択しました。

2.4 ダウンロードしたファイルを解凍し、中にあるrun.shを実行

dmgを実行すると、中身がマウントされます。 (Windows10の場合、exeを実行して自己解凍されるはず)

中には、"com.microsoft.device.display.displaymask.jar"、"SurfaceDuoEmulator_2020.710.3"(フォルダ)が入っています。階層構造をそのままにして、この2つを任意の場所にコピーします。

ターミナルを開き、以下のように実行します。以下はDesktopにコピーした場合です。

$ pwd  
/Users/username/Desktop/SurfaceDuoEmulator_2020.710.3
$ ./run.sh  

これにより、Surface Duo エミュレータが起動します。

Surface Emulator preview at 13th Aug.2020

私が調べた限りでは、エミュレータはここから起動するしかなく、ターミナルを終了させると消えます。

3. Surface Duo向けアプリについて

アプリにはいくつかの画面パターンがあります。こちらの画像の通りです。

20200812162703

引用元:Android アプリを Surface Duo に対応させる - Dual-screen | Microsoft Docs

このドキュメントをみると、Extended Canvas (拡張キャンバス)からCompanion Pane (コンパニオンペイン)まで、簡単な説明とサンプルコードのGitHubリンクがあります。

それぞれ、Java、Kotlin、Xamarinの3種類のコードが準備されています。 (全部確認したわけではないので、一部は準備されていない可能性があります)

この中で、Dual View (デュアルビュー)だけは、Unity、Flutter、React Nativeのサンプルコードのリンクが書かれています。たとえば以下URLのReadmeには、それぞれのリンクが提供されています。

github.com

今回はこの中からUnityのサンプルを使ってみます。

4. Unity向けのSurface Duoサンプルコードを確認する

以下のGitHubからクローン (またはzipダウンロード)します。

github.com

この中には、duo-android-plugin、duo-screenhelperという2つのフォルダがあります。前者はヒンジ部分のセンサー値をUnityで使うためのネイティブプラグイン用のAndroid Studioプロジェクトです。後者はUnityプロジェクトです。
エミュレータを起動させるだけならば後者だけで問題なかったので、Unity側を説明します。

Readmeによると、Unity2018.f1が必要とあるので、該当するバージョンを準備します。

Unityでduo-screenhelperフォルダを開き、Android用のビルド設定をします。ここは情報が多数あるので省略します。特別なことはありませんでした。
ただし、Build Setting / Other Settings / IdentificationのMinimum API Level、Target API LevelをAPI Level29にしておきます。Microsoft DocsではAPI Level30のようにすると読めましたが、30にしておくと、apkをエミュレータにインストールするときにエラーが出て失敗しました。

$ adb install surfaceduo-test.apk
Performing Streamed Install
adb: failed to install sfdu.apk: Failure [INSTALL_FAILED_OLDER_SDK: Failed parse during installPackageLI: /data/app/vmdl416041757.tmp/base.apk (at Binary XML file line #8): Requires newer sdk version #30 (current version is #29)]

UnityでBuildすると、指定した場所にapkが生成されます。Surface Duoエミュレータが起動したままだと、"emulator-5578"デバイスとして認識されています。

$ adb devices
List of devices attached
emulator-5578   device

エミュレータにapkをインストールするには2つの方法があります。

(1) adb installコマンドを使う

エミュレータが起動している状態で以下を実行 (Unityでtest.apkを生成した場合)

$ adb install test.apk
Performing Streamed Install
Success

(2) Unity側でRun DeviceをSurface Duo Emulatorに指定し、Build and Runを実行する

Run Deviceの場所は以下の通りです。

Run Device settings on Unity2018

インストール後、エミュレータからDuoSampleというアプリを実行すると、画面サイズを取得した結果が表示されます。

Dev sample unity app on Surface Duo emulator

ちなみに、この章のはじめに紹介したduo-android-pluginというAndroid Studioプロジェクトを実行して生成されたaarをAssets/Plugiins/Androidに入れると、HingeSensorの値を取れるようになります。アプリが起動したときの表示が変わります。(実機でないとはっきりした違いが分かりませんが、、)

Hinge sensor plugin on Surface duo

GitHubのReadmeにはこのように書いてあります。

This Android library project emits SurfaceDuoHingeSensorPlugin.jar in the /library/release/ directory.

引用元:surface-duo-sdk-unity-samples/duo-android-plugin at master · microsoft/surface-duo-sdk-unity-samples · GitHub

しかし、実際はSurfaceDuoHingeSensorPlugin.jarというものは生成されず、duo-android-plugin/library/build/outputs/aar/library-release.aarを使うことでうまくいきました。

5. ホッケーゲームのサンプルコードを試してみる

さらに探してみると、Surface duo向けにUnityで作ったゲームサンプルもありました。

github.com

ただ、GitHubのReadmeの画像ではきちんと表示されているのに、実際にエミュレータで実行させてみるとなぜかDual Screenになりませんでした。

Pong game sample for Surface Duo

dual screenにならないのはUnityのサンプルコードでも同様だったので、何か設定が足りないのかもしれません。

6. おわりに

最低限ですが、Surface Duoについてまとめてみました。実機を購入できたら、もう少し調べてみたいと思います。