수정사항을 반영한 앱을 업데이트를 하기 위해, 안드로이드 앱을 구글 플레이 스토어에 올리려니까 다음과 같은 에러가 떴다.
현재 앱이 30의 API 수준을 타겟팅하고 있지만, 보안 및 성능에 최적화된 최신 API를 기반으로 앱을 빌드하려면 API 수준 31 이상을 타겟팅해야 합니다. 앱의 타겟팅 API 수준을 31 이상으로 변경하세요.
최근에 (언제인지는 모르겠으나) 안드로이드 targetSDK 가 31 버전이 아니면 앱 심사에 올릴 수 없게 수정이 된 모양이었다.
안된다면 올려줘야지 😭
안드로이드 폴더 내부와 app 폴더 안에 있는 build.gradle
파일에서 compileSdkVersion
과 targetSdkVersion
을 전부 버전을 수정해준다.
compileSdkVersion = 31
targetSdkVersion = 31
우선 이렇게 올려주고 에뮬레이터 빌드를 해보았다.
그런데 에러가 발생했다.
Manifest merger failed : Apps targeting Android 12 and higher are required to specify an explicit value for
android:exported
when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.
버전을 올려주는 거라 에러는 날거라 생각했다.
targetVersion 31 부터는 AndroidManifest.xml
파일에서 android:exported="true"
를 추가해주어야 한다고 한다.
어디에 추가를 해주어야 하는가?
<intent-filter></intent-filter>
바로 </intent-filter>
가 들어있는 모든 부모(?) 에게 주어야한다.
</intent-filter>
태그를 품고 있는 태그라면!
무조건 android:exported="true"
를 넣어주어야한다.
<activity
android:name="어쩌구저쩌구"
android:exported="true">
<intent-filter>
// 생략...
</intent-filter>
</activity>
예시 코드이다.
처음엔 <activity>
태그에만 넣어주면 되는 줄 알았는데, 이미 내 프로젝트에선 모든 <activity>
태그에 android:exported="true" 를 준 상태였다.
그래서 <intent-filter>
를 품고 있는 <service>
태그에도 android:exported="true" 를 추가해주니 빌드가 성공적으로 됐다.
이후에 심사 과정에서 문제가 생길까 걱정했지만, 다행히 그런 일은 없었다.
버전을 이렇게 올려주게 되면 라이브러리를 재설치해야 되는 경우도 있다고 들었는데, 다행히 난 그런 이슈는 발생하지 않았다.
정확히 android:exported="true"
가 무엇을 의미하고 왜 31 버전에서 추가를 해주어야 하는지는 정확히 파악하지 못했다.
다음에 시간이 나면 더 깊게 파보고 무엇을 의미하는지 따로 포스팅이나 공부를 해볼 예정이다.
안녕하세요 작성하신 글 내용과 관련하여 외주 부탁드리고 싶습니다.
soo@saladweeks.com 으로 메일 한 번 주시면 감사하겠습니다!