Target SDK 버전을 33으로 올렸더니 앱이 터지기 시작했다: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.

2023. 4. 7. 10:30Programming/Android

반응형

  한동안 방치해뒀던 안드로이드 앱이 무려 구글스토어에서 검색이 안된다는 얘기가 들어와서(...) 살펴보니, 타겟 SDK버전이 낮아서 그런 것 같았다. 왜 방치해뒀는지는 차치해두고(...) 그동안 미뤄왔던 뷰 바인딩을 적용하는 등 코드를 말끔하게 뜯어고치고 있다가, 갑자기 앱이 강제 종료됐다. 깜짝 놀라서 로그캣을 살펴보니 다음과 같은 문구가 빨간색으로 떠 있었다.

FATAL EXCEPTION: Firebase-Messaging-Intent-Handle Process: <앱 이름>, PID: 9058
java.lang.IllegalArgumentException: <앱 이름>: 
Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE 
or FLAG_MUTABLE be specified when creating a PendingIntent. 
Strongly consider using FLAG_IMMUTABLE, 
only use FLAG_MUTABLE if some functionality depends on 
the PendingIntent being mutable, 
e.g. if it needs to be used with inline replies or bubbles.

  웜멈매 이게 뭐시당가... 하고 습관처럼 구글에 검색을 때려넣으려다 놀란 가슴을 쓸어내리고 찬찬히 읽어보니, 그동안 겪어왔던 수 많은 예외 문구에 비하면 너무나도 친절한 설명이었다. 위의 내용을 읽어보면 대충 다음과 같은 내용이다.:

심각한 예외: 파이어베이스 메시징 인텐트 핸들러 프로세스: 인자값이 잘못됐는뎁쇼.
SDK 버전 31 이상이면 PendingIntent() 만들 때 FLAG_IMMUTABLE 아님 FLAG_MUTABLE 쓰셔야되는디.
애지간하면 FLAG_IMMUTABLE 쓰시구, '즉시 응답하기' 혹은 '버블'같은 기능 구현할라고 
PendingIntent를 수정해야될 것 같으면 FLAG_MUTABLE쓰십셔.

  예외 문구에 나와있는대로 PendingIntent.getActivity()로 PendingIntent 객체를 만들 때, 마지막 인자값인 Flags에 PendingIntent.FLAG_IMMUTABLE을 넣어주니 더 이상 예외가 동작하지 않는 것을 확인할 수 있었다.

val pendingIntent: PendingIntent = PendingIntent.getActivity(
  this,
  0,
  intent,
  PendingIntent.FLAG_IMMUTABLE
)

  좋아, 그렇다면 문제를 해결했으니, PendingIntent가 뭘 해주는 녀석이길래 수정 가능 여부를 지정하는게 갑자기 이렇게 중요해진걸까? 안드로이드 개발 문서에서 PendingIntent에 대한 설명을 찾아봤다. 아래 내용은 https://developer.android.com/reference/android/app/PendingIntent에서 찾아볼 수 있다.

안드로이드 문서에 설명되어있는 PendingIntent. 대충 다른 프로세스에서 Intent를 실행할 수 있게끔 위임해주는 녀석이다.

  대충 번역기를 돌려보면 다른 프로세스에서 Intent를 실행할 수 있게끔 위임해주는 녀석이라는 것을 알 수 있다. 한국에서 나고 자란지 어언 30년, 기초교육과정 12년에 더해 어떻게건 영어를 배워보려고 반평생을 노력했으나 결국 영어랑은 거리가 좁혀지지 않은 나에게 영문 문서는 어렵지만, 다행히도 안드로이드 문서는 한글 번역을 지원한다.

  근데 이 페이지는 아님.

  PendingIntent에 대한 내용은 haero_kim님의 블로그에 잘 정리되어있다 : https://velog.io/@haero_kim/Android-PendingIntent-%EA%B0%9C%EB%85%90-%EC%9D%B5%ED%9E%88%EA%B8%B0

 

[Android] PendingIntent 개념 익히기

'그냥 인텐트랑 뭐가 다른거지..' 하셨던 여러분들을 위해

velog.io


  한창 ChatGPT가 유행하고 있는 2023년 4월이니까, ChatGPT에게 PendingIntent에게 위의 내용을 물어보도록 하자.

  어째서인지 요약은 하지 않고 풀 버전을 번역해서 설명해주려다가, 응답이 짤려버리는 상황이 발생했다. 문제는 '이어서 설명해줘', '계속 설명해줘'라고 요청해도 어째서인지 처음부터 다시 설명해주는 것이 아닌가...

  더 이상 귀찮아진 나머지 '요약해서 설명해줘'라고 요청하니 깔끔하게 요약해서 설명해줬다. 와! 편리해!

  결국 PendingIntent는 나중에 다른 앱에서 동작을 수행하도록 하기 위해 만드는 녀석이며, 일반적으로 푸시 메시지를 사용할 때 '앱이 종료된 상황에서도' 푸시 메시지에 대한 처리를 하기 위해서 사용한다는 것을 알 수 있다. 

 

  좋아, 오늘은 이걸로 정리 끗 ' ㅇ')/

반응형