Android/Gradle

[Android] Gradle 버전에 따른 viewBinding 설정 이슈

mystic-agit 2023. 9. 27. 16:46
[ 목 차 ]
1. ViewBinding 이란
2. 이슈
3. 분석
4. 결론

 

1. ViewBinding 이란

  • 뷰와 상호 작용하는 코드를 더 쉽게 작성할 수 있게 해주는 기능
  • 기존에 사용하던 findViewById를 대체하는 방법
  • ViewBinding의 장점
    • findViewById 보다 속도가 빠름
    • 정확한 view 타입을 찾아 맵핑
    • NullPointerException 방지

 

2. 이슈

Android 애플리케이션 빌드 사용 시 build.gradle 에서 아래와 같이 viewBinding 설정을 사용중

 

Android {
    buildFeatures {
        viewBinding = true
    }
}

APK 빌드는 성공하였으나 앱을 사용중 viewBinding을 사용하는 로직에서 크래시 발생

 

FATAL EXCEPTION: main
process: ..., PID: 1639
java.lang.NoClassDefFoundError: Failed resolution of:Landroidx/viewbiding/ViewBindings;
...(생략)...
Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.viewbinding.ViewBindings" on path: DexPathList
...(생략)...​

 

3. 분석

크래시 발생 여부가 달리 발생하였던 빌드 환경

  • 크래시가 발생
    • Android 라이브러리 빌드
      • Gradle 7.2
      • Android Gradle Plugin 7.1.3
    • Unity 2021 Android 애플리케이션 빌드 (Android 라이브러리 포함)
      • Gradle 6.5
      • Android Gradle Plugin 4.x
  • 크래시가 발생하지 않음
    • Android 라이브러리 빌드
      • Gradle 6.5
      • Android Gradle Plugin 4.x
    • Unity 2021 Android 애플리케이션 빌드 (Android 라이브러리 포함)
      • Gradle 6.5
      • Android Gradle Plugin 4.x

 

Android Gradle Plugin 버전에 따른 viewBinding 버전 차이 확인

  • viewBinding 설정은 androidx.databinding:viewbinding 라이브러리르 자동 참조하는 설정으로 Android Gradle Plugin에 포함
    • androidx.databinding:viewbinding 은 Android Gradle Plugin 버전을 따라감
  • Android Gradle Plugin 4.x 를 사용 시 viewbinding 라이브러리도 4.x 를 사용
  • Android Gradle Plugin 7.x 를 사용 시 viewbinding 라이브러리도 7.x 를 사용
    • androidx.viewbinding.ViewBindings 클래스를 추가로 포함

 

4. 결론

조건

(a) Android Gradle Plugin을 7.x에서 빌드한 라이브러리에서 viewBinding 설정 (build.gradle내 viewBinding = true 설정)을 포함하였고

(b) 애플리케이션 빌드에서 해당 라이브러리를 사용할 경우

 

Case 1  애플리케이션 빌드가 Android Gradle Plugin 7.x 를 사용한다면

- build.gradle내 viewBinding = true 설정으로 충족 

Android {
    buildFeatures {
        viewBinding = true
    }
}

Case 2  애플리케이션 빌드가 Android Gradle Plugin 4.x 이하를 사용한다면

- build.gradle 내 viewBinding = true 설정

- implementation에 viewBinding 라이브러리 버전을 7.x 것으로 추가

Android {
    buildFeatures {
        viewBinding = true
    }
}
implementation "androidx.databinding:viewbinding:7.4.2"	// 사용하고자 하는 7.x 버전 설정