Android SDK 35 → 36 마이그레이션에서 실제 수정한 항목 7가지

Android SDK 35 → 36 마이그레이션에서 실제 수정한 항목 7가지

Android 프로젝트를 운영하다 보면 매년 새로운 Target SDK 대응 작업을 하게 된다. 하지만 모든 SDK 업데이트가 대규모 수정을 요구하는 것은 아니다.

Android 15(API 35)는 Edge-to-edge가 기본 적용되는 등 UI 측면에서 큰 변화가 있었던 반면, Android 16(API 36)은 기존 정책을 강화하고 일부 API의 동작을 변경하는 수준의 업데이트가 많다.

이번 프로젝트에서는 기존 Android SDK 35 기반 앱을 SDK 36으로 마이그레이션했다. 생각보다 수정해야 할 부분은 많지 않았지만, 몇 가지는 반드시 확인해야 하는 항목들이 있었다.

이 글에서는 실제로 SDK 36 대응 과정에서 확인했던 주요 수정 사항들을 정리해 보려고 한다.


개발 환경

마이그레이션 전후 환경은 다음과 같다.

항목

변경 전

변경 후

compileSdk

35

36

targetSdk

35

36

minSdk

23

23

언어

Java

Java

프로젝트는 Java 기반의 일반적인 Android 애플리케이션이며, WebView와 다양한 시스템 API를 사용하고 있다.


1. Edge-to-edge 예외 설정 제거 여부 확인

가장 먼저 확인한 것은 Edge-to-edge였다.

처음에는 SDK 36에서 새롭게 적용된 정책이라고 생각했지만, 다시 확인해 보니 Edge-to-edge는 이미 Android 15(API 35)부터 기본 적용되어 있었다.

SDK 36에서 달라진 점은 기존에 사용하던 Edge-to-edge 예외 설정이 Android 16에서는 더 이상 동작하지 않는다는 것이다.

예를 들어 다음과 같은 설정으로 기존 레이아웃을 유지했던 프로젝트라면 반드시 확인이 필요하다.

<item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>

이 속성은 Android 16에서 더 이상 효과가 없으므로 Window Insets 처리가 제대로 되어 있는지 다시 테스트해야 한다.

확인한 항목

  • 상태바와 Toolbar가 겹치지 않는지
  • 하단 버튼이 Navigation Bar에 가려지지 않는지
  • 키보드 표시 시 입력창이 가려지지 않는지
  • Dialog와 BottomSheet가 정상적으로 표시되는지

2. Back 버튼 처리 방식 점검

프로젝트에는 아직도 오래전에 작성된 onBackPressed() 코드가 일부 남아 있었다.

Android 16에서는 Predictive Back이 기본 동작으로 사용되기 때문에 기존 Back 처리 코드가 정상적으로 호출되는지 확인하는 과정이 필요했다.

특히 다음과 같은 기능은 직접 테스트했다.

  • WebView 뒤로가기
  • Fragment 전환
  • Dialog 닫기
  • “뒤로가기 두 번 종료” 기능

다행히 대부분은 OnBackPressedDispatcher를 사용하고 있어 큰 수정은 필요하지 않았다.

아직 KEYCODE_BACK을 직접 처리하는 코드가 있다면 이 기회에 함께 정리하는 것을 추천한다.


3. Deprecated API 정리

SDK를 올리면 Android Studio에서 새로운 경고가 나타난다.

이번에도 가장 먼저 한 작업은 Deprecated API를 정리하는 것이었다.

대표적으로 확인한 항목은 다음과 같다.

  • TelephonyManager.listen()
  • startActivityForResult()
  • onActivityResult()

특히 TelephonyManager.listen()은 TelephonyCallback으로 변경하는 작업이 필요했다.

Deprecated API는 당장 오류가 발생하지는 않지만, 이후 SDK에서 제거될 가능성이 높기 때문에 가능한 빨리 교체하는 것이 좋다.


4. 태블릿과 폴더블 화면 테스트

Android 16에서는 대화면 기기에서 화면 방향과 크기 제한 정책이 일부 변경되었다.

세로 모드만 가정하고 만든 화면은 태블릿에서 예상과 다르게 표시될 수 있다.

프로젝트에서는 다음 항목을 중심으로 확인했다.

  • 태블릿 가로 모드
  • 멀티 윈도우
  • 화면 회전
  • Dialog 크기
  • WebView 화면 비율

스마트폰에서는 문제가 없더라도 태블릿에서는 레이아웃이 깨질 수 있으므로 실제 기기 또는 에뮬레이터 테스트를 권장한다.


5. 주기 실행 작업 확인

프로젝트에는 일정 시간마다 서버와 통신하는 기능이 있었다.

Android 16에서는 scheduleAtFixedRate()의 누락 작업 처리 방식이 변경되었기 때문에 해당 코드도 함께 확인했다.

ScheduledExecutorService executor =
        Executors.newSingleThreadScheduledExecutor();

executor.scheduleAtFixedRate(
        this::sync,
        0,
        10,
        TimeUnit.SECONDS
);

일반적인 앱에서는 큰 영향이 없지만, 누락된 작업 횟수에 의미를 두는 로직이라면 수정이 필요할 수 있다.


6. 권한과 Manifest 재점검

SDK를 변경할 때는 새로운 기능이 없더라도 Manifest를 다시 한번 확인하는 것이 좋다.

이번 프로젝트에서는

  • Notification 권한
  • Media 권한
  • Foreground Service 선언
  • exported 설정

등을 다시 점검했다.

대부분은 기존과 동일했지만, SDK를 올릴 때 함께 확인하면 이후 문제를 줄일 수 있다.


7. 실기기 테스트

가장 오래 걸린 작업은 코드 수정이 아니라 테스트였다.

다음 기능은 모두 실제 기기에서 확인했다.

  • 로그인
  • WebView
  • 파일 업로드
  • Push Notification
  • 권한 요청
  • 카메라
  • 뒤로가기
  • 화면 회전

컴파일이 성공했다고 해서 SDK 마이그레이션이 끝난 것은 아니다.

특히 WebView를 사용하는 앱은 Android System WebView 버전에 따라서도 동작이 달라질 수 있으므로 반드시 실제 기기에서 테스트하는 것을 추천한다.


마이그레이션 체크리스트

SDK 35에서 36으로 변경할 때 개인적으로 가장 먼저 확인하는 순서는 다음과 같다.

  • compileSdk를 36으로 변경
  • targetSdk를 36으로 변경
  • Android Studio 경고 확인
  • Deprecated API 정리
  • Edge-to-edge 예외 설정 제거 여부 확인
  • Back 처리 방식 확인
  • Manifest 점검
  • 권한 테스트
  • WebView 테스트
  • 태블릿 및 폴더블 테스트
  • Google Play 내부 테스트 진행

마무리

Android SDK 35에서 36으로의 마이그레이션은 Android 15에서처럼 대규모 UI 변경이 발생하는 업데이트는 아니었다.

하지만 기존 정책이 더욱 엄격해지고 일부 API의 동작이 변경되었기 때문에, 단순히 compileSdk와 targetSdk만 변경하고 끝내기보다는 프로젝트 전반을 한 번 점검하는 것이 좋다.

특히 이번 작업에서 가장 중요했던 것은 Edge-to-edge 예외 설정 확인Back 처리 방식 점검Deprecated API 정리, 그리고 실기기 테스트였다.

앞으로는 각 항목을 조금 더 자세히 다뤄볼 예정이다. 다음 글에서는 TelephonyManager.listen()을 TelephonyCallback으로 변경하는 방법과 실제 적용 시 주의할 점을 코드 예제와 함께 정리해 보겠다.

댓글

이 블로그의 인기 게시물

Android SDK 36 대응 - Edge-to-edge 예외 설정이 더 이상 동작하지 않는 이유와 해결 방법