동작 변경사항: API 레벨 29 이상을 타겟팅하는 앱

Android 10에는 앱에 영향을 미칠 수 있는 업데이트된 시스템 동작 변경사항이 포함되어 있습니다. 이 페이지에 나열된 변경사항은 API 29 이상을 타겟팅하는 앱에만 적용됩니다. 앱에서 targetSdkVersion를 '29' 이상으로 설정하는 경우 이러한 동작을 올바르게 지원하도록 앱을 수정해야 합니다(적용되는 경우).

Android 10에서 실행되는 모든 앱에 영향을 주는 동작 변경사항의 목록도 검토하시기 바랍니다.

참고: 이 페이지에 나열된 변경사항 외에도 Android 10에는 다음을 비롯한 수많은 개인 정보 보호 기반 변경사항 및 제한사항이 도입되었습니다.

  • 범위 지정 저장소
  • USB 기기 일련번호에 액세스
  • Wi-Fi를 사용 설정, 사용 중지, 구성할 수 있는 기능
  • 연결 API의 위치 정보 액세스 권한

API 수준 29 이상을 타겟팅하는 앱에 영향을 미치는 이러한 변경사항은 사용자 개인 정보 보호를 강화합니다. 이러한 변경사항을 지원하는 방법을 자세히 알아보려면 개인 정보 보호 변경사항 페이지를 참고하세요.

비 SDK 인터페이스 제한사항 업데이트

앱 안정성과 호환성을 보장하기 위해 플랫폼에서는 Android 9 (API 수준 28)에서 앱이 사용할 수 있는 비 SDK 인터페이스를 제한하기 시작했습니다. Android 10에는 Android 개발자와의 공동작업 및 최신 내부 테스트를 기반으로 제한된 비 SDK 인터페이스의 업데이트된 목록이 포함되어 있습니다. Google의 목표는 비 SDK 인터페이스를 제한하기 전에 공개 대안을 사용할 수 있게 하는 것입니다.

Android 10 (API 수준 29)을 타겟팅하지 않는 경우 이러한 변경사항 중 일부는 개발자에게 곧바로 영향을 주지 않을 수도 있습니다. 그러나 앱의 대상 API 수준에 따라 현재 일부 비 SDK 인터페이스를 사용할 수 있지만 비 SDK 메서드 또는 필드를 사용하면 언제든지 앱이 중단될 위험이 있습니다.

앱에서 비 SDK 인터페이스를 사용하는지 확실히 알 수 없는 경우 앱을 테스트하여 확인할 수 있습니다. 앱에서 비 SDK 인터페이스를 사용하는 경우 SDK 대안으로 이전을 계획해야 합니다. 일부 앱의 경우 비 SDK 인터페이스 사용에 관한 유효한 사용 사례가 있음을 알고 있습니다. 앱 기능을 구현하기 위해 비 SDK 인터페이스 대신 무엇을 사용해야 할지 알 수 없다면 새 공개 API를 요청해야 합니다.

자세한 내용은 Android 10의 비 SDK 인터페이스 제한사항 업데이트 및 비 SDK 인터페이스 제한사항을 참고하세요.

공유 메모리

Ashmem이 /proc/<pid>/maps에서 dalvik 맵의 형식을 변경하여 맵 파일을 직접 파싱하는 앱에 영향을 미칩니다. 애플리케이션 개발자는 Android 10 이상을 실행하는 기기에서 /proc/<pid>/maps 형식을 테스트하고 앱이 dalvik 맵 형식에 종속되는 경우 그에 따라 파싱해야 합니다.

Android 10을 타겟팅하는 앱은 ashmem(/dev/ashmem)을 직접 사용할 수 없으며 대신 NDK의 ASharedMemory 클래스를 통해 공유 메모리에 액세스해야 합니다. 또한 앱은 기존 ashmem 파일 설명자에 직접 IOCTL을 만들 수 없으며 대신 NDK의 ASharedMemory 클래스 또는 Android Java API를 사용하여 공유 메모리 영역을 만들어야 합니다. 이 변경사항은 공유 메모리로 작업할 때 보안과 견고성을 높여 전반적으로 Android의 성능과 보안을 개선합니다.

앱 홈 디렉터리의 실행 권한이 삭제됨

쓰기 가능한 앱 홈 디렉터리에서 파일을 실행하는 것은 W^X 위반입니다. 앱은 앱의 APK 파일 내에 삽입된 바이너리 코드만 로드해야 합니다.

Android 10을 타겟팅하는 신뢰할 수 없는 앱은 앱의 홈 디렉터리 내의 파일에서 직접 execve()를 호출할 수 없습니다.

또한 Android 10을 타겟팅하는 앱은 dlopen()을 사용하여 연 파일에서 실행 코드를 메모리 내에서 수정할 수 없으며 이러한 변경사항이 디스크에 기록될 것으로 예상할 수 없습니다. 라이브러리가 쓰기 가능한 파일 설명자를 통해 PROT_EXEC로 매핑될 수 없기 때문입니다. 여기에는 텍스트가 재배치된 모든 공유 객체 (.so) 파일이 포함됩니다.

시스템 생성 OAT 파일만 허용하는 Android 런타임

Android 런타임 (ART)은 더 이상 애플리케이션 프로세스에서 dex2oat를 호출하지 않습니다. 이 변경사항은 ART가 시스템에서 생성한 OAT 파일만 허용함을 의미합니다.

ART의 AOT 정확성 강화

이전에는 컴파일 시간과 런타임에 클래스 경로 환경이 동일하지 않은 경우 Android 런타임 (ART)에서 실행하는 AOT (Ahead-Of-Time) 컴파일로 인해 런타임 비정상 종료가 발생할 수 있었습니다. Android 10 이상에서는 항상 이러한 환경 컨텍스트가 동일해야 하므로 다음과 같은 동작 변경이 발생합니다.

  • 커스텀 클래스 로더(dalvik.system 패키지의 클래스 로더와 달리 앱에서 작성한 클래스 로더)는 AOT 컴파일되지 않습니다. ART는 런타임 시 맞춤설정된 클래스 조회 구현에 관해 알 수 없기 때문입니다.
  • 보조 dex 파일(기본 APK에 없는 앱에서 수동으로 로드한 dex 파일)은 백그라운드에서 AOT 컴파일됩니다. 이는 최초 사용 컴파일이 너무 많은 리소스를 소모하여 실행 전에 원치 않는 지연 시간이 발생할 수 있기 때문입니다. 앱의 경우 분할을 채택하고 보조 dex 파일에서 벗어나는 것이 좋습니다.
  • Android의 공유 라이브러리 (Android 매니페스트의 <library> 및 <uses-library> 항목)는 이전 버전의 플랫폼에서 사용된 것과 다른 클래스 로더 계층 구조를 사용하여 구현됩니다.

전체 화면 인텐트에 대한 권한 변경

Android 10 이상을 타겟팅하고 전체 화면 인텐트가 있는 알림을 사용하는 앱은 앱의 매니페스트 파일에서 USE_FULL_SCREEN_INTENT 권한을 요청해야 합니다. 이 권한은 일반 권한이므로 시스템에서 요청 앱에 자동으로 부여합니다.

Android 10 이상을 타겟팅하는 앱이 필요한 권한을 요청하지 않고 전체 화면 인텐트로 알림을 만들려고 하면 시스템은 전체 화면 인텐트를 무시하고 다음 로그 메시지를 출력합니다.

Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

폴더블 지원

Android 10은 폴더블 및 큰 화면 기기를 지원하도록 변경되었습니다.

앱이 Android 10에서 실행되면 onResume() 및 onPause() 메서드가 다르게 작동합니다. 멀티 윈도우 또는 멀티 디스플레이 모드에서 여러 앱이 동시에 표시되는 경우 표시되는 스택에서 포커스 가능한 모든 최상위 활동이 재개된 상태에 있지만, 그중 하나인 '최상위 재개' 활동에만 실제로 포커스가 있습니다. Android 10 이전 버전에서 실행되는 경우 시스템에서 한 번에 하나의 활동만 재개할 수 있으며 다른 모든 표시되는 활동은 일시중지됩니다.

'포커스'를 '최상위 재개' 활동과 혼동하지 마세요. 시스템은 z 순서에 따라 활동에 우선순위를 할당하여 사용자가 마지막으로 상호작용한 활동에 더 높은 우선순위를 부여합니다. 활동이 최상위 재개 상태이지만 포커스가 없을 수 있습니다 (예: 알림 창이 펼쳐진 경우).

Android 10 (API 수준 29) 이상에서는 onTopResumedActivityChanged() 콜백을 구독하여 활동이 최상위 재개 위치를 획득하거나 상실할 때 알림을 받을 수 있습니다. 이는 Android 10 이전의 재개된 상태와 동일하며 앱이 다른 앱과 공유해야 할 수 있는 독점 리소스 또는 싱글톤 리소스를 사용하는 경우 힌트로 유용할 수 있습니다.

resizeableActivity 매니페스트 속성의 동작도 변경되었습니다. 앱이 Android 10 (API 수준 29) 이상에서 resizeableActivity=false를 설정하는 경우 사용 가능한 화면 크기가 변경되거나 앱이 한 화면에서 다른 화면으로 이동할 때 호환성 모드로 전환될 수 있습니다.

앱은 Android 10에 도입된 android:minAspectRatio 속성을 사용하여 앱에서 지원하는 화면 비율을 나타낼 수 있습니다.

버전 3.5부터 Android 스튜디오의 에뮬레이터 도구에는 더 큰 화면으로 코드를 테스트할 수 있는 7.3인치 및 8인치 가상 기기가 포함되어 있습니다.

자세한 내용은 폴더블용 앱 디자인을 참고하세요.