20260916_AndroidXR-JetpackXRSDK

-- Views

September 16, 26

スライド概要

【大阪-オンライン開催】XRミーティング 2026/09/16 #Xグラス #XRMTG ( https://osaka-driven-dev.connpass.com/event/404335/ )登壇資料。
Anddoid XR用のコンテンツ開発方法の1つであるJetpack XR SDKを使うための環境、簡単な最初のアプリの開発について調査した内容を共有しました。

profile-image

Microsoft MVP for Microsoft Foundry, M365 XRやAIについての開発技術の調査、開発などを行っています。 また、大阪駆動開発コミュニティ所属しており、日々の調査で得た知見はコミュニティを通して情報発信を行っています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

Jetpack XR SDK で Android XR アプリを作ってみた Unity なしで空間パネルを出すまで — 環境構築 / 実装 / エミュレータ確認 @takabrz1 Takahiro Miyaura

2.

宮浦 恭弘 (Miyaura Takahiro) Microsoft MVP for M365,Microsoft Foundry 大阪駆動開発コミュニティに生息 HoloLens 日本販売してからxR 系技術に取組む( 過去Mixed Reality 領域でMicrosoft MVP 新しい技術や、XR関連の技術を調べたり、体験して日々技術を満喫 技術Tips : https://qiita.com/miyaura https://zenn.dev/miyaura 最近興味があって取り組んでいるもの ○ AndroidXR ○ 新しいガジェット(Even G2,MiRZA,Galaxy ○ Microsoft Foundry などのAI 技術 @takabrz1 ※よかったらこれを機にお知り合いになってください XR,etc …) 受賞)

3.

今日話すこと Jetpack XR 1.0.0 - beta02 / Compose for XR 1.0.0 ※ Jetpack XR - alpha17 を触ってみた記録 とは何か — SDK の構成と Home / Full Space ※ Unity と何が違うのか — 書き方・資産・3D の自由度 ※ 環境構築 — バージョンの罠と Gradle まわり ※ 最初の空間パネル — Subspace + SpatialPanel ※ エミュレータでどこまで確認できるか 2026/09/16 © 2026 Takahiro Miyaura 3

4.

なぜ、この話になったのか あれですよあれ 2026/09/16 © 2026 Takahiro Miyaura 4

5.

もうすぐ AURA が来るのでAndroid XRの話 XREAL AURA がもうすぐ来る。 (きますよね秋って言ってたし) だから Galaxy XR で素振りしていた 2026/09/16 © 2026 Takahiro Miyaura 5

6.

1. Jetpack XR とは何か 2D の Compose が、そのまま空間に浮く 2026/09/16 © 2026 Takahiro Miyaura 6

7.

Android XR アプリの作り方は 3 つ ① Jetpack XR SDK ② WebXR ③ ゲームエンジン Kotlin / Compose TypeScript / Chrome Unity / Unreal / Godot ※ インストール不要で動く ※ hit - test ・平面検知が ※ ゼロから空間表現を作れる ※ 既存の 3D 資産が効く ※ Unreal と Godot は ※ 2D の Compose UI が そのまま空間パネルに ※ 3D は glTF を「置く」 ※ 今日の話はここ OpenXR 効く ※ 描画は Web の範囲 ②③ の土台。Android XR は 1.0 / 1.1 2026 - 05 に公式対応 とベンダ拡張に対応 「UI を空間に出す」なら ① / 「空間そのものを作る」なら ③ 2026/09/16 © 2026 Takahiro Miyaura 7

8.

前提:Jetpack Compose とは Android の宣言的 UI ツールキット 最小の Compose 画面 ※ UI を Kotlin で書く(XML の後継) ※ @Composable 関数がそのまま画面になる ※ 状態が変われば、その部分だけ描き直される ※ 継承ではなく、関数の組合せで画面を作る Unity 2026/09/16 でいう uGUI / UI Toolkit @Composable fun Counter() { var n by remember { mutableIntStateOf(0) } Column { Text(" タップ回数: $n") Button(onClick = { n++ }) { Text(" タップ") } } } にあたる。この関数がそのまま空間パネルの中身になる © 2026 Takahiro Miyaura 8

9.

Jetpack XR SDK の全体像 androidx.xr.compose androidx.xr.scenecore androidx.xr.arcore Compose を空間に置く 3D シーンを直接さわる 現実世界を認識する ※ Subspace ※ SpatialPanel ※ Orbiter ※ SubspaceModifier ※ GltfModelEntity ※ MeshEntity ※ SpatialEnvironment ※ SurfaceEntity ※ Plane / Anchor ※ Hand / Depth ※ hitTest() androidx.xr.runtime Session UI を空間に出すだけなら compose + runtime 2026/09/16 と Config を持つ土台 の 2 つで足りる © 2026 Takahiro Miyaura 9

10.

Home Space と Full Space Home Space Full Space ※ 2D ウィンドウが 1 枚浮く ※ アプリが空間を占有する ※ 普通の Android ※ パネルを複数枚、3D も自由に配置 アプリの姿 ※ 空間 UI は使えない ※ 空間 UI が使えるのはこのモードだけ ※ 起動時の既定はこちら ※ Manifest 実行中の切替は requestFullSpace() / requestHomeSpace() 2026/09/16 © 2026 Takahiro Miyaura で起動モードを指定 (suspend 関数) 10

11.

2. Unity と何が違うのか 同じ Galaxy XR 2026/09/16 でも、前提がまるごと違う © 2026 Takahiro Miyaura 11

12.

Unity と Jetpack XR — 同じ端末、別の作り方 Jetpack XR SDK + Compose 書き方 C# 画面をそのまま空間へ 資産 3D を置く(合成は SDK ) 3D 書き方 Kotlin 資産 2D 3D glTF Unity / OpenXR ビルド gradlew と adb で完結 2026/09/16 描画の自由度は最大 苦手 OS 。入口が「Android エディタ アセット・シェーダ ビルド Extension 苦手 描画の作り込み 出す先は同じ Galaxy XR + Unity のタグ固定が要る 標準の部品・IME アプリ」か「3D 体験」かで分かれる © 2026 Takahiro Miyaura 12

13.

どちらを選ぶか 既存アプリの延長か、体験そのものを作るか 既存の Android / Compose アプリを空間に出したい 空間そのものの体験・3D 表現をゼロから作りたい Unity 実機が無い。まず触って感触をつかみたい 迷ったらパネルから始めて、足りなくなったら Unity 2026/09/16 Jetpack XR Jetpack XR へ移る © 2026 Takahiro Miyaura 13

14.

3. 環境構築 詰まるのはコードより手前、バージョンと JDK 2026/09/16 © 2026 Takahiro Miyaura 14

15.

必要なもの(2026-09 時点) そろえるもの 先に踏む地雷 Android Studio Quail 4 (2026.1.4 )で確認 JDK 17 compileSdk / minSdk AGP 9.2.0 ※ 同梱 JBR は 21 。JDK 17 別に用意する 37 / 34 = Android Gradle Plugin Gradle 9.4.1 Kotlin 2.4.10 AVD XR Headset は対応版より新しい AGP のプロジェクトを開けない ※ Studio を に kotlin.android は不要(足すと失敗) ※ AGP 9 以上 + google - xr API 34 ※ sdk.dir はスラッシュ区切り ここを踏むと「コードを書く前」で半日溶ける 2026/09/16 © 2026 Takahiro Miyaura 15

16.

バージョンの罠 — compose だけ遅れている 最新版はこうなっている ところが compose の POM は runtime / scenecore / arcore → <artifactId>runtime</artifactId> <version>1.0.0 - beta02</version> <artifactId>scenecore</artifactId> <version>1.0.0 - beta02</version> 1.0.0 - rc01 compose / material3 → 1.0.0 - alpha17 ※ Compose for XR を使う限り、素の状態では beta02 が入る ※ この検証は runtime / scenecore / arcore = beta02 、compose = alpha17 ※ カタログを xrCore と xrCompose の 2 系統に分け、切替を 1 行で済むようにする 2026/09/16 © 2026 Takahiro Miyaura で固定 16

17.
[beta]
バージョンカタログと build.gradle.kts
AGP は Android Studio

の対応版に合わせる(Studio

gradle/libs.versions.toml
[versions]
agp
= "9.2.0"
kotlin = "2.4.10"
xrCore = "1.0.0
- beta02"
xrCompose = "1.0.0
- alpha17"
[libraries]
xr - runtime = { module =
"androidx.xr.runtime:runtime",
version.ref = "xrCore" }
xr - compose = { module =
"androidx.xr.
compose: compose",
version.ref = "xrCompose" }

2026/09/16

より新しい AGP は開けない)

hello - panel/build.gradle.kts
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.compose)
}
android {
compileSdk = 37
defaultConfig { minSdk = 34 }
}
java { toolchain {
languageVersion =
JavaLanguageVersion.of(17) } }
dependencies {
implementation(libs.xr.runtime)
implementation(libs.xr.compose) }

© 2026 Takahiro Miyaura

17

18.

AndroidManifest — 起動モードを決める HOME_SPACE AndroidManifest.xml 2D ウィンドウで起動(既定) <uses - feature android:name="android.software.xr.api.spatial" android:required="false" /> FULL_SPACE_MANAGED Full Space <property android:name="android.window. PROPERTY_XR_ACTIVITY_START_MODE" android:value="XR_ACTIVITY_START_MODE_ FULL_SPACE_MANAGED" /> 既定は HOME_SPACE。Full Space required="false" 2026/09/16 。配置は SDK 任せ FULL_SPACE_UNMANAGED Full Space 。配置も自分で で出したいなら MANAGED を明示する にしておけばスマホ・タブレットにも入り、普通の 2D アプリとして動く © 2026 Takahiro Miyaura 18

19.

XR エミュレータを用意する AVD を 1 つ作るだけ ※ Device Manager → Headset ) config.ini カテゴリ XR (XR ※ システムイメージは google - xr の API 34 $ANDROID_HOME/emulator/emulator XR_Headset - no - snapshot - load - avd - gpu auto (抜粋) tag.id=android - xr image.sysdir.1=system - images ¥ android - 34 ¥google - xr ¥x86_64 ¥ hw.lcd.width=2560 hw.lcd.height=2558 hw.lcd.density=320 hw.ramSize=4096 正方形に近い 2560 ×2558 = ヘッドセットの合成画面(片目分)がそのまま 1 枚の画面に ポインタ役はマウスカーソル。ただしエミュレータに「手」も「深度」も無い(実機のみ) 2026/09/16 © 2026 Takahiro Miyaura 19

20.

4. 最初の空間パネル XR 固有のコードは、実はごくわずか 2026/09/16 © 2026 Takahiro Miyaura 20

21.

空間パネル 1 枚の骨格 MainActivity.kt (要点のみ・全体でも 150 行ほど) fun HelloSpatialPanelApp() { val spatialUiEnabled = LocalSpatialCapabilities.current.isSpatialUiEnabled if (!spatialUiEnabled) { Surface(Modifier.fillMaxSize()) { PanelContent() } } Subspace { SpatialPanel( SubspaceModifier.width(720.dp).height(480.dp) .movable().resizable() ) { PanelContent() } } } XR 固有なのは Subspace / SpatialPanel / SubspaceModifier 2026/09/16 © 2026 Takahiro Miyaura の 3 つだけ 21

22.

押さえるのは 3 つ + 空間モード切替 Subspace SpatialPanel Orbiter ※ ここから先は 3D 空間 ※ Modifier ではなく ※ 中身は普通の Compose ※ 既存の 2D 画面をそのまま ※ movable / ※ パネルの縁の外に浮く ※ ツールバーや戻るを外へ ※ Full Space のときだけ SubspaceModifier ※ offset / rotate / scale resizable も使える で動かせる 現れる 空間モードの切替: requestFullSpace() / requestHomeSpace() ComponentActivity 2026/09/16 の suspend 拡張。rememberCoroutineScope © 2026 Takahiro Miyaura から呼ぶ 22

23.

エミュレータでどこまで確認できるか 動かして、絵を回収する ./gradlew :hello adb shell am start adb shell screencap ここは実機でしか見えない - panel:installDebug - n PKG/.MainActivity - p /sdcard/shot.png ※ Full Space で起動し、パネルが 1 枚浮く ※ 掴んで移動、角をつまんでリサイズできる ※ Home Space に落としてもタップ回数は保持される screencap 2026/09/16 は合成画面(片目分)をそのまま返す / takeScreenshot() © 2026 Takahiro Miyaura ※ 手(ハンドトラッキング) ※ 深度センサー ※ 空間オーディオの定位 ※ 立体視・奥行き感 はダミー画像 23

24.

まとめ ※ 空間 UI は Subspace 中身は普通の Compose + SpatialPanel ※ 空間 UI が効くのは Full Space + SubspaceModifier だけ。起動は Manifest の 3 つ。 、切替は requestFullSpace() ※ 2026 - 09 時点は compose=alpha17 固定。2 系統で管理 ※ Subspace は出し入れしない/AGP 9 が runtime/scenecore に kotlin.android を beta02 に を足さない/JDK は 17 ※ エミュレータだけでパネルまで確認できる。手・深度・音・立体感は実機 Android 2026/09/16 アプリが書けるなら、Android XR の入口はもう開いている © 2026 Takahiro Miyaura 24

25.

大阪駆動開発 関西を中心に、IT系のおもしろそうなことを 楽しんでやるコミュニティ