Android/error

[Error] Android 12 PendingIntent Flag 이슈 대응

mins9273 2024. 11. 20. 14:31
반응형

 

Android 12(API 31) 이상을 대상으로 앱을 빌드하거나 실행할 경우,

PendingIntent를 생성할 때 FLAG_IMMUTABLE 또는 FLAG_MUTABLE 플래그를 반드시 명시해야 합니다.

이를 지정하지 않을 경우 컴파일 또는 실행 시 다음과 같은 에러 또는 경고를 만날 수 있습니다.

 

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.

 

 

이는 보안성과 동작 일관성을 강화하기 위해 추가된 요구사항입니다.

PendingIntent의 동작 및 플래그의 목적을 이해하고 올바르게 사용하는 것이 중요합니다.

 

 

PendingIntent란?

PendingIntent는 안드로이드에서 다른 앱이나 시스템에서 실행할 작업을 미리 정의하고,

특정 시점에 실행되도록 예약할 수 있는 객체입니다.


예: 알림을 클릭했을 때 앱 화면 열기, 알람 설정, 서비스 시작 등.

 

 

FLAG_IMMUTABLE와 FLAG_MUTABLE의 정의

PendingIntent의 mutable(변경 가능) 또는 immutable(변경 불가능) 상태를 정의합니다.

 

FLAG_IMMUTABLE

  • 의미: PendingIntent가 생성된 후, 내부의 Intent 데이터를 변경할 수 없습니다.
  • 특징: 보안성이 높음, PendingIntent 악의적인 코드나 다른 앱에 의해 수정될 가능성을 차단
    안드로이드 12(API 31) 이상에서 기본적으로 권장
  • 적합한 경우:PendingIntent의 데이터가 고정적이고 변경될 필요가 없는 경우
    예: 알림 클릭 시 고정된 동작 실행, 단일 작업 스케줄링 등
val intent = Intent(context, MyActivity::class.java)
val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)

 

 

FLAG_MUTABLE

      • 의미: PendingIntent가 생성된 후, 내부의 Intent 데이터를 수정할 수 있습니다.
      • 특징: 앱이 동적으로 데이터를 업데이트하거나 변경된 작업을 처리할 있음,
        보안 위험이
         존재할 있으므로 신중히 사용해야 함
      • 적합한 경우:PendingIntent를 사용하는 앱이 실행 시점에 동적으로 데이터를 변경해야 하는 경우,
        예: 알림에서 동적으로 업데이트되는 버튼 동작, 위치 기반 서비스 등
val intent = Intent(context, MyService::class.java)
val pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_MUTABLE)

 

 

두 플래그의 주요 차이점

특성 FLAG_IMMUTABLE FLAG_MUTABLE
변경 가능 여부 변경 불가능 변경 가능
보안 보안성이 높음 보안 취약점 존재 가능
권장 여부 기본적으로 권장됨 필요한 경우에만 사용
주요 사용 사례 고정된 알림 동작, 단일 작업 스케줄링 동적으로 업데이트되는 알림, 위젯 서비스
반응형