제품 소식

Android 17의 크기 조절 가능 여부 및 방향 변경사항에 맞게 앱 준비

6분 길이
미겔 몬테마요르의 프로필 보기
Miguel Montemayor 개발자 관계팀 엔지니어

2025년에 Android 16이 출시되면서 Google은 앱이 휴대전화, 폴더블, 태블릿, 데스크톱, 자동차 디스플레이 또는 XR 등 모든 화면에 원활하게 적응하는 기기 생태계에 관한 비전을 공유했습니다. 사용자는 앱이 어디에서나 작동하기를 기대합니다. 태블릿에서 멀티태스킹을 하든, 편안하게 읽을 수 있도록 기기를 펼치든, 데스크톱 창 환경에서 앱을 실행하든 사용자는 UI가 사용 가능한 디스플레이 공간을 채우고 기기 자세에 맞게 조정되기를 기대합니다.

Google은 적응형 동작을 지원하기 위해 방향 및 크기 조절 가능 여부 API에 중대한 변경사항을 도입하는 동시에 전환을 지원하기 위해 일시적인 선택 해제 옵션을 제공했습니다. API 수준 36을 타겟팅할 때 이미 많은 개발자가 이 전환에 성공적으로 적응했습니다.

이제 Android 17 베타가 출시되면서 Google은 적응형 로드맵의 다음 단계로 이동합니다. Android 17 (API 수준 37)에서는 대형 화면 기기 (sw > 600dp)의 방향 및 크기 조절 가능 여부 제한에 관한 개발자 선택 해제 옵션이 삭제 됩니다. 대상 API 수준 37을 타겟팅할 때 앱은 다양한 디스플레이 크기에 적응할 수 있어야 합니다.

동작 변경사항은 Android 생태계가 모든 기기 폼 팩터에서 일관된 고품질 환경을 제공하도록 합니다.

Android 17의 변경사항

Android 17을 타겟팅하는 앱은 Android 16에서 도입된 매니페스트 속성 및 런타임 API의 단계적 폐지에 관한 호환성을 보장해야 합니다. 일부 앱의 경우 큰 전환일 수 있으므로 이 블로그 게시물의 뒷부분에 일반적인 문제를 방지하는 데 도움이 되는 권장사항과 도구를 포함했습니다.

Android 16 이후 새로운 변경사항은 도입되지 않았지만 더 이상 개발자 선택 해제는 불가능합니다. 참고로, 앱이 대형 화면에서 실행되는 경우(여기서 대형 화면은 디스플레이의 더 작은 크기가 600dp 이상임을 의미함) 다음 매니페스트 속성 및 API는 무시됩니다.

참고: Android 16에서 이전에 언급한 바와 같이 이러한 변경사항은 sw 600dp보다 작은 화면 또는 android:appCategory 플래그를 기반으로 게임으로 분류된 앱에는 적용되지 않습니다. 

매니페스트 속성/API무시되는 값
screenOrientationportrait, reversePortrait, sensorPortrait, userPortrait, landscape, reverseLandscape, sensorLandscape, userLandscape
setRequestedOrientation()portrait, reversePortrait, sensorPortrait, userPortrait, landscape, reverseLandscape, sensorLandscape, userLandscape
resizeableActivityall
minAspectRatioall
maxAspectRatioall

또한 사용자는 제어 권한을 유지합니다. 가로세로 비율 설정에서 사용자는 앱의 요청된 동작을 사용하도록 명시적으로 선택할 수 있습니다.

앱 준비

더 이상 가로세로 비율과 방향을 세로 모드 또는 가로 모드로 제한할 수 없으므로 앱은 크기 조절이 가능한 창을 비롯하여 사용자가 앱을 선택하여 사용할 수 있는 모든 가로세로 비율의 디스플레이 크기에 관한 가로 모드 및 세로 모드 레이아웃을 지원해야 합니다.

앱 테스트

첫 번째 단계는 이러한 변경사항을 적용하여 앱을 테스트하여 앱이 디스플레이 크기 전반에서 잘 작동하는지 확인하는 것입니다.

Android 스튜디오에서 Pixel Tablet 및 Pixel Fold 시리즈 에뮬레이터와 함께 Android 17 베타 1을 사용하고 targetSdkPreview = “CinnamonBun”을 설정합니다. 또는 앱이 아직 대상 API 수준 36을 타겟팅하지 않는 경우 UNIVERSAL_RESIZABLE_BY_DEFAULT 플래그를 사용 설정하여 앱 호환성 프레임워크를 사용할 수 있습니다.

레이아웃이 올바르게 조정되도록 하는 추가 도구가 있습니다. Compose UI Check를 사용하여 UI를 자동으로 감사하고 UI를 더 적응형으로 만드는 데 도움이 되는 제안을 받을 수 있으며, DeviceConfigurationOverride를 사용하여 테스트에서 특정 디스플레이 특성을 시뮬레이션할 수 있습니다.

이전에는 방향과 가로세로 비율을 제한했던 앱의 경우 구성 변경을 처리할 때 카메라 미리보기가 기울어지거나 방향이 잘못 지정되거나, 레이아웃이 늘어나거나, 버튼에 액세스할 수 없거나, 사용자 상태가 손실되는 문제가 흔히 발생합니다. 

이러한 일반적인 문제를 해결하기 위한 몇 가지 전략을 살펴보겠습니다.

카메라 호환성 보장

가로 모드 폴더블 또는 멀티 윈도우, 데스크톱 창 모드, 연결된 디스플레이와 같은 시나리오에서 가로세로 비율을 계산할 때 카메라 미리보기가 늘어나거나, 회전하거나, 잘리는 문제가 흔히 발생합니다.

camera_preview_issue.png

카메라 미리보기가 늘어나거나 회전하지 않도록 합니다.

이 문제는 앱이 카메라 기능 (예: 가로세로 비율 및 센서 방향)과 기기 기능 (예: 기기 방향 및 자연 방향) 간의 고정된 관계를 가정하기 때문에 대형 화면 및 폴더블 기기에서 자주 발생합니다.

카메라 미리보기가 모든 창 크기 또는 방향에 올바르게 적응하도록 하려면 다음 네 가지 해결 방법을 고려하세요.

해결 방법 1: Jetpack CameraX (권장) 

가장 간단하고 강력한 해결 방법은 Jetpack CameraX 라이브러리를 사용하는 것입니다. PreviewView UI 요소는 모든 미리보기 복잡성을 자동으로 처리하도록 설계되었습니다.

  • PreviewView는 센서 방향, 기기 회전, 확장에 맞게 올바르게 조정됩니다.
  • PreviewView는 일반적으로 가운데 정렬 및 자르기 (FILL_CENTER)를 통해 카메라 이미지의 가로세로 비율을 유지합니다.
  • 필요한 경우 확장 유형을 FIT_CENTER로 설정하여 미리보기를 레터박스 처리할 수 있습니다.

자세한 내용은 CameraX 문서의 미리보기 구현을 참고하세요.

해결 방법 2: CameraViewfinder 

기존 Camera2 코드베이스를 사용하는 경우 CameraViewfinder 라이브러리 (API 수준 21과 이전 버전 호환)가 또 다른 최신 해결 방법입니다. TextureView 또는 SurfaceView를 사용하여 카메라 피드를 표시하고 필요한 모든 변환 (가로세로 비율, 확장, 회전)을 적용하여 표시를 간소화합니다.

자세한 내용은 카메라 뷰파인더 소개 블로그 게시물 및 카메라 미리보기 개발자 가이드를 참고하세요.

해결 방법 3: 수동 Camera2 구현 

CameraX 또는 CameraViewfinder를 사용할 수 없는 경우 방향과 가로세로 비율을 수동으로 계산하고 각 구성 변경 시 계산이 업데이트되도록 해야 합니다.

  • CameraCharacteristics에서 카메라 센서 방향 (예: 0, 90, 180, 270도)을 가져옵니다.
  • 기기의 현재 디스플레이 회전 (예: 0, 90, 180, 270도)을 가져옵니다.
  • 카메라 센서 방향 및 디스플레이 회전 값을 사용하여 SurfaceView 또는 TextureView에 필요한 변환을 결정합니다.
  • 왜곡을 방지하려면 출력 Surface의 가로세로 비율이 카메라 미리보기의 가로세로 비율과 일치하는지 확인합니다.

중요: 카메라 앱은 멀티 윈도우 또는 데스크톱 창 모드 또는 연결된 디스플레이에서 화면의 일부에서 실행될 수 있습니다. 따라서 화면 크기를 사용하여 카메라 뷰파인더의 크기를 결정해서는 안 됩니다. 대신 창 측정항목을 사용하세요. 그렇지 않으면 카메라 미리보기가 늘어날 위험이 있습니다.

자세한 내용은 카메라 미리보기 개발자 가이드 및 다양한 폼 팩터의 카메라 앱 동영상을 참고하세요.

해결 방법 4: 인텐트를 사용하여 기본 카메라 작업 실행 

카메라 기능이 많이 필요하지 않은 경우 간단하고 직접적인 해결 방법은 기기의 기본 카메라 애플리케이션을 사용하여 사진이나 동영상 촬영과 같은 기본적인 카메라 작업을 실행하는 것입니다. 이 경우 카메라 라이브러리와 통합하는 대신 Intent를 사용하면 유지보수와 적응성이 더 쉬워집니다. 

자세한 내용은 카메라 인텐트를 참고하세요.

늘어난 UI 또는 액세스 불가 버튼 방지

앱이 특정 기기 방향 또는 디스플레이 가로세로 비율을 가정하는 경우 이제 다양한 방향 또는 창 크기에서 앱을 사용할 때 문제가 발생할 수 있습니다.

elementsLS.png

대형 화면에서 버튼, 텍스트 필드, 기타 요소가 늘어나지 않도록 합니다.

버튼, 텍스트 필드, 카드를 fillMaxWidth 또는 match_parent로 설정했을 수 있습니다. 휴대전화에서는 멋지게 보입니다. 하지만 가로 모드의 태블릿 또는 폴더블에서는 UI 요소가 대형 화면 전체로 늘어납니다. Jetpack Compose에서는 widthIn 수정자를 사용하여 구성요소의 최대 너비를 설정하여 콘텐츠가 늘어나는 것을 방지할 수 있습니다.

Box(
    contentAlignment = Alignment.Center,
    modifier = Modifier.fillMaxSize()
) {
    Column(
        modifier = Modifier
            .widthIn(max = 300.dp) // Prevents stretching beyond 300dp
            .fillMaxWidth()        // Fills width up to 300dp
            .padding(16.dp)
    ) {
        // Your content
    }
}

사용자가 폴더블 또는 태블릿에서 가로 모드로 앱을 열면 화면 하단의 저장 또는 로그인 과 같은 작업 버튼이 화면 밖으로 렌더링될 수 있습니다. 컨테이너를 스크롤할 수 없는 경우 사용자가 계속 진행하지 못할 수 있습니다. Jetpack Compose에서는 구성요소에 verticalScroll 수정자를 추가할 수 있습니다.

Column(
    modifier = Modifier
        .fillMaxSize()
        .verticalScroll(rememberScrollState())
        .padding(16.dp)
)

최대 너비 제약 조건을 세로 스크롤과 결합하면 앱 창 크기가 얼마나 넓거나 짧아지든 관계없이 앱이 계속 작동하고 사용 가능하도록 할 수 있습니다.

_적응형 레이아웃 빌드_에 관한 가이드를 참고하세요.

구성 변경으로 상태 유지

방향 및 가로세로 비율 제한을 삭제하면 앱의 창 크기가 훨씬 더 자주 변경됩니다. 사용자는 기기를 회전하거나, 접거나 펼치거나, 화면 분할 또는 데스크톱 창 모드에서 앱 크기를 동적으로 조절할 수 있습니다.

기본적으로 이러한 구성 변경은 활동을 소멸시키고 다시 만듭니다. 앱이 이 수명 주기 이벤트를 제대로 관리하지 않으면 사용자는 스크롤 위치가 상단으로 재설정되고, 절반만 채워진 양식이 완전히 지워지고, 탐색 기록이 손실되는 등 불편한 환경을 경험하게 됩니다. 원활한 적응형 환경을 보장하려면 앱이 이러한 구성 변경을 통해 상태를 유지하는 것이 중요합니다. Jetpack Compose를 사용하면 다시 만들기를 선택 해제하고 대신 창 크기 변경을 통해 사용 가능한 새 공간을 반영하도록 UI를 재구성할 수 있습니다.

_UI 상태 저장_에 관한 가이드를 참고하세요.

2027년 8월까지 API 수준 37 타겟팅

이전에 앱이 API 수준 36을 타겟팅할 때 이러한 변경사항을 선택 해제한 경우 앱이 API 수준 37을 타겟팅한 후에만 Android 17 선택 해제 삭제의 영향을 받습니다. 사전에 계획하고 앱에 필요한 조정을 할 수 있도록 이러한 변경사항이 적용되는 시점을 알려드립니다.

  • Android 17: 위에 설명된 변경사항은 API 수준 37을 타겟팅하는 앱 의 대형 화면 기기 (최소 화면 너비 > 600dp)의 기준 환경이 됩니다. 개발자는 선택 해제할 수 없습니다.

특정 API 수준을 타겟팅하기 위한 마감일은 앱 스토어마다 다릅니다. Google Play의 경우 새 앱과 업데이트는 API 수준 37을 타겟팅해야 하며, 2027년 8월에 배포하려면 이 동작이 필수입니다.

Android 17 준비

Android 17의 앱에 영향을 미치는 모든 변경사항은 Android 17 변경사항 페이지를 참고하세요. 앱을 테스트하려면 Android 17 베타 1을 다운로드하고 targetSdkPreview = “CinnamonBun”으로 업데이트하거나 앱 호환성 프레임워크를 사용하여 특정 변경사항을 사용 설정하세요.

Android의 미래는 적응형이며 Google은 이를 지원하기 위해 최선을 다하고 있습니다. Android 17을 준비할 때 적응형 레이아웃 빌드 가이드와 대형 화면 품질 가이드라인을 검토하는 것이 좋습니다. 이러한 리소스는 여러 폼 팩터와 창 크기를 자신 있게 처리하는 데 도움이 되도록 설계되었습니다.

기다리지 마세요. 지금 바로 Android 17을 준비하세요.

작성자:
계속 읽기