안드로이드가 발전함에 따라 보안, 정책등의 이유로 함수들은 계속해서 변합니다.
모든 개발자가 이러한 내역들을 잘 인지하여 안드로이드 버전에 따라 처리를 할 수 있다면 이상적이지만, 현실적으로 이는 당연히 불가능합니다.
이에 구글은 알아서 안드로이드 버전에 대응하여 필요한 형태로 리턴하도록 "지원 라이브러리"의 형태로 지원하고 있습니다. 😎
지원 라이브러리는 이제는 AndroidX에 병합되었지만 그 기능은 그대로 유지하고 있습니다.
기존에는 사용하기 위해 지원 라이브러리를 gradle에 추가해주어야 했으나, 지원 라이브러리가 AndroidX로 편입되며 Android Jetpack에 통합되었습니다.
Jetpack에 통합되었기에, 현재는 새로운 프로젝트를 생성하면 AndroidX를 기본으로 사용하도록 설정되어 있습니다. 😊
그럼에도 불구하고, 기존 support Library를 사용하는 프로젝트는 AndroidX로 이전 을 참고하여 개발을 진행할 수 있습니다.
예를 들어, Context 내의 getSystemService
는 Android 23 이상에서는 serviceClass: Class<T>
를 필요로 하지만, 미만에서는 serviceName: String
을 필요로 합니다.
이에 대해 ContextCompat.java
라는 지원 라이브러리에서는 아래와 같은 형태로 대응합니다.
@Nullable
public static <T> T getSystemService(@NonNull Context context, @NonNull Class<T> serviceClass) {
if (Build.VERSION.SDK_INT >= 23) {
return context.getSystemService(serviceClass);
}
String serviceName = getSystemServiceName(context, serviceClass);
return serviceName != null ? (T) context.getSystemService(serviceName) : null;
}
덕분에, 개발자는 따로 버전에 따른 핸들링을 하지 않고 해당 지원 라이브러리의 함수를 사용하는 것으로 개발을 지속해 나갈 수 있습니다.
사용할 수 있는 모든 메서드는 Android Developers - CompatContext 에서 확인할 수 있습니다.
참고로 저는 주로 Color, Drawable, Permission Check 등을 사용합니다. 😉