본문 바로가기

안드로이드 기술 공유

AndroidX 로 마이그레이션 하기

개요

구글에서는 Android Support Library의 28.0.0 버전을 마지막으로, 더 이상 android.support 라이브러리의 릴리즈는 없을 것이라고 하며, 새로운 기능 개발은 모두 AndroidX 에서 이루어질 것이라고 하였습니다.

AndroidX는 기존 Support 라이브러리를 완전히 대체하면서, 새롭게 추가되는 라이브러리들 까지 포함하고 있습니다.

이에 따라, 저희도 기존 support 라이브러리를 AndroidX로 마이그레이션하는 작업을 해야 합니다.

다행스럽게도, 안드로이드 스튜디오의 Refactor 기능을 사용하면, 간편하게 마이그레이션 작업을 진행 할 수 있습니다.

 

그렇다면, 지금부터 AndroidX로 마이그레이션하는 방법과 더불어, 이전하는 과정에서 겪을수있는 에러의 해결방법까지 같이 설명드리도록 하겠습니다. 

기본 요건

마이그레이션을 하기 전에 앱을 최신 상태로 유지하는 것이 좋습니다.

즉, Support Library의 최종 버전인 28.0.0 을 사용하도록 프로젝트를 업데이트 하는 것이 좋습니다.

그 이유는, AndroidX 1.0.0 버전이 Support Library 28.0.0 과 동일한 바이너리이기 때문이며, 변환 과정에서 충돌없이 매끄럽게 진행 될 수 있습니다.

AndroidX Refactor

안드로이드 스튜디오 3.2 이상부터는 메뉴 바에 AndroidX 마이그레이션을 위한 Refactor 기능이 포함되어 있습니다.

참고로, 마이그레이션을 할 때는 별도의 Branch에서 작업하는 것을 추천드리며, 마이그레이션을 수행하는 동안은 코드 리팩토링을 방지해야 합니다.

 

메뉴 바에서 Refactor > Migrate to AndroidX 를 선택하여 기존 프로젝트를 AndroidX로 이전할 수 있습니다.

 

 

Migrate to AndroidX 메뉴를 선택하고 나면, 아래와 같이 백업 파일을 만들건지 물어보는 팝업이 뜨게 됩니다.

안전하게 백업을 해두는 것도 좋고, 저는 별도의 Git Branch를 따서 작업을 하였기 때문에 따로 백업파일을 만들진 않았습니다.

백업을 하고 싶으시면 "Backup project as Zip file" 체크박스에 체크를 해주시고, 백업이 필요없으시다면 체크를 해제해주시면 됩니다.

Migrate를 수행하고 나면, 하단에 Refactor 되는 파일 리스트들이 쭉~ 리스트업 되는데, 이 단계에서 의심이 가거나 확인이 필요한 파일들의 경우는 유심히 체크해보실 필요가 있습니다.

이상이 없다면, "Do Refactor" 버튼을 눌러서 Refactoring을 수행시킵니다.

 

Refactoring이 완료되고 나면, 아래와 같이 androidx.* 로 변경이 된 것을 확인 할 수 있습니다.

 

//변경 전
dependencies {
        implementation "com.android.support:support-v4:$libraryVersion"
        implementation "com.android.support:appcompat-v7:$libraryVersion"
        implementation "com.android.support:design:$libraryVersion"
        implementation "com.android.support:recyclerview-v7:$libraryVersion"
        implementation "com.android.support:support-annotations:$libraryVersion"
        implementation "com.android.support:cardview-v7:$libraryVersion"
        implementation 'com.android.support.constraint:constraint-layout:1.1.0'
        implementation 'com.android.support:multidex:1.0.3'
}
//변경 후
dependencies {
        implementation 'androidx.legacy:legacy-support-v4:1.0.0'
        implementation 'androidx.appcompat:appcompat:1.0.0'
        implementation 'com.google.android.material:material:1.0.0'
        implementation 'androidx.recyclerview:recyclerview:1.0.0'
        implementation 'androidx.annotation:annotation:1.0.0'
        implementation 'androidx.cardview:cardview:1.0.0'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        implementation 'androidx.multidex:multidex:2.0.0'
}

support.design의 경우, com.google.android.material.material로 변경된것을 볼수가있는데, 이것 또한 AndroidX에 맞는 빌드 아티팩트로 변경 된 것입니다.

 

혹시, 마이그레이션 관련 문제가 발생한다면, 기존 라이브러리들이 매핑되는 AndroidX 아티팩트 매핑 표를 참조하여 적합한 매핑을 찾으실수있습니다.

 

그리고 또 한가지 변경된 부분을 발견 할 수 있는데, gradle.properties(project 수준) 파일에

 

android.useAndroidX=true
android.enableJetifier=true

가 자동으로 추가된것을 확인 할 수 있습니다.

 

AndroidX 리팩토링 명령은, 위와 같은 두개의 플래그를 사용하게 되고, true로 설정됩니다.

 

android.useAndroidX
: true로 설정하면 Android 플러그인이 Android Support Library 대신 AndroidX 라이브러리를 사용합니다.
 디폴트(명시하지 않은경우)는 false 입니다.

android.enableJetifier
: true로 설정하면, Android 플러그인이 자동으로 기존 타사 라이브러리를 마이그레이션하여 AndroidX로 사용합니다.
 디폴트(명시하지 않은경우)는 false 입니다.

혹시, AndroidX 라이브러리를 사용하려고 하며, 기존 타사 라이브러리를 AndroidX로 변환할 필요가 없는 경우에는, 위의 설명에 맞게, android.useAndroidX 플래그는 true로 설정하고, android.enableJetifier 플래그를 false로 설정하면 됩니다.

 

이렇게, 기존 Support Library를 AndroidX로 마이그레이션 하는 작업이 완료되었습니다!

안드로이드 스튜디오의 Refactor 기능 덕분에 아주 손쉽게 마이그레이션 작업을 할수가 있었네요! ^^

빌드 에러 발생 시, 해결법

AndroidX 마이그레이션이 잘 되었는지 확인하기 위해, 빌드를 하다가 아래와 같은 에러를 마주할 수도 있습니다.

 

The given artifact contains a string literal with a package reference 'android.support.v4.content'
that cannot be safely rewritten.
Libraries using reflection such as annotation processors need to be updated manually
to add support for androidx.

이 이슈는, Butterknife 라이브러리 버전 문제인데, 앱에서 Butterknife 라이브러리를 쓰고 계신다면 Butterknife의 버전이 낮아 AndroidX와 충돌이 나게 됩니다.

Butterknife는 AndroidX에 대한 지원을 버전 10.0.0 부터 추가하였기 때문에, 간단하게 Butterknife의 버전만 10.0.0 이상으로 올려주면 간단히 해결이 됩니다. ^^