본문 바로가기

Android/Android Version

[Android] SDK31 외부 Library Export 설정 변경하기

728x90

올해 11월부터 TargetSDK를 31로 올리지 않으면 업데이트를 할 수 없다는 공지가 나왔고, 11월로 명시되어 있지만 유예 기간으로 한 달을 준 것 인지 필자는 12월 업데이트부터 해당 항목이 적용되어 TargetSDK 버전을 올리는 작업을 진행하게 되었다.

기존 회사에서 사용하던 레거시 라이브러리를 건들지 못하고 방치하고 있었는데, 이번에 버전을 올리면서 관련한 이슈가 발생하여 해결하는 방법을 짧게나마 남겨두려고 한다.


TargetSDK 버전을 31로 지정함에 따라 가장 많이 수정되는 부분이 Export 설정과 PendingIntent에 대한 Flag 설정인 것 같다.

여기서 PendingIntent의 경우 관련된 코드에 Flag를 추가/수정해주며, PendingIntent를 사용 중인 라이브러리는 대부분 대응하는 버전이 예전에 나온 것으로 알고 있다.

 

Export 설정도 마찬가지로 라이브러리의 최신화를 진행하게 되면 대부분의 라이브러리는 대응을 한 버전으로 사용이 가능하지만,

우리가 흔히 말하는 레거시 코드. 레거시 라이브러리는 업데이트를 지원하지 않는 경우도 종종 발생하게 된다.

물론, 이런 경우에는 더 상위 호환의 라이브러리가 나왔기 때문에 방치되는 경우가 많아 라이브러리를 변경하거나 하면 되는데, 회사에서 업무를 진행하다 보면 이런 라이브러리를 건들 수 있는 시간이 부족할 때가 생기기 마련이다.

 

이럴 때, 아주 간단하게 해결하는 방법을 필자가 진행한 순서대로 작성해보고자 한다.

 

우선,

버전을 올리고 빌드를 해보면 다음과 같은 에러를 볼 수 있다.

 

Caused by: java.lang.RuntimeException: 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.

 

분명 Manifest 파일에는 exported 속성 값을 다 추가해주었는데 해당 이슈가 계속 발생한다.

 

이러한 이슈가 발생하는 이유는, 사용 중인 라이브러리 중에 exported 설정이 되어있지 않은 라이브러리가 있기 때문이다.

하지만, 오류 코드에서는 내가 작성한 코드인지, 라이브러리인지 그러한 내용이 나오지 않기 때문에 모든 곳을 확인해봐야 한다.

 

 

Project 형태로 보는 방식을 변경한 후, External Libraries를 클릭해보면 사용 중인 모든 라이브러리가 나오게 된다.

그곳에서 라이브러리를 하나하나 클릭해 보면 각 라이브러리마다 Manifest 파일을 가지고 있는 것을 확인할 수 있다. 이 파일에 들어가 보면 내가 작성한 파일과 동일하게 Application, Activity 태그로 작성되어있는 부분을 확인할 수 있고 exported가 없는 것들을 찾아볼 수 있다.

 

이렇게 원시적으로 하나하나 찾아야하나 싶겠지만,

자신의 프로젝트의 Manifest 파일의 가장 하단을 눌러보면 Merged Manifest라는 탭이 있고, 해당 탭을 눌렀을 때 가장 하단에 어떤 라이브러리들이 문제가 있는지 확인이 가능하다.

 

 

이와 같이 에러가 발생한 부분을 확인할 수 있으며, 해당 라이브러리에 문제가 있다는 것이기 때문에 그 라이브러리를 수정해주면 된다.

 

필자는 확인을 위하여 네이버 로그인에 사용되는 라이브러리를 사용했으며, 어느 라이브러리던 동일한 방식으로 확인하면 된다.

 

 

네이버 로그인의 2~3년 전 버전이다. 이곳에서 Manifest를 확인해보면

 

 

이처럼 선언이 되어있는 것을 확인할 수 있다.

TargetSDK31부터 exported 속성을 반드시 명시해주어야 하는데 이곳에는 명시되어있지 않고, 그에 따라 해당 라이브러리를 사용하여 빌드가 불가능해진다.

 

이곳에서 타이핑을 해서 수정하면 되지 않을까? 하지만, 정상적으로 동작하지 않게 된다.

 

여기서 선택할 수 있는 방법은,

  1. 라이브러리 버전을 올린다.
  2. Manifest를 override 한다.

두 가지 방법이 존재한다.

 

물론, 라이브러리를 최신화하는 방법을 사용하는 것이 가장 바람직하다.

하지만 위에 언급했던 이유, 시간적인 이유로 그것들을 할 수 없는 경우에는 Manifest를 Overrdie 해서 사용하면 된다.

 

위처럼 문제가 발생되는 라이브러리를 찾아서 어떻게 선언되어있는지 파악을 했다면, 나의 프로젝트 Manifest 파일로 다시 이동해서 Override를 하자.

 

 

엄청 간단하게 가능하다.

 

라이브러리에 선언되어있던 것 중, name 속성 값을 가져오고 추가로 exported 속성 값만 선언해서 사용하면 된다.

이렇게 선언해서 사용하게 되면, 기존 라이브러리에 들어가 있던 속성 값은 그대로 사용하면서 exported 속성 값을 추가해서 사용할 수 있다.

여기서, 각 라이브러리에서 사용되는 액티비티는 나의 프로젝트에 선언되어 있는 부분이 아니기 때문에 위와 같이 빨간색으로 찾을 수 없다고 나오기는 하지만 실제로 빌드에는 문제가 없다.


이처럼 아주 간단하게 문제가 있는 라이브러리를 찾고, 확인하고, override 하여 해결할 수 있었다.

하지만, 이에 대한 내용을 찾는 것 자체가 상당히 오랜 시간이 걸렸고 후추에는 발생하지 않아야 하겠지만 혹시 모르기 때문에 글을 작성해두고자 하였다.

키워드를 잡기도 어려웠고, Manifest를 override 할 수 있다는 것조차 이번에 처음 알았기 때문에 더욱 찾기에 오래 걸린 게 아닐까 생각한다.

 

Manifest 파일의 하단에 Merged Manifest라는 탭이 있다는 것은 알고 있었지만 이것을 눌러서 무언가를 확인하는 작업은 지금까지 한 번도 하지 않았었는데, 문제가 생겼을 때 이렇게 쉽게 찾을 수 있다는 것이 놀라웠으며 정말 다양한 정보가 들어있다는 것을 다시 한번 알게 되었다.

 

앞으로는 이렇게 override 하는 방식이 아닌 라이브러리의 버전 관리를 확실하게 하고 최신화시켜서 작업을 진행해야겠지만,

아무래도 작성되고 오랜 시간 관리가 되지 않았던 부분을 건들기에는 리스크가 너무 크다는 것 때문에 손을 대기가 쉽지 않은 것 같다.

그래도 긴급 처치를 할 수 있게 되었으니, 천천히 레거시 코드를 뜯어보고, 최신화시켜서 문제없는 서비스를 만들어야 하지 않을까 싶다.

728x90