Android 14 타겟팅시 포그라운드 서비스(FGS)에 대한 새로운 제한 시작됨!! FOREGROUND_SERVICE_SPECIAL_USE 특수용도를 선언해서 해결해야할 것 같다.
- 기기 및 네트워크 악용 정책에 새로운 가이드라인이 추가됩니다.
- 앱의 주요 기능으로 다른 앱 설치를 유도하거나 앱 평가 또는 리뷰 작성을 유도하는 앱은 허용되지 않음을 명시하도록 사용자 평점, 리뷰, 설치 수 정책이 업데이트됩니다.
포그라운드 서비스 사용
포그라운드 서비스 권한은 사용자 대상 포그라운드 서비스가 적절히 작동하는 데 필요합니다. Android 14 이상을 타겟팅하는 앱의 경우 앱에 사용되는 포그라운드 서비스마다 유효한 포그라운드 서비스 유형을 지정하고 해당 유형에 적합한 포그라운드 서비스 권한을 선언해야 합니다. 예를 들어 앱의 사용 사례에서 지도 위치정보가 필요한 경우 앱의 매니페스트에서 FOREGROUND_SERVICE_LOCATION 권한을 선언해야 합니다.
systemExempted 및 shortService 포그라운드 서비스 유형을 제외하고, 포그라운드 서비스가 다음과 같이 사용되는 경우에만 앱에서 포그라운 서비스 권한을 선언할 수 있습니다.
- 사용자에게 유용하며 앱의 핵심 기능과 관련이 있는 기능을 제공함
- 사용자가 포그라운드 서비스 사용을 시작하거나 인식할 수 있음(예: 노래 재생 소리, 다른 기기에 미디어 전송, 정확하고 명확한 사용자 알림, 사진을 클라우드에 업로드하기 위한 사용자 요청)
- 사용자가 포그라운드 서비스 사용을 종료하거나 중단할 수 있음
- 부정적인 사용자 경험 또는 사용자가 예상한 기능의 오작동을 초래하지 않고는 시스템에서 서비스를 중단하거나 지연할 수 없음(예: 전화 통화는 즉시 시작되어야 하고 이를 시스템에서 지연하지 못함)
- 작업을 완료하기 위해 필요한 시간 동안만 권한이 실행됨
포그라운드 서비스 사용에 관한 자세한 내용은 여기를 참고하세요.
백그라운드에서 활동 시작에 대한 추가 제한 사항
Android 14를 대상으로 하는 앱의 경우 시스템은 앱이 백그라운드에서 활동을 시작하도록 허용되는 시기를 추가로 제한합니다.
- 앱이 PendingIntentusing PendingIntent#send() 또는 유사한 메서드를 보낼 때 보류 중인 의도를 시작하기 위해 자체 백그라운드 활동 시작 권한을 부여하려는 경우 앱은 이제 옵트인해야 합니다. 옵트인하려면 앱이 ActivityOptions번들을 전달해야 합니다 setPendingIntentBackgroundActivityStartMode(MODE_BACKGROUND_ACTIVITY_START_ALLOWED).
- 보이는 앱이 메서드를 사용하여 백그라운드에 있는 다른 앱의 서비스를 바인딩할 때 bindService() 바인딩된 서비스에 자체 백그라운드 활동 시작 권한을 부여하려면 보이는 앱이 이제 옵트인해야 합니다. BIND_ALLOW_ACTIVITY_STARTS 옵트인하려면 메서드 를 호출할 때 앱에서 플래그를 포함해야 합니다 bindService().
이러한 변경 사항은 악성 앱이 API를 남용하여 백그라운드에서 파괴적인 활동을 시작하는 것을 방지하여 사용자를 보호하기 위해 기존 제한 세트를 확장합니다.
대상 API 수준 준수 기한에 관한 새로운 공지사항
- 원활한 전환을 돕고 새로운 앱 및 앱 업데이트의 대상 API 수준 준수 기한과 관련한 개발자들의 혼란을 막기 위해 기한을 매년 8월 31일로 통일했습니다. 대상 API 수준 31 이상을 타겟팅하도록 앱을 업데이트하기 위해 시간이 더 필요한 경우 요청을 통해 2023년 11월 1일까지 기한을 연장할 수 있습니다.
포그라운드 서비스 유형의 필수 사양
3년 전 안드로이드 11의 새로운 기능을 소개하면서 구글이 프론트엔드 서비스 형태의 개념을 도입했다.
하지만 당시 프런트 데스크의 서비스 유형은 위치, 카메라, 마이크의 세 가지 유형으로 비교적 단순했다. Foreground Service에서 특정 권한을 사용하려면 해당 권한의 Foreground Service 타입을 AndroidManifest.xml에 선언해야 한다.
예를 들어 포그라운드 서비스에서 사용자의 위치 정보를 얻으려면 위치라는 포그라운드 서비스의 유형을 선언해야 합니다.
<manifest>
...
<service ...
android:foregroundServiceType="location" />
</manifest>
동시에 여러 권한을 사용하려는 경우 여러 포그라운드 서비스 유형을 한 번에 선언할 수도 있다.
<manifest>
...
<service ...
android:foregroundServiceType="location|camera|microphone" />
</manifest>
그 후 Android 12 및 Android 13 시스템에 몇 가지 새로운 유형이 차례로 추가되었다.
Android 14까지는 포그라운드 서비스 유형 선언이 필수이다. 그러나 targetSdkVersion이 Android 14 이상으로 지정된 앱에만 유효하다. 즉, 앞으로 프런트 데스크 서비스는 여는 것만으로는 열리지 않을 것이다. 열어야 할 이유가 있어야한다. 포그라운드 서비스 유형을 선언하여 포그라운드 서비스를 여는 목적이 무엇인지 시스템에 알려야한다.
지금까지 Android 14 Developer Preview 버전에서는 총 13가지의 포그라운드 Service 유형을 정의했으며, 각 유형도 AndroidManifest.xml 파일에 함께 선언해야 하는 포그라운드 Service 권한에 해당한다.
<포그라운드 서비스 유형과 권한 간의 관계>
카메라 FOREGROUND_SERVICE_CAMERA
연결된 장치 FOREGROUND_SERVICE_CONNECTED_DEVICES
데이터싱크 FOREGROUND_SERVICE_DATA_SYNC
건강 FOREGROUND_SERVICE_HEALTH
위치 FOREGROUND_SERVICE_LOCATION
미디어 재생 FOREGROUND_SERVICE_MEDIA
미디어 프로젝션 FOREGROUND_SERVICE_MEDIA_PROJECTION
마이크로폰 FOREGROUND_SERVICE_MICROPHONE
전화 FOREGROUND_SERVICE_PHONE_CALL
원격 메시징 FOREGROUND_SERVICE_REMOTE_MESSAGING
짧은 서비스 필요 없음
특별한 용도 FOREGROUND_SERVICE_SPECIAL_USE
시스템 면제됨 FOREGROUND_SERVICE_SYSTEM_EXEMPTED
포그라운드 서비스에서 실행하려는 비즈니스 로직에 따라 가장 적합한 관계를 가진 하나 이상의 포그라운드 서비스 유형을 선택해야한다.
실제로 적합한 유형이 없으면 보장된 유형으로 간주할 수 있는 specialUse 유형을 선택해야한다.
나의 경우 해당사항이 존재하지 않는다. 그래서 어쩔 수 없이 특별한 용도(specialUse) 유형의 권한을 선언해야 할 것 같다.
샘플 코드는 다음과 같다.
<manifest ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<application ...>
<service
android:name=".MyForegroundService"
android:foregroundServiceType="specialUse"
android:permission="android.permission.FOREGROUND_SERVICE_SPECIAL_USE"
android:exported="false">
</service>
</application>
</manifest>
주의할 점은 specialUse 유형은 Play 스토어에 제출될 때 Google에서 검토하며 몇 가지 추가 설명이 필요할 수 있다. (관문이 될 것인가? 단순히 구글에 알림용도가 될 것인지는 개발자 콘솔 사이트가 업데이트 되어봐야 알 것 같다.)
만약 플레이 스토어에 올리지 않는 앱이라면 이런 걱정은 안해도 된다.
포그라운드 서비스 유형( 필수 항목 )
개발자가 사용자 대면 포 그라운드 서비스를 보다 의도적으로 정의할 수 있도록 Android 10에서는 요소 android:foregroundServiceType 내에 속성을 도입했습니다 <service>.
앱이 Android 14를 대상으로 하는 경우 적절한 포그라운드 서비스 유형을 지정해야 합니다. 이전 버전의 Android와 마찬가지로 여러 유형을 결합할 수 있습니다. 이 목록은 선택할 수 있는 포그라운드 서비스 유형을 보여줍니다.
- camera
- connectedDevice
- dataSync
- health
- location
- mediaPlayback
- mediaProjection
- microphone
- phoneCall
- remoteMessaging
- shortService
- specialUse
- systemExempted
앱의 사용 사례가 이러한 유형과 연결되지 않은 경우 WorkManager 또는 사용자 시작 데이터 전송 작업을 사용하도록 로직을 마이그레이션하는 것이 좋습니다 .
, health, remoteMessaging, shortService, specialUse및 systemExempted 유형은 Android 14의 새로운 기능입니다.
다음 코드 스니펫은 매니페스트에서 포그라운드 서비스 유형 선언의 예를 제공합니다.
<manifest ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<application ...>
<service
android:name=".MyMediaPlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="false">
</service>
</application>
</manifest>
Android 14를 대상으로 하는 앱이 매니페스트에서 지정된 서비스의 유형을 정의하지 않는 경우 시스템은 해당 서비스를 MissingForegroundServiceTypeException 호출할 때 발생합니다.startForeground()
포그라운드 서비스 유형을 사용하기 위한 새 권한 선언
Android 14를 대상으로 하는 앱이 포그라운드 서비스를 사용하는 경우 Android 14가 도입하는 포그라운드 서비스 유형에 따라 특정 권한을 선언해야 합니다. 이러한 권한은 이 페이지의 각 포그라운드 서비스 유형 섹션에 대한 의도된 사용 사례 및 시행 에서 “매니페스트 파일에서 선언해야 하는 권한” 레이블이 지정된 섹션에 나타납니다 .
모든 권한은 일반 권한 으로 정의되며 기본적으로 부여됩니다. 사용자는 이러한 권한을 취소할 수 없습니다.
주의: 적절한 포그라운드 서비스 유형 권한을 선언하지 않고 호출하면 startForeground()시스템에서 SecurityException.
런타임 시 포그라운드 서비스 유형 포함
startForeground()포그라운드 서비스를 시작하는 애플리케이션에 대한 모범 사례는 포그라운드 서비스 유형의 비트 정수를 전달하는 오버로드된 버전을 사용하는 것입니다 . 하나 이상의 유형 값을 전달하도록 선택할 수 있습니다.
일반적으로 특정 사용 사례에 필요한 유형만 선언해야 합니다. 이렇게 하면 각 포그라운드 서비스 유형에 대한 시스템의 기대치를 더 쉽게 충족할 수 있습니다. 포그라운드 서비스가 여러 유형으로 시작되는 경우 포그라운드 서비스는 모든 유형의 플랫폼 적용 요구 사항을 준수해야 합니다.
startForeground()그러나 다음 유형 중 하나를 사용하는 포그라운드 서비스를 시작하는 경우 해당 서비스를 호출할 때마다 항상 유형을 포함해야 합니다 .
Service.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)
포그라운드 서비스 유형이 호출에 지정되지 않은 경우 매니페스트에 정의된 값이 기본적으로 사용됩니다.
시스템 런타임 검사
시스템은 포그라운드 서비스 유형의 적절한 사용을 확인하고 앱이 적절한 런타임 권한을 요청했는지 또는 필수 API를 사용하는지 확인합니다. 예를 들어 시스템은 포그라운드 서비스 유형 유형을 사용하는 앱이 또는 를 FOREGROUND_SERVICE_TYPE_LOCATION요청할 것으로 예상합니다 .ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION
이는 앱이 사용자에게 권한을 요청하고 포그라운드 서비스를 시작할 때 매우 특정한 작업 순서를 따라야 함을 의미합니다. 앱이 호출을 시도하기 전에 권한을 요청하고 부여해야 합니다 startForeground(). 포그라운드 서비스가 시작된 후 적절한 권한을 요청하는 앱은 포그라운드 서비스를 시작하기 전에 이 작업 순서를 변경하고 권한을 요청해야 합니다.
주의: 앱이 포그라운드 서비스를 시작하기 위한 모든 런타임 요구 사항을 충족하지 않는 경우 해당 서비스를 호출한 후 시스템에서 오류를 발생시킵니다 . 이렇게 하면 포그라운드 서비스가 시작되지 않고 실행 중인 포그라운드 서비스가 포그라운드 프로세스 상태에서 제거될 수 있으며 앱이 충돌할 수 있습니다.SecurityExceptionstartForeground()
플랫폼 적용의 세부 사항은 이 페이지의 각 포그라운드 서비스 유형 섹션에 대한 적용 및 의도된 사용 사례의 “런타임 요구 사항” 섹션에 표시됩니다 .
각 포그라운드 서비스 유형에 대한 의도된 사용 사례 및 시행
지정된 포그라운드 서비스 유형을 사용하려면 매니페스트 파일에서 특정 권한을 선언하고 특정 런타임 요구 사항을 충족해야 하며 앱은 해당 유형에 대해 의도된 사용 사례 집합 중 하나를 충족해야 합니다. 다음 섹션에서는 선언해야 하는 권한, 런타임 요구 사항 및 각 유형의 의도된 사용 사례에 대해 설명합니다.
카메라
매니페스트 파일에서 선언해야 하는 권한FOREGROUND_SERVICE_CAMERA런타임 요구 사항CAMERA런타임 권한 요청설명멀티태스킹이 가능한 화상 채팅 앱과 같이 백그라운드에서 카메라에 계속 액세스합니다.
연결된 장치
매니페스트 파일에서 선언해야 하는 권한FOREGROUND_SERVICE_CONNECTED_DEVICE런타임 요구 사항
다음 조건 중 하나 이상이 참이어야 합니다.
- 매니페스트에서 다음 권한 중 하나 이상을 선언합니다.
- 다음 런타임 권한 중 하나 이상을 요청합니다.
- 부르다UsbManager.requestPermission()
설명
Bluetooth, NFC, IR, USB 또는 네트워크 연결이 필요한 외부 장치와의 상호 작용.
참고: 앱이 프로젝션 또는 원격 메시징 작업을 수행하는 경우 해당 미디어 프로젝션 또는 원격 메시징 유형을 대신 사용하십시오.
데이터 동기화
매니페스트 파일에서 선언해야 하는 권한FOREGROUND_SERVICE_DATA_SYNC런타임 요구 사항없음설명
다음과 같은 데이터 전송 작업:
- 데이터 업로드 또는 다운로드
- 백업 및 복원 작업
- 작업 가져오기 또는 내보내기
- 데이터 가져오기
- 로컬 파일 처리
- 네트워크를 통해 장치와 클라우드 간에 데이터 전송
참고: 향후 Android 버전에서는 이 포그라운드 서비스 유형이 더 이상 사용되지 않습니다. WorkManager 또는 사용자 시작 데이터 전송 작업을 사용하도록 마이그레이션하는 것이 좋습니다 .
건강
미리보기: Android 14의 새로운 기능입니다.매니페스트 파일에서 선언해야 하는 권한FOREGROUND_SERVICE_HEALTH런타임 요구 사항
다음 조건 중 하나 이상이 참이어야 합니다.
- HIGH_SAMPLING_RATE_SENSORS매니페스트에서 권한 을 선언합니다 .
- 다음 런타임 권한 중 하나 이상을 요청합니다.
설명
운동 추적기와 같은 피트니스 카테고리의 앱을 지원하기 위한 장기 실행 사용 사례.
위치
매니페스트 파일에서 선언해야 하는 권한FOREGROUND_SERVICE_LOCATION런타임 요구 사항
다음 런타임 권한 중 하나 이상을 요청합니다.
설명
내비게이션 및 위치 공유와 같이 위치 액세스가 필요한 장기 실행 사용 사례.
미디어
매니페스트 파일에서 선언해야 하는 권한FOREGROUND_SERVICE_MEDIA_PLAYBACK런타임 요구 사항없음설명백그라운드에서 오디오 또는 비디오 재생을 계속합니다. Android TV 에서 디지털 비디오 녹화(DVR) 기능을 지원합니다 .
미디어 프로젝션
매니페스트 파일에서 선언해야 하는 권한FOREGROUND_SERVICE_MEDIA_PROJECTION런타임 요구 사항메서드를 호출합니다 createScreenCaptureIntent().설명API를 사용하여 기본이 아닌 디스플레이 또는 외부 장치에 콘텐츠를 투사합니다 MediaProjection. 이 콘텐츠는 독점적인 미디어 콘텐츠일 필요는 없습니다. Cast SDK는 제외됩니다 .
마이크로폰
매니페스트 파일에서 선언해야 하는 권한FOREGROUND_SERVICE_MICROPHONE런타임 요구 사항런타임 권한을 요청합니다 RECORD_AUDIO.설명음성 녹음기 또는 통신 앱과 같은 백그라운드에서 마이크 캡처를 계속합니다.
전화
매니페스트 파일에서 선언해야 하는 권한FOREGROUND_SERVICE_PHONE_CALL런타임 요구 사항MANAGE_OWN_CALLS매니페스트 파일에서 권한 을 선언합니다 .설명API를 사용하여 진행 중인 통화를 계속합니다 ConnectionService.
원격 메시징
미리보기: Android 14의 새로운 기능입니다.매니페스트 파일에서 선언해야 하는 권한FOREGROUND_SERVICE_REMOTE_MESSAGING런타임 요구 사항없음설명한 장치에서 다른 장치로 문자 메시지를 전송합니다. 사용자가 장치를 전환할 때 메시징 작업의 연속성을 지원합니다.
짧은 서비스
미리보기: Android 14의 새로운 기능입니다.매니페스트 파일에서 선언해야 하는 권한없음런타임 요구 사항없음설명
중단하거나 연기할 수 없는 중요한 작업을 신속하게 완료합니다.
이 유형에는 몇 가지 고유한 특성이 있습니다.
- 짧은 시간(약 3분) 동안만 실행할 수 있습니다.
- 고정 포그라운드 서비스를 지원하지 않습니다 .
- 다른 포그라운드 서비스를 시작할 수 없습니다.
- 여전히 권한이 필요하지만 유형별 권한이 필요 하지 않습니다 FOREGROUND_SERVICE.
- 실행 중인 포그라운드 서비스는 유형으로 또는 유형에서 변경할 수 없습니다 shortService .
shortService에 대한 제한 시간은 호출되는 순간부터 시작됩니다 Service.startForeground(). 앱이 호출하거나 시간 초과가 발생하기 전에 예상 Service.stopSelf()됩니다 Service.stopForeground(). 그렇지 않으면 새 항목이 호출되어 앱이 서비스를 호출 하거나 중지할 수 Service.onTimeout()있는 짧은 기회를 제공합니다 .stopSelf()stopForeground()
가 호출된 후 잠시 후 Service.onTimeout()앱은 캐시된 상태 로 들어가고 사용자가 앱과 적극적으로 상호 작용하지 않는 한 더 이상 포그라운드에 있는 것으로 간주되지 않습니다. 앱이 캐시되고 서비스가 중지되지 않은 후 잠시 후 앱이 ANR을 수신 합니다 . ANR 메시지는 을 언급합니다 FOREGROUND_SERVICE_TYPE_SHORT_SERVICE. 이러한 이유로 Service.onTimeout()콜백을 구현하는 것이 모범 사례로 간주됩니다.
Android 13 이하에는 콜백 Service.onTimeout()이 없습니다. 동일한 서비스가 이러한 장치에서 실행되는 경우 시간 초과를 받지 않으며 ANR도 발생하지 않습니다. 아직 콜백을 받지 않았더라도 서비스가 처리 작업을 완료하는 즉시 중지되는지 확인하십시오 Service.onTimeout() .
의 시간 제한이 shortService준수되지 않으면 앱에 다른 유효한 포그라운드 서비스가 있거나 다른 앱 수명 주기 프로세스가 실행 중인 경우에도 앱이 ANR이 발생한다는 점에 유의해야 합니다.
앱이 사용자에게 표시되거나 포그라운드 서비스가 백그라운드에서 시작되도록 허용하는 예외Service.StartForeground() 중 하나를 충족하는 경우 매개변수 를 사용하여 다시 호출하면 FOREGROUND_SERVICE_TYPE_SHORT_SERVICE제한 시간이 3분 더 연장됩니다. 앱이 사용자에게 표시되지 않고 예외 중 하나를 충족하지 않는 경우 유형에 관계없이 다른 포그라운드 서비스를 시작하려고 하면 ForegroundServiceStartNotAllowedException.
사용자가 앱에 대한 배터리 최적화를 비활성화해도 여전히 shortService FGS의 시간 초과에 영향을 받습니다.
유형 및 다른 포그라운드 서비스 유형을 포함하는 포그라운드 서비스를 시작하면 shortService시스템은 shortService유형 선언을 무시합니다. 그러나 서비스는 여전히 선언된 다른 형식의 요구 사항을 준수해야 합니다.
특수 용도
미리보기: Android 14의 새로운 기능입니다.
다른 포그라운드 서비스 유형에서 다루지 않는 유효한 포그라운드 서비스 사용 사례를 다룹니다.
포그라운드 서비스 유형을 선언하는 것 외에도 FOREGROUND_SERVICE_TYPE_SPECIAL_USE 개발자는 매니페스트에서 사용 사례를 선언해야 합니다. 이를 위해 요소 <property>내에서 요소를 지정합니다 <service>. 이러한 값과 해당 사용 사례는 Google Play Console에서 앱을 제출할 때 검토됩니다.
<service android:name="fooService" android:foregroundServiceType="specialUse">
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="foo"/>
</service>
시스템 면제
미리보기: Android 14의 새로운 기능입니다.
포그라운드 서비스를 계속 사용하기 위해 시스템 응용 프로그램 및 특정 시스템 통합용으로 예약되어 있습니다.
이 유형을 사용하려면 앱이 다음 기준 중 하나 이상을 충족해야 합니다.
- 장치가 데모 모드 상태입니다.
- 앱이 기기 소유자임
- 앱이 프로파일러 소유자임
- ROLE_EMERGENCY역할이 있는 안전 앱
- 장치 관리자 앱
- 앱 보유 SCHEDULE_EXACT_ALARM또는 USE_EXACT_ALARM 권한.
그렇지 않으면 이 유형을 선언하면 시스템에서 ForegroundServiceTypeNotAllowedException.
포그라운드 서비스 유형 사용에 대한 Google Play 정책 시행
2023년 4 월 Google Play 정책 업데이트에는 기기 및 네트워크 악용 정책 의 변경사항이 포함됩니다 . FOREGROUND_SERVICE이러한 새로운 정책은 특히 해당 유형이 시스템 기대치와 일치하지 않는 경우 앱이 권한을 선언할 수 있는 시기와 방법을 제한합니다 .
[reference]
- https://developer.android.com/about/versions/14/changes/fgs-types-required
- https://developer.android.com/about/versions/14/behavior-changes-14
- https://support.google.com/googleplay/android-developer/answer/13315670