안드로이드의 상위 호환성

지난 글에서 AndroidManifest.xml의 SdkVersion에 대해 이야기 했다. 안드로이드 개발자 사이트에서 이 SdkVersion들에 대한 글을 읽다 보면  이런 말이 나온다.

Android applications are generally forward-compatible with new versions of the Android platform.

라고 나와있다.  상위호환성이 뭔가?

상위호환성을 이해하기 위해 하위호환성을 먼저 살펴보자.  위키피디아(영문)에 따르면 이전 버전에서 만든 입력값을 처리할 수 있다면 ‘하위 호환성’이 있다고 한다. 자바를 예로 들면, 라이브러리만 예전 버전에서 새버전으로 바꾸었는데 여전이 어플리케이션이 잘 동작한다면 하위 호환성이 있는 라이브러리이다. 예를 들어, 진저브레드에서 만들어진 함수를 아이스크림 샌드위치를 내놓을 때 더이상 쓰지 말라고 권유하는 경우가 있다. 하지만, 이를 삭제하지 않고 deprecated 처리하여 하위호환성을 보장해주고 더 좋은 방법으로 구현한 메소드도 추가한다.

그리고 상위호환성은 하위호환성의 반댓말이다. 그럼  최신 버전의 라이브러리로 제작한 어플리케이션이 하위 버전 라이브로리로 바꾸었는데도 잘 동작한다면 하위 호환성이 있다는 뜻인건가?

그건 아니다. 예전 기준으로 만들었던 제품이 변경된 기준에서도 잘 동작하도록 하는 표준이 있다면, 상위 호환성이 있다고 본다. 예를 들어, 핀치 투 줌 기능이 없을 때 만든 앱이라도, 표준 api를 이용하여 만든 앱이라면 최신 단말에서 앱을 실행할 때 핀치 투 줌 기능을 사용자가 사용할 수 있는 경우다. 보통 상위 호환성은 제한된 시나리오에서만 가능하다.

상위호환성이라는 컨셉은 소프트웨어 분야에만 국한된 것은아니다. 전자제품 인터페이스나 전신 신호, 파일 시스템, 프로토콜 등에 모두 적용될 수 있다.

상위호환성을 고려해야하는 이유는 사용하는 단말의 동작(가시적/비가시적 모두)들은 한번 익숙해지면 바꾸기 쉽지 않다. 만약 사용자가 이전 버전에서 만든 앱을 사용하는데, 이 앱이 새 프레임워크와 다르게  동작하면 만족감이 떨어질 것이다. 그렇다고 새 프레임워크가 나올 때마다 앱 개발자가 일일이 확인/수정/릴리즈를 반복해야 한다면 안드로이드 자체의 인기가 떨어질 것이다.(물론 구글은 이걸 권장한다) 이에 구글에서 상위 호환성을 지원함으로서 개발자에 대한 인기와 사용자에 대한 일관성을 지키기 위해 상위 호환성을 지원하게 되었다고 생각한다.

하위호환성은 어떻게 지원하나?

안드로이드의 하위호환성/상위호환성에 대해서는 지난 글에서 설명한 바 있다. 이번에는 안드로이드에서 하위호환성을 어떻게 지원하는지 알아보자.

신규 모델에서 추가된 기능이라면 신규 모델에서만 실행되도록 앱을 설정한 후에 그 기능을 사용하면 된다. 개선된 기능이라면 오래된 모델에서는 개선 전의 것을 새로운 모델에서는 개선된 기능을 쓰면 그만이다. 성능이 개선될 수 있지만 동작은 할테니까 말이다. 하지만, UI와 같이 사용자가 위화감을 가질만한 부분은 어떻게 해야할까? 오래된 단말에 맞추어 개발을 하면 최신 트렌드에 맞지 않을 테고, 최신 단말에 맞추어 개발하면 오래된 단말에서 올바로 보일리가 없다. 이를 어찌해야하나?

안드로이드에서는 서포트 라이브러리(Support Library)라는 이름의 라이브러리들로 하위호환성을 지원한다.

서포트 라이브러리(Support Library)

처음 이 라이브러리가 릴리즈 될 때 이름은 안드로이드 호환성 라이브러리(Android Compatibility Library) 였다. 이름에서도 알 수 있듯이 이 라이브러리의 용도는 호환성 지원이다.

현재 v4, v7, v8, v13로 총 4개의 라이브러리가 있다. 각각 API 4, API 7, API8, API 13이상을 지원한다. 그러므로 minSdkVersion을 사용하고자 하는 라이브러리의 지원 버전 이하로 맞춰야 한다.

예를 들어 v7를 사용하고자 한다면,

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="17" />

와 같이 적어주어야 한다. 각 라이브러리들이 어떤 기능을 지원하는 지는 여기를 보면 된다.

사실 서포트 라이브러리가 하위호한성을만을 위한 라이브러리는 아니지만(이 라이브러리에서만 지원하는 기능도 있음) 대부분의 기능들이 UI(User Interface), 접근성(Accessibility), 레이아웃에 관련된 기능이라 호환성을 위한 라이브러리라고 봐도 무방하다.

안드로이드에서는 v4와 v7이 다양한 안드로이드 버전과 UI 관련 기능을 지원하기 때문에 사용을 추천하고 있으며, 이 때 v4와 v7 모두를 앱에서 사용했다면 minSdkVersion=7이 되어야 한다. 왜냐하면, minSdkVersion을 4로 설정하는 경우 v7 라이브러리가 동작하지 않기 때문이다.

마지막으로 소스코드 보호와 함께 필요없는 클래스들이 apk안에 포함되지 않도록 프로가드(ProGuard)를 사용하는 것을 권유하고 있다.

참고

  • http://developer.android.com/tools/support-library/index.html
  • http://developer.android.com/tools/support-library/features.html
  • http://developer.xamarin.com/guides/android/platform_features/fragments/part_4_-_providing_backwards_compatibility_with_the_android_support_package/
  • http://developer.android.com/guide/topics/manifest/uses-sdk-element.html