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 엔진은 아티스트, 디자이너, 개발자가 공동작업하여 몰입도 높은 양방향 환경을 만들 수 있는 실시간 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_ACTIVITY_XR_START_MODE 속성
android:name="android.window.PROPERTY_ACTIVITY_XR_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>
<uses-native-library> OpenXR
(OpenXR로 빌드된 앱만 해당)
OpenXR 애플리케이션은 네이티브 OpenXR 라이브러리의 사용을 선언해야 런타임을 성공적으로 로드할 수 있습니다. 이 선언이 없으면 런타임이 로드되지 않습니다.
<manifest ... >
<application ... >
<uses-native-library android:name="libopenxr.google.so" android:required="true" />
<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
로 설정해야 합니다. 앱이 XR 지원 기기용으로 특별히 빌드되었으며 Android XR 전용 출시 트랙에 게시된 경우 android:required
속성을 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
로 설정하여 앱 매니페스트에 이 기능을 포함해야 합니다.
Unity용 Android XR 확장 프로그램 패키지 버전 1.0.0 이상 또는 Unity OpenXR: Android XR 패키지 버전 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로 설정합니다.
<uses-feature android:name="android.hardware.xr.input.controller" android:required="true" />
android.hardware.xr.input.hand_tracking
이 플래그는 앱이 올바르게 작동하려면 사용자 손의 관절의 위치, 방향, 속도 등 고화질 손 추적이 필요하다는 것을 나타냅니다. 앱이 손 추적을 지원하고 손 추적 없이는 작동할 수 없는 경우 값을 true로 설정합니다. 앱이 손 추적을 지원하지만 손 추적 없이도 작동할 수 있는 경우 false로 설정합니다.
<uses-feature android:name="android.hardware.xr.input.hand_tracking" android:required="true" />
android.hardware.xr.input.eye_tracking
이 플래그는 입력이 올바르게 작동하려면 앱에 고화질 아이 트래킹이 필요하다는 것을 나타냅니다. 앱이 입력에 눈 추적을 지원하고 눈 추적 없이는 작동할 수 없는 경우 값을 true로 설정합니다. 앱이 입력에 눈 추적을 지원하지만 눈 추적 없이도 작동할 수 있는 경우 false로 설정합니다.
<uses-feature android:name="android.hardware.xr.input.eye_tracking" android:required="true" />
모바일 및 대형 화면 앱의 앱 매니페스트 호환성 고려사항
XR 앱의 PackageManager 기능 섹션에 설명된 대로 앱은 앱 매니페스트의 <uses-feature>
요소에서 기능을 선언하여 기능을 사용한다고 선언합니다. 전화나 GPS와 같은 일부 기능은 일부 기기와 호환되지 않을 수 있습니다.
지원되지 않는 기능
다음 Android 기능 선언을 사용하여 기기에 설치할 수 있는 Google Play 스토어 필터 애플리케이션
카메라 하드웨어
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 준비, 앱 크기 제한에 관한 정보를 확인할 수 있습니다.