관리 메뉴

나만을 위한 블로그

[Android] Android 14 변경사항 미리보기 본문

Android

[Android] Android 14 변경사항 미리보기

참깨빵위에참깨빵 2023. 9. 4. 02:11
728x90
반응형

이제 얼마 뒤면 안드로이드 14가 출시된다. 현재 안드로이드 개발자들은 베타 버전을 체험해볼 수 있으며 안드로이드 14를 targetSdkVersion으로 하는 앱을 스토어에 게시할 수도 있다.

곧 새로 출시될 안드로이드 14에서는 어떤 변경사항이 있는지 간단하게 확인해 본다.

 

자체 백그라운드 프로세스만 종료 가능

 

안드로이드 14부터는 앱에서 killBackgroundProcesses()를 호출하면 해당 앱의 프로세스만 종료할 수 있게 된다. 이전까지는 다른 앱들도 덩달아 종료됐던 것 같다.

이 함수는 시스템이 해당 패키지와 관련된 모든 백그라운드 프로세스를 즉시 종료하게 하는 함수로 메모리 회수를 위해 다른 프로세스들을 종료하는 것과 비슷하다. 해당 함수를 사용하는 개발자라면 안드로이드 14부터는 로직 변경을 생각해 보는 게 좋을 것 같다.

 

targetSdkVersion 23부터 안드로이드 14 사용 가능

 

안드로이드 14부터는 targetSdkVersion이 23 이상이어야 한다. 안드로이드 디벨로퍼에 의하면 악성 코드는 최신 안드로이드 OS 버전에 도입된 보안 기능을 우회하기 위해 이전 API 레벨을 대상으로 하는 경우가 많다. 일부 맬웨어 앱은 안드로이드 마시멜로에서 도입된 런타임 권한 적용을 피하기 위해 targetSdkVersion 22를 사용한다. 23보다 낮은 API 레벨을 targetSdkVersion으로 사용하는 앱에선 설치도 안 된다.

다만 기존에 targetSdkVersion이 23보다 낮은 앱을 설치한 상태에서 기기를 안드로이드 14로 업그레이드할 경우, 앱은 설치된 상태가 유지된다. 하지만 이것도 언제까지 지속될지 모르니 targetSdkVersion 업데이트는 해 주는 것이 마음 편할 것이다.

 

앱이 캐시되는 동안 컨텍스트 등록 브로드캐스트가 대기열에 추가됨

 

안드로이드 14부터 앱이 캐시된 상태에 있는 동안 시스템은 컨텍스트 등록 브로드캐스트를 대기열에 추가할 수 있게 된다. 즉 매니페스트에 직접 추가한 정적 브로드캐스트는 대기열에 추가되지 않고, 앱 내 코드로 추가한 동적 브로드캐스트는 추가된다는 뜻이다. 정적 브로드캐스트의 경우 앱은 브로드캐스트를 전달하기 위해 캐시된 상태에서 제거된다.

만약 앱이 포그라운드로 돌아오는 등 캐시된 상태를 벗어나면 시스템은 대기 중이던 모든 브로드캐스트를 전달한다. 이 과정에서 특정 브로드캐스트의 여러 인스턴스가 하나의 브로드캐스트로 병합될 수 있고, 시스템 상태 등에 따라 앱이 캐시된 상태에서 제거되며 이전에 대기열에 올라가 있던 브로드캐스트가 전달된다.

이 부분은 아직 한글 번역이 안 됐기 때문에 안드로이드 14가 정식 출시되고 나서 다시 확인해봐야 할 것 같다. 기존에 정적 브로드캐스트를 사용했던 개발자라면 이 부분을 확인해보는 게 좋다.

 

OpenJDK 17 업데이트

 

안드로이드 14부터 자바 17을 지원한다. 이에 따라 여러 변경사항이 추가됐다.

 

  • 정규 표현식 사용 시 java.util.regex.Matcher 클래스에 의해 IllegalArgumentException이 발생하는 새로운 사례가 나타날 수 있음. 정규 표현식 사용 영역에서 앱을 테스트해야 한다
  • java.util.UUID.fromString()으로 UUID를 만들어 사용하는 경우, 해당 메서드의 입력 매개변수 검사가 더 엄격해졌다. 이로 인해 역직렬화 시 IllegalArgumentException이 발생할 수 있기 때문에 테스트에서 이 변경사항을 사용 중지하려면 특정 플래그로 전환해야 한다
  • ProGuard 사용 시 경우에 따라 java.lang.ClassValue 클래스를 추가하면 앱을 축소, 난독화, 최적화 시 문제가 발생할 수 있다. Class.forName("java.lang.ClassValue")가 클래스를 반환하는지 여부에 따라 런타임 동작을 변경하는 코틀린 라이브러리에서 발생할 수 있다
  • 그 외 java.base 클래스 업데이트, sealed class와 sealed interface 도입, instanceof의 패턴 일치 등 변경사항 존재

 

통화, 알람 제공 앱만 전체 화면 인텐트 권한 사용이 허락됨

 

안드로이드 11(API 30)에선 핸드폰이 잠겨 있는 동안에도 모든 앱에서 Notification.Builder.setFullScreenIntent를 써서 전체 화면 인텐트를 보내는 게 가능했다. 매니페스트에서 USE_FULL_SCREEN_INTENT 권한을 선언하면 앱 설치 시 자동 부여되는데, 안드로이드 14부턴 이 권한을 사용할 수 있는 앱은 통화, 알람 기능을 제공하는 앱으로 한정될 예정이다.

이 변경사항은 2023년 말부터 적용되며 플레이 스토어는 이것을 지키지 않는 앱에서 해당 권한을 취소시킨다. 또한 이 권한은 사용자가 안드로이드 14로 업데이트하기 전에 핸드폰에 설치된 앱의 경우 활성화 상태로 유지된다. 사용자는 이 권한을 켜거나 끌 수 있다.

NotificationManager.canUseFullScreenIntent를 써서 앱에 권한이 있는지 확인할 수 있고, 권한이 없다면 앱은 새 인텐트인 ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT를 써서 사용자가 권한을 부여할 수 있는 설정 페이지를 시작할 수 있다.

 

사용자가 닫을 수 없는 알림을 처리하는 방식 변경

 

안드로이드 14부턴 앱이 사용자에게 닫을 수 없는 포그라운드 알림을 표시하는 경우에도 사용자가 이를 닫을 수 있게 변경된다. 이것은 Notification.Builder.setOngoing(true) 또는 NotificationCompat.Builder.setOngoing(true)를 써서 사용자가 포그라운드 알림을 닫지 못하도록 방지하는 앱에 적용된다. 그러나 아래 조건에 해당된다면 그 알림은 여전히 닫을 수 없는 상태다.

 

  • 핸드폰이 잠금 상태일 때
  • 사용자가 모두 지우기 버튼을 눌러 모든 포그라운드 알림을 지우려는 경우

 

앱 스토어 개선사항

 

안드로이드 14부턴 InstallConstraints API를 통해 앱스토어에서 사용자 환경을 개선할 수 있게 된다.

commitSessionAfterInstallConstraintsAreMet()을 써서 사용자가 앱과 더 이상 상호작용하지 않을 때만 업데이트가 이뤄지게 한다던가, apk 파일이 분할 apk 형태로 제공될 경우 분할 apk가 설치될 때 프로세스를 종료하면 안 된다고 나타내는 등의 기능이 추가된다.

 

ShareSheet 맞춤 작업 추가

 

안드로이드 14부턴 앱에서 호출하는 ShareSheet에 맞춤 작업을 추가할 수 있다. ChooserAction.Builder를 써서 커스텀 ChooserAction을 만들고 Intent.createChooser로 만든 인텐트의 Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS로 ChooserActions 리스트를 지정하면 된다고 한다.

 

 

이런 형태의 ShareSheet를 사용 중인 개발자가 있다면 안드로이드 14 적용 시 커스텀 후 도입을 고려해 보는 것도 좋을 것이다.

 

백그라운드에서 액티비티 시작에 대한 제한사항 추가

 

안드로이드 14부터 시스템은 앱이 백그라운드에서 액티비티를 시작하게 허용하는 시점을 추가로 제한한다.

FCM 구현 시 자주 사용하는 PendingIntent.send()나 비슷한 메서드를 써서 PendingIntent를 전송 시, 대기 중인 인텐트를 시작하기 위해 자체적인 백그라운드 활동 실행 권한을 부여할지 여부를 이제 앱이 선택해야 한다. 선택하려면 앱에서 setPendingIntentBackgroundActivityStartMode(MODE_BACKGROUND_ACTIVITY_START_ALLOWED)가 포함된 ActivityOptions 번들을 전달해야 한다.

또한 bindService()를 써서 백그라운드에 있는 다른 앱의 서비스를 바인딩하는 경우에도 앱은 바운드된 서비스에 자체 백그라운드 액티비티 실행 권한을 부여할지 여부를 선택해야 한다. 선택하려면 앱은 bindService() 호출 시 BIND_ALLOW_ACTIVITY_STARTS 플래그를 포함해야 한다.

악성 앱이 백그라운드에서 사용자한테 방해되는 액티비티가 시작되는 걸 막기 위한 처리라고 하니 이 부분은 한 번 쯤은 잘 읽어보는 편이 좋을 것 같다.

반응형
Comments