안드로이드 12 부터 포그라운드 서비스 시작 제한이 시작됩니다. 대비하세요!! 실시간 처리가 필요한데, WorkManager 쓰라고?
포그라운드 서비스 시작 제한
Android 12를 타겟팅하는 앱은 몇 가지 특수한 사례를 제외하고 백그라운드에서 실행되는 동안 더 이상 포그라운드 서비스를 시작할 수 없습니다. 앱이 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작하려고 하지만 포그라운드 서비스가 예외 사례 중 하나를 충족하지 못하면 시스템에서 IllegalStateException이 발생합니다.
포그라운드 서비스 권장 대안: WorkManager
앱이 이 변경사항으로 영향을 받는 경우 WorkManager를 사용하도록 이전하는 것이 좋습니다. Android 12 베타가 출시되면 WorkManager는 우선순위가 높은 백그라운드 작업을 시작하는 데 권장되는 솔루션이 됩니다.
Work Manager 2.7.0-alpha01에서는 Android 12의 새로운 작업 유형인 신속 처리 작업이 지원됩니다. Android 11 이하에서는 이 버전의 WorkManager가 포그라운드 서비스를 사용하여 이전 버전과의 호환성을 제공합니다.
Work Manager 2.7.0-alpha01에서 신속 처리 작업을 사용하는 방법에 관한 전체 예는 GitHub의 WorkManagerSample을 참고하세요.
신속 처리 작업
Android 12에서 새로 도입된 신속 처리 작업을 사용하면 앱이 중요한 작업을 실행하는 동시에 시스템에서는 리소스 액세스를 더 효과적으로 제어할 수 있습니다. 이러한 작업의 특성은 포그라운드 서비스와 JobScheduler 작업 사이에 있습니다.
- 절전 모드와 잠자기를 비롯한 시스템의 전원 관리 제한사항에 영향을 받지 않습니다.
- 시스템의 현재 워크로드에서 실행이 가능하다면 시스템은 신속 처리 작업을 즉시 실행합니다.
신속 처리 작업은 지연될 수 있음
시스템은 작업이 호출된 후 최대한 빨리 지정된 신속 처리 작업을 실행하려고 합니다. 그러나 다른 작업 유형과 마찬가지로 시스템은 이미 너무 많은 작업이 실행되고 있거나 시스템 리소스가 부족하면 새 신속 처리 작업의 시작을 지연시킬 수 있습니다.
특히 시스템은 다음 조건 중 하나 이상이 발생하면 신속 처리 작업의 실행을 지연시킵니다.
- 시스템 로드가 너무 높습니다.
- 신속 처리 작업 할당량 한도가 초과되었습니다. 신속 처리 작업은 앱 대기 버킷에 기반하는 할당량 시스템을 사용하고 롤링 시간 내에서 최대 실행 시간을 제한합니다. 신속 처리 작업에 사용되는 할당량은 다른 유형의 백그라운드 작업에 사용되는 할당량보다 더 제한됩니다.
WorkManager 업데이트
WorkManager 2.7.0-alpha01부터 앱은 setExpedited()를 호출하여 Worker가 신속 처리되어야 한다고 선언할 수 있습니다. 이 새로운 API는 Android 12에서 실행될 때 신속 처리 작업을 사용하고 API는 이전 버전의 Android에서 포그라운드 서비스를 사용합니다.
개발자가 앱에서 의도적으로 신속 처리 작업을 요청하도록 권장하고 작업 실행 시간을 연장하는 기능을 더 잘 지원하기 위해 CoroutineWorker.setForeground() 및 ListenableWorker.setForegroundAsync() 메서드가 지원 중단됩니다. 특히 Android 12를 실행하는 기기에서는 ListenableWorker.setForegroundAsync()를 호출하려고 하면 IllegalStateException이 발생합니다. 개발자는 대신 setExpedited()를 사용하는 것이 좋습니다.
백그라운드에서 포그라운드 서비스 시작이 허용되는 경우
다음 상황에서는 앱이 백그라운드에서 실행되는 동안에도 포그라운드 서비스를 시작할 수 있습니다.
- 앱이 활동과 같은 사용자에게 표시되는 상태에서 전환됩니다.
- 앱이 Firebase 클라우드 메시징을 사용하여 우선순위가 높은 메시지를 수신합니다.
- 사용자가 앱과 관련된 UI 요소에서 작업을 실행합니다. 예를 들어 대화창이나 알림, 위젯, 활동과 상호작용할 수 있습니다.
- 앱이 지오펜싱이나 활동 감지와 관련된 이벤트를 수신합니다.
- 기기가 재부팅되고 broadcast receiver에서 ACTION_BOOT_COMPLETED 인텐트 작업을 수신한 후의 경우입니다.
- 앱에 기기 소유자와 프로필 소유자 등 특정 시스템 역할이나 권한이 있습니다.
- 앱에서 부속 기기 관리자를 사용합니다.
- 앱에서 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 권한을 요청하여 사용자가 앱의 배터리 최적화를 사용 중지한 설정 페이지로 사용자를 안내했습니다.
- 사용자를 시스템 설정의 배터리 최적화 페이지로 안내하려면 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 인텐트 작업이 포함된 인텐트를 호출합니다. 최적화 페이지에서 사용자가 앱의 배터리 최적화를 사용 중지하면 시스템에서는 그림 1에 표시되는 대화상자를 표시합니다.
- 앱은 백그라운드에서 활동 시작에 관한 제한사항 예외로 설명된 조건을 충족합니다. 단, 앱이 기존 작업의 백 스택에 활동을 보유하는 경우는 예외입니다.
REFERENCE : Android 12 개발자 프리뷰(https://developer.android.com/about/versions/12/foreground-services)
안드로이드 12 정식 출시되었다.
그에 따른 동작 변경사항은 반드시 확인해서 내 앱에 문제가 발생하는지 여부를 체크할 필요가 있다.
2022년 11월부터는 앱을 마켓에 등록할 때 안드로이드 12를 타겟팅해야 등록가능하다.
Android 11(API 수준 30)에서 Android 12(API 수준 31)로 이전시 확인사항
보안 및 권한
- 블루투스: BLUETOOTH 및 BLUETOOTH_ADMIN 권한의 선언을 BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE 또는 BLUETOOTH_CONNECT 권한으로 바꾸어야 합니다. 블루투스 작업을 위해 더 이상 LOCATION 런타임 권한을 요청할 필요가 없습니다.
- 위치: 사용자는 앱이 대략적인 위치 정보만 가져오도록 요청할 수 있습니다. ACCESS_FINE_LOCATION을 요청할 때 항상 ACCESS_COARSE_LOCATION을 요청해야 합니다.
- 인텐트 필터: 앱이 인텐트 필터를 사용하는 활동, 서비스 또는 broadcast receiver를 포함하면 이러한 구성요소의 android:exported 속성을 명시적으로 선언해야 합니다.
- 최대 절전 모드: 앱이 일정 기간 동안 사용되지 않으면 최대 절전 모드로 전환될 수 있습니다. 최대 절전 모드에서는 앱의 런타임 권한과 캐시가 재설정되며 작업 또는 알림을 실행할 수 없습니다. 앱의 최대 절전 모드 상태를 확인할 수 있습니다.
- 대기 중인 인텐트 변경 가능 여부: 앱에서 만드는 각 PendingIntent 객체의 변경 가능 여부를 지정해야 합니다.
사용자 경험
- 맞춤 알림: 맞춤 콘텐츠 뷰가 포함된 알림은 더 이상 전체 알림 영역을 사용하지 않습니다. 대신 시스템에서 표준 템플릿을 적용합니다. 이 템플릿은 맞춤 알림이 모든 상태에서 다른 알림과 동일한 장식을 보유하도록 합니다. 이 동작은 Notification.DecoratedCustomViewStyle의 동작과 거의 동일합니다.
- Android App Links 인증 변경사항: Android App Link 인증을 사용하는 경우 인텐트 필터가 BROWSABLE 카테고리를 포함하고 HTTPS 스키마를 지원하는지 확인하세요.
성능
- 포그라운드 서비스 실행 제한: Android 12 이상을 타겟팅하려면 앱이 몇 가지 특별한 사례를 제외하고 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작할 수 없습니다. 앱이 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작하려고 하면 예외가 발생합니다(특별한 사례 제외).
- 앱이 백그라운드에서 실행되는 동안 WorkManager를 사용하여 신속 처리 작업을 예약하고 시작해 보세요. 신속히 처리해야 하는 사용자 요청 작업을 완료하려면 정확한 알람 내에서 포그라운드 서비스를 시작하세요.
- 알림 트램펄린 제한사항: 사용자가 알림을 탭하면 일부 앱은 사용자가 보고 상호작용할 수 있는 활동을 시작하는 앱 구성요소를 실행하여 응답합니다. 이 앱 구성요소를 알림 트램펄린이라고 합니다.
- 앱은 알림 트램펄린으로 사용되는 서비스나 broadcast receiver에서 활동을 시작할 수 없습니다. 사용자가 알림 또는 알림의 작업 버튼을 탭하면 앱이 서비스나 broadcast receiver 내부에서 startActivity()를 호출할 수 없습니다.
Android 12(API 수준 31)를 타겟팅하는 앱에 영향을 주는 변경사항을 모두 살펴보세요.
동작 변경사항 확인: Android 12를 타겟팅하는 앱