Slide 1

Slide 1 text

Jetpack XR SDKから紐解く Android XR開発と 技術選定のヒント にー兄さん@ninisan_drumath XR Kaigi 2025

Slide 2

Slide 2 text

にー兄さん ソフトウェアエンジニア@HoloLab inc. Babylon.js勉強会運営 Iwaken Lab. Microsoft MVP for Developer Technologies (2024~) 好きな技術 Babylon.js / WebXR Device API / Android XR / 3D Gaussian Splatting @ninisan_drumath @drumath2237

Slide 3

Slide 3 text

本日の資料は撮影・SNS共有OKです📸 (のちほど公開します)

Slide 4

Slide 4 text

本日のお話 「Jetpack XR SDK」がメイン Android XRを取り巻く状況やSDKの概要 特にSDKが(現状)どのような機能を持っており、 どんな目的で使えるものなのか XR SDKの得意・苦手、使い分けについて ゴール Android XRに興味のあるエンジニアがJetpack XR SDKについて知る Android XRアプリ開発時の技術選定について解像度を高める 例えばUnityとどっちを使うか、など

Slide 5

Slide 5 text

本セッションにおける検証環境 Windows 11 Home Android Studio Otter 3 Feature Drop | 2025.2.3 Canary 2 Android Emulator 36.4.1 Google Play XR Intel x86_64 Atom System Image Revision 7 Jetpack XR SDK Jetpack Compose for XR 1.0.0-alpha08 Material Design for XR 1.0.0-alpha12 Jetpack SceneCore 1.0.0-alpha09 ARCore for Jetpack XR 1.0.0-alpha08

Slide 6

Slide 6 text

アジェンダ 1. Android XRに関する背景 2. Jetpack XR SDKを使ったアプリ開発 3. Deep Dive into XR SDK 4. XR SDKから考察するAndroid XRアプリ開発 5. おわりに

Slide 7

Slide 7 text

Android XRに関する背景

Slide 8

Slide 8 text

Android XRのこれまでの流れ 2024/12/12 Android XR発表 Introducing Android XR SDK Developer Preview 2025/05/20-21 Google I/O 2025 KeynoteではARグラスを使ったライブデモもあった 2025/10/22 SamsungからGalaxy XR発表 初のAndroid XR OS搭載デバイス https://blog.google/products/android/android-xr/ https://news.samsung.com/global/unlock-the-infinite-possibilities-of-xr-with-galaxy-ai

Slide 9

Slide 9 text

Google I/O 2025 1年に1回のGoogle公式技術カンファレンス KeynoteにてARグラスを使ったライブデモ その他にも2,3本 Android XR関連のセッションがあった https://youtu.be/o8NiE3XMPrM Galaxy Event October 2025 Samsung社のイベント Project Moohanという名前だったものが 正式にGalaxy XRとして発表 https://youtu.be/ITXJquX9FqM

Slide 10

Slide 10 text

Android XRとは何か XRデバイスに向けのOS HMDやグラスなど、 様々なデバイスタイプに対応している ARCoreやGoogle Lens、 Googleマップなどのアプリ、Geminiなどを搭載 SamsungやQualcommと協力 https://www.youtube.com/watch?v=Pn5uG1ys-pE

Slide 11

Slide 11 text

Android XRで動作するアプリ アプリには2種類の状態がある Home Space Full Space 一般的にスマホで使えるアプリは Home Spaceで動作可能 Android XR向けにcapabilityの設定や Spatial UIが構築されていれば Full Spaceで動作 2つの状態は相互に遷移可能 UnityだとFull Spaceしか使えないなどの制約も (手元のシミュレータで動作させた様子→)

Slide 12

Slide 12 text

開発環境 アプリ開発の選択肢は次のとおり Jetpack XR SDK Kotlin/Composeを使うネイティブSDK(詳細はこれから) Unity XRIやARFoundation、OpenXR Pluginなどを使って開発 Android XR Extentions for Unityをインポートして使う OpenXR OpenXR 1.0, 1.1の規格に従っている WebXR Chrome for Android XRなどのブラウザで動作するWebXRアプリ開発 WebXR Device APIを使う

Slide 13

Slide 13 text

Jetpack XR SDKを使った アプリ開発

Slide 14

Slide 14 text

Jetpack XR SDKとは何か Android XRで動作するような 没入体験を有するアプリケーションを開発するためのライブラリ群 いままでのAndroidアプリ開発と同じように KotlinやCompose、Android Studioといったツールを使える 主に次の4つのパッケージから構成される Jetpack Compose for XR Material Design for XR Jetpack SceneCore ARCore for Jetpack XR

Slide 15

Slide 15 text

Android Studioとエミュレータの利用 モバイルアプリ開発などと同様に、 Android Studioなどのツールを活用可能 ビルド、テスト、デバッグなど Home SpaceでのUIはAndroid Studio内で プレビューしながら作れる Android XR emulatorが用意されており、 Compose for XRやSceneCoreを使った 機能の動作を確認できる エミュレータの仕組みで 2D UIはホットリロードも可能

Slide 16

Slide 16 text

開発の始め方 ■XRのテンプレートから作成 Android Studioのテンプレートから XRカテゴリのものを使用する ComposeによるシンプルなUI実装と Spaceモードの切り替えが実装されている ■XR Samplesを改変 GitHubにあがっている 公式のサンプルプロジェクトを改変する方法 空間UIやState管理、3Dモデル表示など 比較的作りこまれている https://github.com/android/xr-samples

Slide 17

Slide 17 text

Deep Dive into XR SDK

Slide 18

Slide 18 text

XR SDKに関する情報源 Developers Guide https://developer.android.com/develop/xr/jetpack-xr-sdk Release Notes https://developer.android.com/jetpack/androidx/releases/xr-compose API Reference https://developer.android.com/reference/kotlin/androidx/xr/compose/platform/ 実際のコード

Slide 19

Slide 19 text

XR SDKの中身を見てみる Jetpack全体のコードは公開されている https://android.googlesource.com/platform /frameworks/support/ Googleが独自で持っている リモートリポジトリホスティングサービス xr/ というフォルダの中がXR SDK

Slide 20

Slide 20 text

Jetpack Compose for XR namaspace: androidx.xr.compose latest: 1.0.0-alpha8 (2025/10/22) Jetpack Composeを使って空間UIを実装するためのラ イブラリ Android XRで空間パネルに表示するUIに必要な部品を 提供 Subspace コンポーザブルの定義 Subspace Composables Spatialized Component Subspace Modifier Full SpaceでSpatialPanelとOrbiterがレンダリングされている https://developer.android.com/develop/xr/jetpack-xr-sdk/develop-ui

Slide 21

Slide 21 text

Material Design for XR namespace: androidx.xr.compose.material3 latest: 1.0.0-alpha12 (2025/10/22) Googleが提供するMaterial Designを 空間UIで扱うするためのライブラリ 分けて取り上げられがちだが、 実態としてはCompose for XRの一部 Material Designでは 様々な画面サイズのデバイスに対応すべく Adoptive Layoutという仕組みが用意されている https://developer.android.com/develop/xr/jetpack-xr-sdk/material-design

Slide 22

Slide 22 text

Material Design for XR Material Designでは 様々な画面サイズのデバイスに対応すべく Adoptive Layoutという仕組みが用意されている EnableXrComponentOverrides というコンポーザブルの子にすると Material3のコンポーネントはSpatial UIに対応するよ うに Material Design Guidelineには 「XR」の項目が盛り込まれている(すごい) https://m3.material.io/components/navigation- bar/xr

Slide 23

Slide 23 text

Jetpack SceneCore namespace: androidx.xr.scenecore latest: 1.0.0-alpha9 (2025/11/19) 3Dシーン上のオブジェクトを扱うための低レベルな機 能を提供するライブラリ 空間UIのパネルや3Dモデル、3D環境といったものを Entityとして管理する 空間音響や空間ビデオの再生などの機能も Entity-Component Systemを採用 エミュレータ内で3Dモデルをロードして表示する様子

Slide 24

Slide 24 text

ARCore for Jetpack XR namespace: androidx.xr.arcore latest: 1.0.0-alpha08 (2025/11/19) AR機能を扱うためのライブラリ 従来からモバイルで使われている ARCore SDK for Androidとは別物だけど 内部的にそれに依存している 現在エミュレータでは動かない https://developer.android.com/develop/xr/jetpack-xr-sdk/arcore/hands

Slide 25

Slide 25 text

XR Runtime namespace: androidx.xr.runtime latest: 1.0.0-alpha08 (2025/11/19) XR SDK全体で使えるデータ型やヘルパーの定義 Vector3 や Ray などの基本的な型 XrDevice や Session といったXRの基礎的なデータ

Slide 26

Slide 26 text

パッケージ全体の構造と依存関係

Slide 27

Slide 27 text

Jetpack Composeによる UIの構築 コンポーザブルと呼ばれる部品を組み合わせて UIを構築するためのフレームワーク 宣言的UIの思想に基づいており、 モダンなAndroid開発ではよく使われる Kotlin言語で開発可能 コンポーザブル関数のイメージ Composeのロゴ @Composable fun ExampleButton(onClick: () -> Unit) { Button(onClick = { onClick() }) { Text("Hello") } }

Slide 28

Slide 28 text

@Composable fun Example2DComposable() { var label by remember { mutableStateOf("") } Surface { Column( modifier = Modifier.padding(48.dp), horizontalAlignment = Alignment.CenterHorizontally ) { Text(label) Row( modifier = Modifier.fillMaxSize(), horizontalArrangement = Arrangement.Center ) { Button( onClick = { label = "button 1" }, modifier = Modifier.padding(5.dp) ) { Text("Button 1") } Button( onClick = { label = "button 2" }, modifier = Modifier.padding(5.dp) ) { Text("Button 2") } } } } }

Slide 29

Slide 29 text

Full SpaceモードのUI Full Spaceで動作するコンポーザブルは Subspace コンポーザブルの子である必要がある Subspaceコンポーザブルで囲むことで Full Spaceでも動作するように @Composable fun SpatialExample() { // Full Spaceで動作する特殊なコンポーザブル Subspace { SpatialPanel( modifier = SubspaceModifier.width(400.dp) ) { Example2DComposable() } } }

Slide 30

Slide 30 text

Spatial Component Spatial Popupのようなコンポーネントは elevation をModifierで指定して 高さを出せる SpatialPopup( alignment = Alignment.TopCenter, elevation = 78.dp // 任意の値 ) { Button({}) { Text("Spatial Popup") } }

Slide 31

Slide 31 text

SceneCoreによる3D空間体験の実装 Jetpack SceneCoreは空間UIのパネルなどを含む、 あらゆる3D表現を扱う低レベルなAPIを提供 Entity-Component Systemを採用 空間パネルや3Dモデルだけでなく、 環境マップや空間ビデオ、空間音響に関する機能も含 まれる 3Dモデルの表示 val session = LocalSession.current LaunchedEffect(null) { if (session != null) { val gltfModel = GltfModel.create(session, Paths.get("models", "Fox.glb")) val entity = GltfModelEntity.create(session, gltfModel) entity.setScale(0.005f) } }

Slide 32

Slide 32 text

ARCoreによるAR機能の実装 例えばDepth estimation Depthの動作モードを設定 比較的シンプルなAPIでDepth値の取得 Depth estimationの結果 https://developer.android.com/develop/xr/jetpack-xr- sdk/arcore/depth val newConfig = session.config.copy( depthEstimation = Config.DepthEstimationMode.SMOOTH_ONLY, ) // Depth Map取得 val depthMap = DepthMap.left(session) ?: return // 深度値の取得 val result = depthMap.smoothDepthMap?.get(index)

Slide 33

Slide 33 text

ARCoreによるAR機能の実装 例えばPlane detection 検知委平面の設定 State Flowとして検知平面の取得 val newConfig = session.config.copy( planeTracking = Config.PlaneTrackingMode.HORIZONTAL_AND_VERTICAL, ) Plane.subscribe(session).collect { planes -> plane.type // HORIZONTAL_DOWNWARD_FACING, VERTICAL, ... plane.label // CEILING, FLOOR, TABLE, ... }

Slide 34

Slide 34 text

ARCoreでサポートされる機能 ドキュメント曰く Plane (Hit-Test) Anchors Hand tracking Head tracking Face tracking Depth estimation 実際のコードを見ると、 Eye trackingやGeospatial APIなども 見受けられる

Slide 35

Slide 35 text

XR SDKから考察する Android XRアプリ開発

Slide 36

Slide 36 text

XRアプリ開発における「ネイティブSDK」という選択肢 XRプラットフォーマーがネイティブ向けのSDKを提供することが多くなってきた visionOSにおけるSwiftUIやReality Composer Meta HorizonOSにおけるMeta Spatial SDK AIグラス文脈でのネイティブSDK配布

Slide 37

Slide 37 text

UI開発におけるComposeの優位性 Unityでの空間的なUI開発と比べたとき モバイルアプリ開発で培われてきたモダンなUI設計やエコシステムを取り入れられる Composeが採用する宣言的UIやリアクティビティ ビルド時間短縮によるイテレーションの高速化 ホットリロードにも対応 柔軟なデザインシステムによるカスタマイズ AIによるコーディング支援との相性が良い → UIが主体の3D/XRアプリ開発における優位性

Slide 38

Slide 38 text

複雑な制御をする3Dシーンを要する場合 現状のSceneCoreには柔軟な3D操作のAPIがない あくまでシンプルなSurfaceや3Dモデルをそのまま出すイメージ グラフィクスやレンダリングに関する部分はあまり触れない(Cubeを出すなど) 3Dシーンのオーサリングの仕組みがない DCCツールでglTFモデルを調整するイメージ visionOSアプリ開発におけるReality Composer Proのようなものは必要そう Unityで作ったほうが良い可能性が高い

Slide 39

Slide 39 text

おわりに

Slide 40

Slide 40 text

まとめ Android XRアプリのネイティブSDKであるJetpack XR SDK Kotlin / Composeによるアプリ開発ができるため、 宣言的UIやリアクティブプログラミングの良さを生かしたUI開発ができる 高度な3Dデータの操作はまだできないため 複雑なゲームなどはUnityでやるのが良い UI主体ならネイティブ、ゲームのようなものはゲームエンジン → これって普通の考え方なのでは? いままで「XRと言えばUnity」だった世界から 要件によって適切な技術選定が必要になってきている

Slide 41

Slide 41 text

関連・参考 Android XR (Android Developer) https://developer.android.com/develop/xr Develop with the Jetpack XR SDK https://developer.android.com/develop/xr/jetpack-xr-sdk Android Studio tools for XR https://developer.android.com/develop/xr/jetpack-xr-sdk/studio-tools android/xr-samples (GitHub) https://github.com/android/xr-samples The future is now, with Compose and AI on Android XR (Google I/O 2025) https://io.google/2025/explore/technical-session-2 『Jetpack XR SDKによるAndroid XRアプリ開発の現状整理』 https://techbookfest.org/product/3Ttz8QVn4A5uXRYyRm34Xr? productVariantID=fArCdYsZCt0d8ez5nsFNj9