Android XR은 Android 플랫폼 및 생태계의 확장입니다. Android XR SDK는 친숙한 Android 프레임워크와 도구를 사용하거나 OpenXR 및 WebXR과 같은 개방형 표준을 사용하여 XR 앱을 빌드할 수 있도록 설계되었습니다. 호환되는 모든 모바일 또는 대형 화면 앱은 Play 스토어에서 XR 헤드셋에 설치할 수 있습니다. 호환성 고려사항을 검토하여 앱이 호환되는지 확인합니다.
이 가이드에서는 다음 영역을 설명합니다.
- 개발 도구 및 기술 선택
- Android XR용 앱 설계
- 앱의 매니페스트 파일 구성
- 앱 매니페스트 호환성 고려사항
- Android XR 권한 이해
- Android XR 앱 품질 확인
- Android XR용 앱 패키징 및 배포
개발 도구 및 기술 선택
Android XR용 앱을 빌드할 때는 다음 개발 플랫폼과 기술 중에서 선택할 수 있습니다.
Jetpack XR SDK
Jetpack XR SDK에는 XR 기기의 고유한 기능을 활용하기 위해 빌드된 Android XR Jetpack 라이브러리가 포함되어 있습니다. 다음을 수행하려면 이 SDK로 시작하세요.
- 기존 Android 모바일 또는 태블릿 앱 최적화 또는 개선
- Android 스튜디오와 Jetpack을 사용하여 새로운 Android XR 앱 빌드
Android Jetpack으로 개발하는 데 이미 익숙하다면 Jetpack XR SDK가 적합합니다. 이 도구는 이러한 프레임워크 및 라이브러리와 원활하게 통합되도록 설계되었으며 기존 지식을 사용하여 몰입형 XR 환경을 빌드할 수 있습니다.
Jetpack XR SDK로 개발하는 방법 자세히 알아보기
Unity
Unity Engine은 아티스트, 디자이너, 개발자가 공동작업하여 몰입감 있고 양방향적인 환경을 만들 수 있는 실시간 3D 개발 엔진입니다. Unity의 Android XR 지원을 사용하면 개발하는 3D 환경을 세부적으로 제어할 수 있으며 Unity의 기존 OpenXR 지원 및 개발자 생태계의 이점을 누릴 수 있습니다.
Unity로 빌드된 XR 환경이 이미 있거나 Unity 개발에 익숙한 경우 이 옵션으로 시작하세요.
Android XR용 Unity로 개발하는 방법 자세히 알아보기
OpenXR
OpenXR은 고성능 멀티 플랫폼 XR 환경을 빌드하는 데 사용할 수 있는 로열티가 없는 개방형 표준입니다. Android XR은 OpenXR 1.0 및 1.1을 지원하며 Android XR을 위한 새 확장 프로그램으로 사양을 확장하고 있습니다. Android XR은 개방형 표준을 기반으로 빌드되므로 OpenXR 및 Android를 지원하는 개발 도구는 Android XR과 호환되어야 합니다.
Android XR용 OpenXR 지원 자세히 알아보기
WebXR
WebXR을 사용하면 웹용 몰입형 환경을 구축할 수 있습니다. Android XR의 Chrome과 같은 호환 웹브라우저에서 VR 및 AR 기기에 액세스할 수 있습니다.
웹용 XR 환경을 빌드하거나 웹 앱에 XR 기능을 추가하려면 이 옵션으로 시작하세요. 기존 WebXR 환경도 Android XR에서 작동합니다.
XR용 디자인
XR은 기존의 평면 화면을 넘어 디자인 표면을 확장합니다. 물리적 현실과 가상 현실을 혼합하는 몰입형 환경을 디자인할 수 있습니다. 새로운 환경을 빌드하든 기존 앱에 몰입형 요소를 추가하든 Android XR 디자인 가이드를 통해 시작할 수 있습니다.
앱의 매니페스트 파일 구성
다른 Android 앱 프로젝트와 마찬가지로 Android XR 앱에는 특정 매니페스트 설정이 포함된 AndroidManifest.xml 파일이 있어야 합니다. 매니페스트 파일은 Android 빌드 도구, Android 운영체제, Google Play에 앱에 관한 필수 정보를 설명합니다. 자세한 내용은 앱 매니페스트 개요 가이드를 참고하세요.
XR 차별화 앱의 경우 매니페스트 파일에 다음 요소와 속성이 포함되어야 합니다.
PROPERTY_XR_ACTIVITY_START_MODE 속성
android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE"
속성을 사용하면 활동이 시작될 때 특정 모드에서 활동을 실행해야 함을 시스템에 알릴 수 있습니다.
이 속성에는 다음 세 가지 값을 사용할 수 있습니다.
XR_ACTIVITY_START_MODE_HOME_SPACE
(Jetpack XR SDK만 해당)XR_ACTIVITY_START_MODE_FULL_SPACE_MANAGED
(Jetpack XR SDK만 해당)XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED
(OpenXR만 해당)
XR_ACTIVITY_START_MODE_HOME_SPACE
(Jetpack XR SDK로 빌드된 앱만 해당)
이 시작 모드를 사용하여 홈 스페이스에서 앱을 실행합니다. 홈 공간에서는 여러 앱이 나란히 실행되므로 사용자가 멀티태스킹을 할 수 있습니다. 모든 모바일 또는 대형 화면 Android 앱은 홈 공간에서 작동할 수 있으며 Jetpack XR SDK를 사용하여 빌드된 XR 앱도 작동할 수 있습니다.
<manifest ... >
<application ... >
<property
android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE"
android:value="XR_ACTIVITY_START_MODE_HOME_SPACE" />
<activity
android:name="com.example.myapp.MainActivity" ... >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
XR_ACTIVITY_START_MODE_FULL_SPACE_MANAGED
(Jetpack XR SDK로 빌드된 앱만 해당)
이 시작 모드를 사용하여 전체 공간에서 앱을 실행합니다. 전체 공간에서는 공간 경계 없이 한 번에 하나의 앱만 실행되고 다른 모든 앱은 숨겨집니다.
<manifest ... >
<application ... >
<property
android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE"
android:value="XR_ACTIVITY_START_MODE_FULL_SPACE_MANAGED" />
<activity
android:name="com.example.myapp.MainActivity" ... >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED
(OpenXR로 빌드된 앱만 해당)
OpenXR로 빌드된 앱은 전체 공간에서 실행되며 XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED
시작 모드를 사용해야 합니다. 관리되지 않는 전체 공간은 앱이 OpenXR을 사용한다고 Android XR에 신호를 보냅니다.
<manifest ... >
<application ... >
<property
android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE"
android:value="XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED" />
<activity
android:name="com.example.myapp.MainActivity" ... >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED 속성
android:name="android.window.PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED"
속성은 애플리케이션이 특정 유형의 경계로 실행되어야 함을 나타냅니다. 앱이 사용자가 실제 공간을 이동할 수 있도록 설계된 경우 XR_BOUNDARY_TYPE_LARGE
를 지정해야 합니다. XR_BOUNDARY_TYPE_NO_RECOMMENDATION
을 지정하면 안전 경계 유형에 관한 추천이 제공되지 않으므로 시스템에서 이미 사용 중인 유형을 사용합니다.
<manifest ... >
<application ... >
<property
android:name="android.window.PROPERTY_XR_BOUNDARY_TYPE_RECOMMENDED"
android:value="XR_BOUNDARY_TYPE_LARGE" />
</application>
</manifest>
<uses-native-library> OpenXR
(OpenXR로 빌드된 앱만 해당)
OpenXR 애플리케이션은 런타임을 성공적으로 로드하기 위해 네이티브 OpenXR 라이브러리 사용을 선언해야 합니다. 이 선언이 없으면 런타임이 로드되지 않습니다.
<manifest ... >
<application ... >
<uses-native-library andro id:name="libopenxr.google.so" android:required="false" />
<activity
android:name="com.example.myapp.MainActivity" ... >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
XR 앱용 PackageManager 기능
Google Play 스토어를 통해 앱을 배포할 때 앱 매니페스트에서 필수 하드웨어 또는 소프트웨어 기능을 지정할 수 있습니다. uses-feature
요소를 사용하면 Play 스토어에서 사용자에게 표시되는 앱을 적절하게 필터링할 수 있습니다.
다음 기능은 XR 차별화 앱에만 적용됩니다.
android.software.xr.api.spatial
Jetpack XR SDK를 사용하여 빌드된 앱은 앱 매니페스트에 이 기능을 포함해야 합니다. android:required
속성에 설정하는 값은 앱의 출시 트랙에 따라 다릅니다.
앱이 XR 차별화 기능 또는 콘텐츠를 기존 모바일 APK에 번들로 묶고 모바일 출시 트랙에 게시된 경우 android:required
속성을 false
로 설정합니다.
<!-- If you are publishing an existing mobile APK using the mobile release track, set android:required to false.-->
<uses-feature android:name="android.software.xr.api.spatial" android:required="false" />
앱이 XR 지원 기기용으로 특별히 빌드되고 Android XR 전용 출시 트랙에 게시된 경우 android:required
속성을 true
로 설정합니다.
<!-- If you are publishing a separate APK for XR using the dedicated Android XR release track, set android:required to true.-->
<uses-feature android:name="android.software.xr.api.spatial" android:required="true" />
android.software.xr.api.openxr
Android XR 플랫폼을 타겟팅하고 OpenXR 또는 Unity로 빌드된 앱은 android:required
속성이 true
로 설정된 이 기능을 앱 매니페스트에 포함해야 합니다.
Android XR Extensions Package for Unity 버전 1.0.0 이상 또는 Unity OpenXR: Android XR Package 버전 0.5.0-exp.1 이상을 사용하는 앱은 앱 매니페스트에 이 요소를 수동으로 추가하지 않아도 됩니다. 이 두 패키지는 앱 매니페스트에 이 요소를 삽입합니다.
기기는 이 기능의 버전을 지정할 수 있으며, 이는 기기에서 지원하는 가장 높은 OpenXR 버전을 나타냅니다. 상위 16비트는 메이저 번호를 나타내고, 하위 16비트는 마이너 번호를 나타냅니다. 예를 들어 OpenXR 버전 1.1을 지정하려면 값을 "0x00010001"
로 설정합니다.
앱은 기능 버전을 사용하여 앱에 필요한 OpenXR의 최소 버전을 나타낼 수 있습니다. 예를 들어 앱에 OpenXR 버전 1.1 지원이 필요하다면 다음과 같은 기능을 선언해야 합니다.
<uses-feature android:name="android.software.xr.api.openxr"
android:version="0x00010001"
android:required="true" />
android.hardware.xr.input.controller
이 기능은 앱이 올바르게 작동하려면 고정밀 6DoF(자유도) 모션 컨트롤러의 입력이 필요함을 나타냅니다. 앱이 컨트롤러를 지원하고 컨트롤러 없이는 작동할 수 없는 경우 값을 true
로 설정합니다.
앱이 컨트롤러를 지원하지만 컨트롤러 없이도 작동할 수 있는 경우 false
로 설정합니다.
<!-- Sets android:required to true, indicating that your app can't function on devices without controllers. -->
<uses-feature android:name="android.hardware.xr.input.controller" android:required="true" />
android.hardware.xr.input.hand_tracking
이 플래그는 앱이 사용자의 손에 있는 관절의 위치, 방향, 속도를 비롯하여 올바르게 작동하기 위해 충실도가 높은 손 추적을 요구함을 나타냅니다. 앱이 손 추적을 지원하고 손 추적 없이는 작동할 수 없는 경우 값을 true
로 설정합니다. 앱이 손 추적을 지원하지만 손 추적 없이도 작동할 수 있는 경우 false
로 설정합니다.
<!-- Sets android:required to true, indicating that your app can't function on devices without hand tracking. -->
<uses-feature android:name="android.hardware.xr.input.hand_tracking" android:required="true" />
android.hardware.xr.input.eye_tracking
이 플래그는 앱이 입력에 고화질 눈 추적이 필요하여 제대로 작동함을 나타냅니다. 앱이 입력용 시선 추적을 지원하고 시선 추적 없이는 작동할 수 없는 경우 값을 true
로 설정합니다. 앱이 입력용 시선 추적을 지원하지만 시선 추적 없이도 작동할 수 있는 경우 false
로 설정합니다.
<!-- Sets android:required to true, indicating that your app can't function on devices without eye tracking. -->
<uses-feature android:name="android.hardware.xr.input.eye_tracking" android:required="true" />
모바일 및 대형 화면 앱의 앱 매니페스트 호환성 고려사항
XR 앱용 PackageManager 기능 섹션에 설명된 대로 앱은 앱 매니페스트의 <uses-feature>
요소에서 기능을 선언하여 기능을 사용한다고 선언합니다. 텔레포니나 GPS와 같은 일부 기능은 모든 기기와 호환되지 않을 수 있습니다.
지원되지 않는 기능
Google Play 스토어는 다음 Android 기능 선언을 사용하여 기기에 설치할 수 있는 애플리케이션을 필터링합니다.
카메라 하드웨어
android.hardware.camera.autofocus
android.hardware.camera.capability.manual_post_processing
android.hardware.camera.capability.manual_sensor
android.hardware.camera.capability.raw
android.hardware.camera.concurrent
android.hardware.camera.external
android.hardware.camera.level.full
연결
android.hardware.ipsec_tunnel_migration
기기 설정
폼 팩터 구성
android.hardware.type.automotive
android.hardware.type.embedded
android.hardware.type.television
android.software.leanback_only
입력
android.software.input_methods
위치
근거리 무선통신
보안 구성 및 하드웨어
android.hardware.se.omapi.uicc
android.hardware.biometrics.face
android.hardware.identity_credential
android.hardware.identity_credential_direct_access
android.hardware.keystore.limited_use_key
android.hardware.keystore.single_use_key
android.hardware.strongbox_keystore
센서
android.hardware.sensor.accelerometer_limited_axes
android.hardware.sensor.accelerometer_limited_axes_uncalibrated
android.hardware.sensor.ambient_temperature
android.hardware.sensor.barometer
android.hardware.sensor.gyroscope_limited_axes
android.hardware.sensor.gyroscope_limited_axes_uncalibrated
android.hardware.sensor.heading
android.hardware.sensor.heartrate
android.hardware.sensor.heartrate.ecg
android.hardware.sensor.hinge_angle
android.hardware.sensor.relative_humidity
android.hardware.sensor.stepcounter
android.hardware.sensor.stepdetector
소프트웨어 구성
android.software.connectionservice
android.software.expanded_picture_in_picture
android.software.live_wallpaper
android.software.picture_in_picture
android.software.wallet_location_based_suggestions
전화 통신
android.hardware.telephony.calling
android.hardware.telephony.cdma
android.hardware.telephony.data
android.hardware.telephony.euicc
android.hardware.telephony.euicc.mep
android.hardware.telephony.gsm
android.hardware.telephony.ims
android.hardware.telephony.mbms
android.hardware.telephony.messaging
android.hardware.telephony.radio.access
android.hardware.telephony.subscription
가상 현실 (레거시)
android.hardware.vr.headtracking
android.hardware.vr.high_performance
위젯
XR 권한 이해하기
모바일 기기 및 기타 폼 팩터의 앱과 마찬가지로 XR 앱에서 제공하는 일부 기능에는 앱의 AndroidManifest 파일에 권한을 선언해야 할 수 있습니다. 위험한 권한의 경우 앱에서 런타임 권한을 요청해야 할 수 있습니다. 자세한 내용은 Android의 권한 및 권한 권장사항을 참고하세요.
XR 앱은 다음 권한을 사용할 수 있습니다. 이 섹션의 모든 권한은 위험한 권한으로 간주되므로 앱 매니페스트에서 선언하고 런타임에 요청해야 합니다.
android.permission.EYE_TRACKING_COARSE
아바타와 함께 사용하기 위한 사용자 시선 포즈, 상태, 방향을 나타냅니다. 정밀도가 낮은 눈 추적 데이터가 필요한 경우 이 권한을 사용합니다.
Jetpack XR SDK
해당 사항 없음
OpenXR 확장 프로그램
Unity 기능
android.permission.EYE_TRACKING_FINE
선택, 입력, 상호작용을 위한 시선 추적
Jetpack XR SDK
해당 사항 없음
OpenXR 확장 프로그램
Unity 기능
android.permission.FACE_TRACKING
표정 추적 및 렌더링
android.permission.HAND_TRACKING
손 관절 자세와 각속도 및 선속도 추적, 사용자의 손 메쉬 표현 사용
Jetpack XR SDK
OpenXR 확장 프로그램
Unity 기능
android.permission.SCENE_UNDERSTANDING_COARSE
조명 추정, 메시 표면에 패스스루 투영, 환경에서 추적 가능 항목에 대한 광선 투사 실행, 평면 추적, 객체 추적, 영구 앵커
Jetpack XR SDK
OpenXR 확장 프로그램
Unity 기능
android.permission.SCENE_UNDERSTANDING_FINE
깊이 텍스처입니다.
Android XR 앱 품질 확인
앱이 우수한 사용자 환경을 제공하는지 확인하려면 Android XR 앱 품질 가이드라인을 검토하세요.
Android XR용 앱 패키징 및 배포
Android XR은 Google Play를 통해 다양한 앱과 환경을 XR 헤드셋에 제공합니다. Android XR용 앱 패키징 및 배포 가이드에서는 Play 스토어 및 Play Console 시작, 트랙 게시, Android App Bundle 준비, 앱 크기 제한에 관한 정보를 확인할 수 있습니다.
OpenXR™ 및 OpenXR 로고는 The Khronos Group Inc. 소유의 상표이며 중국, 유럽 연합, 일본, 영국에 상표로 등록되어 있습니다.