본문 바로가기
Develop/Android

Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present

by 3-stack 2022. 4. 9.

1. 문제상황

구글스토어에 업로드하고 잘 사용하던 어플이 어느 순간 스마트폰에서 자동으로 삭제 되었다.

그리고 설치하려고 해도 설치가  안 되었다.

 

2. 원인찾기

adb: failed to install
C:\Users\superpower\Develop\rms\android/app/build/outputs/apk/debug/app-debug.apk:
Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED:
Failed parse during installPackageLI: /data/app/vmdl928833812.tmp/base.apk
(at Binary XML file line #78): com.zoontek.rnbootsplash.RNBootSplashActivity:
Targeting S+ (version 31 and above) requires that an explicit value for
android:exported be defined when intent filters are present]

1) 개발환경에서 빌드를 시도하자 위와 같은 에러 메시지를 보인다.

눈에 띄는 문구는 "Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present" 이 부분이다.

targetSdkVersion 31이상은 android:exported 를 정확하게 표시해줘야 한다고 한다.

 

2) 공식문서에서 확인

https://developer.android.com/about/versions/12/behavior-changes-12?hl=ko#exported
 

동작 변경사항: Android 12를 타겟팅하는 앱  |  Android Developers

Android 12를 타겟팅하는 앱에 영향을 주는 Android 12의 변경사항을 알아봅니다.

developer.android.com

 

3. 해결

intent-filter를 사용하는 activity에 android:exported 설정을 명시적으로 해줬다.

이전 버전에서는 default값인 true가 자동이지만 Android 12 부터는 명시적으로 적어줘야한다.

아래 intent-filter는 android.intent.category.LAUNCHER 를 포함하므로 true로 지정했다.

 

4. 참고

  • 명시적 인텐트는 인텐트를 충족하는 애플리케이션이 무엇인지 지정합니다. 이를 위해 대상 앱의 패키지 이름 또는 완전히 자격을 갖춘 구성 요소 클래스 이름을 제공합니다. 명시적 인텐트는 일반적으로 앱 안에서 구성 요소를 시작할 때 씁니다. 시작하고자 하는 액티비티 또는 서비스의 클래스 이름을 알고 있기 때문입니다. 예를 들어, 사용자 작업에 응답하여 새로운 액티비티를 시작하거나 백그라운드에서 파일을 다운로드하기 위해 서비스를 시작하는 것 등이 여기에 해당됩니다.
  • 암시적 인텐트는 특정 구성 요소의 이름을 대지 않지만, 그 대신 수행할 일반적인 작업을 선언하여 다른 앱의 구성 요소가 이를 처리할 수 있도록 해줍니다. 예를 들어 사용자에게 지도에 있는 한 위치를 표시하고자 하는 경우, 암시적 인텐트를 사용하여 해당 기능을 갖춘 다른 앱이 지정된 위치를 지도에 표시하도록 요청할 수 있습니다.

https://developer.android.com/guide/components/intents-filters?hl=ko#Types 

 

인텐트 및 인텐트 필터  |  Android 개발자  |  Android Developers

An Intent is a messaging object you can use to request an action from another app component . Although intents facilitate communication between components in several ways, there are three fundamental use cases: An Activity represents a single screen in…

developer.android.com

 

댓글