[React Native] 리액트 네이티브에서 Android 업데이트하기 (API 33 > 34)

부기·2024년 7월 12일
1
post-thumbnail

리액트 네이티브에서 Android Target SDK Version을 업데이트한 과정을 적어둔다.

오류 개요

오류는 아니지만, 구글 플레이스토어에서 서비스 중인 앱에 대해 어느날 이런 안내가 왔다.

오류 내용

앱에서 타겟팅하고 있는 Android API level을 34로 올려달라는 내용이었다. 내 앱은 API level 33, 그러니까 Android 13.0 버전을 타겟팅한 상태로 운영되고 있었다. 기한 안에 버전을 고쳐서 올리지 않으면 플레이스토어에서 앱을 제공할 수 없게 된다.

일단 부담스러웠다. 왜냐면 안드로이드 네이티브 영역의 gradle을 수정해서 버전을 업데이트 한 뒤 모든 기능이 제대로 수행되리란 보장이 없었기 때문이었다. 특히 리액트 네이티브 환경에서는 패키지 호환이 관건인데, 뭐라도 하나 맞지 않는다고 나오면 일이 어려워질 것 같았다. (그래도 해야지..🥲)

재현 환경

아무래도 환경을 업데이트 해야하는 문제이다보니 재현 환경을 적어둔다.

리액트(패키지) 환경

"react": "18.2.0"
"react-native": "0.71.7"

안드로이드 환경

buildToolsVersion = "33.0.0"
minSdkVersion = 21
compileSdkVersion = 33
targetSdkVersion = 33
kotlinVersion = "1.7.20"
ndkVersion = "23.1.7779620"

해결 방법 및 여러 시도

할 필요가 없는 일들을 하느라 시간을 많이 보냈다.

Android Studio 업데이트라던가..
Android Gradle Plugin 업데이트라던가..
Kotlin 버전 업데이트라던가..

이것들은 꼭 모든 방법을 샅샅이 찾아본 후 정말 더이상 방법이 없다 싶을때 시도하자.

패키지 업데이트

처음엔 검색해서 나온 대로 다른 부분은 건드리지 않고 android/build.gradle 파일의 compileSdkVersion, targetSdkVersion, buildToolsVersion을 34로 맞춰주었다. 그리고 실행을 했더니 메트로가 심상치 않은 길이의 로그와 함께 마지막엔 이런 로그를 뱉어주었다.

react-native-screens:compileDebugKotlin FAILED

구글에 검색하면 kotlinVersion을 업데이트하라는 답변이 많지만 그렇게 했다가 kotlinVersion 호환성에 엮이고 엮인 엄청난 오류를 마주하게 되었다. kotlinVersion을 바꾸느라 build.gradle만 몇번을 롤백하다가 문득 react-native-screens 패키지가 최신 버전이 아닌 것 같아서 업데이트 해봤더니 에러가 사라졌다.

문제는 이제 에러가 사라져서 BUILD SUCCESS 가 정상적으로 보임에도 불구하고 앱이 자꾸 켜자마자 꺼지는 shut down 현상이 나타났다. Metro 에는 에러 로그가 없어서 무척 골치가 아팠는데 Android Studio 빌드 터미널을 켜니 앱이 꺼지면서 발생했던 에러 로그를 확인할 수 있었다.

Android Gradle 업데이트

이런 로그들이 나왔다. 결론만 말하자면 Gradle을 건드리는건 해결방법이 아니었다. 다만 실패하면서 알게 된 것들이 몇가지 있어서 적어둔다.

We recommend using a newer Android Gradle plugin to use compileSdk = 34 This Android Gradle plugin (7.3.1) was tested up to compileSdk = 33. You are strongly encouraged to update your project to use a newer Android Gradle plugin that has been tested with compileSdk = 34.

이걸 읽고 AGP 업데이트를 했다가, AGP 업데이트가 안 되자 Android Studio 업데이트를 했다. (Android Studio 버전에 따라서 업데이트 가능한 AGP 버전이 다르다.)

그리고 AGP 버전에 따라 호환되는 Android Gradle(AG) 버전도 달라서, AGP를 바꿀 때마다 gradle.properties를 수정하고 AG를 버전별로 다운받기도 했다. 참고로 다운받은 AG는 android/.gradle 경로에 저장된다.

Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.8.0, expected version is 1.6.0.

그동안 위의 로그가 새로 생겼는데, 간단하게 프로젝트의 Kotlin 버전을 업데이트하면 될 것 같았지만 무슨 짓을 해도 사라지지 않았다.

MainApplication.java 업데이트

몇시간째 AGP를 붙잡고 있다가 도저히 아닌 것 같아서 파일을 모두 원복했다. 처음부터 다시 찾는다는 마음으로 검색을 하다가, react-native 깃허브에서 나와 똑같은 상황을 찾았다.

파일을 아래와 같이 수정한 후, 스플래시 스크린이 뜬 후 앱이 정상적으로 동작했다.

build.gradle

buildscript {
	ext {
    	...
        buildToolsVersion = '34.0.0'
        compileSdkVersion = 34
        targetSdkVersion = 34
        ...
    }
    ...
}

app/build.gradle

...
dependencies{
	...
    implementation 'org.jetbrains:annotations:16.0.2'
    ...
}
...

MainApplication.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import org.jetbrains.annotations.Nullable;

public class MainApplication extends Application implements ReactApplication {
	...
    @Override
    public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter) {
      if (Build.VERSION.SDK_INT >= 34 && getApplicationInfo().targetSdkVersion >= 34) {
        return super.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED);
      } else {
        return super.registerReceiver(receiver, filter);
      }
    }
    // onCreate 함수
    ...   
}

이 코드는 registerReceiver() 라는 함수를 오버라이딩해서 해결했는데, 무엇을 위한 함수이고 어떤 경위로 이게 해결방법이 될 수 있었는지를 더 알아보려고 한다.

참고 자료

profile
도파민 중독 프론트엔드 개발자

0개의 댓글