본문 바로가기
Android/Error Report

안드로이드 Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent 에러 해결방법

by 굿햄 2023. 1. 4.

구글 AdMob관련 에러

AdMob 라이브러리를 포함한 상태로 컴파일 후 앱 실행 시 런타임 에러가 발생하는 경우가 있습니다.
이와 관련한 증상 및 해결방법 입니다.

AdMob 라이브러리를 추가 후 Target Version을 SDK 31 이상으로 설정 후 앱을 런타임 실행하면 아래와 같은 에러로그를 볼 수 있습니다.

API 31이상 타겟 시 에러 메시지

이에 대한 내용은 PendingIntent FLAG로 `FLAG_IMMUTABLE` 또는 `FLAG_MUTABLE`을 지정해줘야 한다는 내용인데,
AdMob 20.4.0 버전 릴리즈를 보면 이와 관련한 버그 픽스 방법이 기재되어있습니다.
https://developers.google.com/admob/android/rel-notes

 

릴리즈 노트  |  Android  |  Google Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 릴리즈 노트 버전 출시일 메모 20.6.0 2022년 2월 22일 20.5.0 2021‑11‑18 API 31을 대상으로 하는 앱용 Android 12 기기에 대한 지원이

developers.google.com


This release and all previous versions require an explicit dependency on androidx.work:work-runtime:2.7.0 to fix a bug causing app crashes on Android S with the following stack trace:

Fatal Exception: java.lang.IllegalArgumentException:
com.mycompany.myapp: Targeting S+ (version 10000 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.
   at android.app.PendingIntent.checkFlags(PendingIntent.java:386)
   at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:657)
   at android.app.PendingIntent.getBroadcast(PendingIntent.java:644)
   at androidx.work.impl.utils.ForceStopRunnable.getPendingIntent(ForceStopRunnable.java:174)
   at androidx.work.impl.utils.ForceStopRunnable.isForceStopped(ForceStopRunnable.java:108)
   at androidx.work.impl.utils.ForceStopRunnable.run(ForceStopRunnable.java:86)
   at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:75)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
   at java.lang.Thread.run(Thread.java:920)

Gradle에 종속선 선언 시

com.google.android.gms:play-services-ads

해당 라이브러리에 Constraints on transitive dependencies(전이적 종속성에 대한 제약)을 추가하여, 올바른 종속성을 가질 수 있도록 해주어야 합니다.

Kotlin-DSL 기준으로 설명된 글이 잘 없기에 함께 첨부합니다.

Gradle(Groovy)

dependencies {
  implementation 'com.google.android.gms:play-services-ads:20.4.0'

  // For apps targeting Android 12, add WorkManager dependency.
  constraints {
    implementation('androidx.work:work-runtime:2.7.0') {
      because '''androidx.work:work-runtime:2.1.0 pulled from
      play-services-ads has a bug using PendingIntent without
      FLAG_IMMUTABLE or FLAG_MUTABLE and will fail in Apps
      targeting S+.'''
    }
  }
}


Gradle(Kotlin-DSL)

implementation("com.google.android.gms:play-services-ads:20.4.0")
constraints{
    implementation("androidx.work:work-runtime:2.7.0") {
        because("""androidx.work:work-runtime:2.1.0 pulled from
                      play-services-ads has a bug using PendingIntent without
                      FLAG_IMMUTABLE or FLAG_MUTABLE and will fail in Apps
                      targeting S+.""")
    }
}

ⓒ 굿햄 2022. daryeou@gmail.com all rights reserved.

댓글