brunch

You can make anything
by writing

C.S.Lewis

by Chansuk Yang Mar 25. 2019

안드로이드 Q 백그라운드 엑티비티 실행 제한

개발자를 위한 안드로이드 Q #5

시작하기 전에...

안드로이드 Q 베타 1 버전의 '백그라운드 액티비티 시작 제한' 및 그 외 추가적인 호환성 이슈를 정리해 보았습니다. Q 정식 버전에서는 기능 및 API가 변경될 수 있습니다. 기능에 관한 소감이나 의견은 개인적인 의견으로 회사의 공식 의견과는 다를 수 있습니다. 


TL;DR;

안드로이드 Q부터는 타깃 SDK 관계없이 브로드캐스트 리시버, 백그라운드 / 포그라운드 서비스에서 액티비티를 시작할 수 없습니다. 알람이나 메시지 수신, 락스크린 위 화면 등을 표시하기 위해 백그라운드에서 액티비티를 실행하는 앱들은 주의가 필요합니다. 이 제약 사항은 베타 2부터 기본으로 적용된다고 하며, 베타 1에서는 개발자 옵션을 통해 테스트할 수 있습니다. 


백그라운드 액티비티 시작 제한

안드로이드에서는 FLAG_ACTIVITY_NEW_TASK 플래그를 사용, 백그라운드에서도 액티비티를 시작할 수 있었습니다. 긴급히 전달할 내용이 있는 경우 앱의 상태와 관계없이 바로 액티비티를 시작하는 용도로 유용하게 사용되었지만, 갑자기 광고 화면을 표시하는 등 사용자 경험을 헤치는 경우도 많이 있었습니다. 이 기능이 광고 스팸 등으로 남용되는 것을 막고, 사용자가 의도한 경우에만 액티비티가 시작될 수 있도록 '백그라운드 액티비티 시작 기능'이 제한됩니다.

사용자 인터랙션 없이 백그라운드에서 액티비티를 시작할 수 없습니다. 

이때 백그라운드 여부는 현재 화면을 점유하고 있는지 아닌지를 기준으로 하며, 다시 말해  '포그라운드 서비스' 상에서도 액티비티를 시작할 수 없도록 강제될 것이라고 합니다. 생각보다 많은 앱과 서비스에 영향을 줄 것으로 보입니다. 


다만, 다음과 같은 몇 가지 예외 상황에서는 백그라운드 액티비티 실행이 가능할 것이라고 합니다.

이미 포그라운드에 있는 앱이 액티비티 실행을 위한 PendingIntent를 백그라운드에 있는 앱에 보내는 경우(콘텐츠 공유 등 미리 정해진 PnedingIntent를 통해 앱에서 다른 앱으로 전환하는 경우에 적용될 수 있습니다) 

시스템 서비스에서 PendingIntent를 통해 액티비티를 시작하는 경우 (알림 창에서 사용자가 알림을 클릭해 액티비티를 시작하는 경우에 적용됩니다. 아마도 NFC나 Bluetooth 연결 시 액티비티가 뜨는 것도 이 케이스로 다루어질 것 같네요)

시스템이 특별한 종류의 브로드 캐스트 인텐트를 보내는 경우 (SECRET_CODE_ACTION 등)


그 외는 원칙적으로 백그라운드에서 액티비티를 시작하는 것이 금지됩니다. 다음과 같은 경우 직접적인 영향을 받을 것으로 보입니다. 

사용자 상호작용 없이, AlarmManager, JobScheduler 등을 통해 액티비티를 시작할 수 없습니다. 광고 SDK에서 종종 확인할 수 있는 방식입니다. 

특정 FCM 메시지를 받아 메시지 콜백에서 액티비티를 실행할 수 없습니다. 예를 들어 보이스 콜 요청 FCM 메시지를 받아, 전화 수신 액티비티를 표시할 수 없게 됩니다.

특정 시스템 이벤트 (브로드캐스트 인텐트)를 받아, 액티비티를 시작할 수 없습니다. 일반적으로 널리 사용되는 SCREEN_ON, SCREEN_OFF, BOOT_COMPLETED, PACKAGED_ADDED 등의 인텐트를 받아 액티비티를 시작할 수 없습니다.


현재 베타 1 버전을 기준으로 테스트를 진행해본 결과, 많은 수의 메신저 앱과 락스크린 위에 콘텐츠를 표시하는 앱 동작에 문제를 발견할 수 있었습니다. 이와 달리, SYSTEM_ALERT_WINDOW 권한이 있는 경우 앱이 백그라운드에 있더라도 TYPE_APPLICATION_OVERLAY 타입으로 윈도를 생성해 콘텐츠를 화면에 표시할 수 있더군요. 다만, 안드로이드에서 '백그라운드 액티비티 시작'을 제한하는 의도를 생각해볼 때, Q 정식 출시 후에도 계속 허용될지는 조금 더 지켜봐야 할 것 같습니다. 


알림(Notification)으로 마이그레이션 하기 

안드로이드 Q에서 사용자에게 긴급히 전달한 내용이 있어 꼭 액티비티를 실행시켜야 하는 경우 어떻게 해야 할까요? 공식문서에 따르면 알림(Notification)으로 대체할 수 있다고 합니다. 개인적으로 잘 모르고 있던 기능인데, 이미 허니컴 시절부터 Notification을 만들 때 'FullScreen 인텐트'를 설정할 수 있는 방법이 있었습니다. 알림을 만들 때 Notification.Builder#setFullScreenIntent() 메서드를 사용 PendingIntent를 설정한 후, 중요도가 높은 채널을 통해 알림을 표시하면, 시스템 노티 바에 알림이 표시되며, 동시에 지정된 액티비티가 시작됩니다. 공식 문서에 나온 아래 코드를 참고하시면 좋을 것 같습니다 (중요도는 알림 채널 값을 따르게 됩니다). 

알림을 통해 백그라운드에서 액티비티를 시작할 수 있지만. 기존 방식과 몇 가지 차이가 있습니다. 

사용자가 디바이스를 사용 중인 경우 (디바이스 화면이 켜져 있는 경우), 액티비티가 실행되는 대신 헤드업(Head-up) 알림이 표시됩니다. 사용자가 알림을 터치하면 액티비티가 실행됩니다. 

사용자가 디바이스를 사용 중일 때는 헤드업 알림이 표시됩니다.

사용자는 설정 메뉴에서 언제든지 '알림 채널 설정'을 변경할 수 있습니다 (중요도 변경 등). 이 경우 액티비티가 실행되지 않을 수 있습니다. 

사용자가 방해금지 모드(DND - Do Not Distrub)를 설정해둔 경우, 액티비티가 실행되지 않습니다. 


또 한 가지 안드로이드 Q 이상 버전으로 타깃 하는 경우, 'FullScreen 인텐트'를 사용하려면 새로 추가된 USE_FULL_SCREEN_INTENT 권한이 필요합니다. 다행히 'normal' 타입 권한이라, 매니페스트 선언 외 추가 작업은 필요 없지만, 아마도 '백그라운드 액티비티 시작 제한' 이후, 'FullScreen 인텐트'가 너무 남용되는 것을 막기 위한 사전 조치로 예상됩니다. 


테스트

앞 서 이야기드린 대로, 베타 1 버전에서 '백그라운드 액티비티 시작 제한'은 기본 적용되지 않습니다. 아래와 같이 개발자 옵션의 ‘백그라운드 활동 시작 허용' 옵션을 비활성화한 후 테스트 가능합니다. 이후, 백그라운드에서 액티비티를 실행하면, 액티비티가 시작되지 않고, 대신 오류 메시지가 토스트 형태로 표시됩니다. 

개발자 옵션의 백그라운드 활동 시작 허용 메뉴

추가로 로그 캣상에서는 다음과 같은 로그를 볼 수 있습니다. 기본적으로 액티비티를 실행하는 앱 프로세스가 포그라운드에 있는지, 시스템 서비스이거나 예외 처리된 프로세스인지 등등을 확인하는 것으로 보입니다. 

ActivityTaskManager: Background activity start [callingPackage: com.google.android.gms.location.sample.geofencing; callingUid: 10168; isCallingUidForeground: false; isCallingUidPersistentSystemProcess: false; realCallingUid: 10168; isRealCallingUidForeground: false; isRealCallingUidPersistentSystemProcess: false; originatingPendingIntent: null; isBgStartWhitelisted: false;
...


그 밖의 테스트가 필요한 호환성 이슈

지금까지 다룬 내용 외에도, 앱 호환성 관련하여 주의가 필요한 부분이 많이 있습니다. 부록 삼아, 그중 두 가지만 더 언급하려고 합니다. 


보안 모듈 호환성 - 안드로이드 플랫폼이 업데이트될 때마다 자주 일어나는 현상입니다. 디바이스 무결성을 체크하는 앱의 경우, 베타 단계로 배포되는 안드로이드 버전에서는 앱 실행 자체가 불가능한 경우가 종종 있습니다. 금융 등 아주 민감한 정보를 다루는 경우, 충분히 이해할 수 있는 정책입니다. 다만, 보안 모듈 외에도 플랫폼 호환성 문제가 있는 경우, 개발사 내부적으로 호환성 테스트를 빨리 진행하지 않으면, 호환성 이슈를 발견하는 시기가 늦어질 수 있습니다 (외부 사용자 및 테스트 그룹은 보안 모듈 이슈로 테스트를 진행할 수 없음으로) 특히 이번 Q 버전에는 굉장히 많은 변화가 예고되어 있는 만큼, 개발사 내부적으로 가능한 한 빨리 별도의 테스트 환경을 꾸려, 호환성 테스트를 진행하면 좋을 것 같습니다. 

대부분의 금융 앱은 아직 Q에서 실행되지 않습니다. 

비 SDK 인터페이스 사용 제한 - 이전 P 버전과 마찬가지로, 공식 SDK에 포함되지 않은 숨겨진 API 사용이 제한됩니다. 아직 기존 API를 대체할 수 있는 대안이 없는 경우에는 한시적으로 숨겨진 API를 사용할 수 있도록 그레이리스트가 유지됩니다. 다만, 플랫폼이 버전업 되는 만큼, 이전 P 버전에서 그레이리스트에 포함되었던 API 중 상당수가 블랙리스트로 이동했습니다. 새롭게 블랙리스트로 옮겨간 API를 사용하고 있지는 않은지 테스트가 필요합니다. 테스트는 StrictMode API를 사용하거나, 아래와 같은 로그 캣 로그를 확인하는 방식으로 진행할 수 있습니다. 

안드로이드 Q 베타 1 마무리

지금까지 안드로이드 Q의 주요 변화 중, 앱 개발 시 큰 영향을 끼칠 것 같은 변경 사항을 나름 정리하여, 아래와 같은 다섯 번의 포스트로 나누어 살펴보았습니다. 

1. 사용자 정보를 보호하기 위한 변경 사항 훑어보기

2. 새로운 외부 저장소 정책 - 'Scoped Storage'

3. 초기화할 수 없는 하드웨어 고유 식별자 사용 금지

4. 새로운 기기 위치 접근 권한 - '앱 사용 중 허가'

5. 백그라운드 액티비티 시작 제한  


하나하나가 강력합니다. 개인적으로 안드로이드가 정말로 사용자 정보 보호 및 투명한 권한 관리를 위해 과감한 변화를 꾀하고 있다고 느껴집니다. 런타임 권한과  Doze 모드가 처음 소개된 안드로이드 6.0이 개발자에게 가장 큰 영향을 준 업데이트라고 여겨졌는데, 이번 Q 버전은 그에 버금가는 변화가 될 것으로 예상됩니다. 그런 만큼, 아직 모든 기능과 API가 결정되진 않은 첫 번째 베타이지만, 가능한 한 빨리 많은 개발자분들이 자신의 앱을 테스트해보기 권장드립니다.


참고로, 지금까지 발행한 다섯 번의 포스트를 포함하여, 안드로이드 Q 관련 이야기는 '개발자를 위한 안드로이드 Q 정리'라는 브런치 매거진 형태로 배포할 계획입니다. 우선적으로 베타 1 버전에는 개발자들의 주의가 필요한 (그래서 무서운) 동작 변경 사항에 관해 주로 다루었지만, 이후 베타 2 버전이 공개되면, 개발자 입장에서 재밌고 새롭게 적용해볼 만한 신기능에 관해서도 다루어 볼 예정입니다 (그런 게 있겠죠?) '개발자를 위한 안드로이드 Q 정리 매거진'에 많은 관심 부탁드립니다 : ) 

 


매거진의 이전글 안드로이드 Q 새로운 기기 위치 접근 권한
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari