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 라이브러리 빌드
- 크래시가 발생하지 않음
- Android 라이브러리 빌드
- Gradle 6.5
- Android Gradle Plugin 4.x
- Unity 2021 Android 애플리케이션 빌드 (Android 라이브러리 포함)
- Gradle 6.5
- Android Gradle Plugin 4.x
- Android 라이브러리 빌드
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 버전 설정