google-play-services_lib 업데이트 후, 죽는 문제



가끔씩 Android SDK Manger 버튼 눌러보면, SDK 등등이 업데이트 되었다고 체크되어 있다. 경험상 프로젝트가 진행중일 때는 절대로 업데이트하지 말아야 하는데, 이유는... 잘 동작하던 앱이 "죽는다"
최근에도 이런 경험을 했는데, 다행히 일 없이 널널할 때여서 뭔 일인가 꼼꼼히 살펴봤다.

이번에 업데이트를 한 것은 GCM이나 Google Map v2를 위해 추가해야하는 구글플레이서비스 라이브러리(google-play-services_lib)였는데, 처음 본 에러메시지는 아래와 같다.

01-13 14:27:16.976: E/AndroidRuntime(7367): Caused by: java.lang.IllegalStateException: The meta-data tag in your app's AndroidManifest.xml does not have the right value.  Expected 4030500 but found 0.  You must have the following declaration within the <application> element:     <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />


관련해서 찾아보니, 필수 meta-tag가 추가되었단다.

간단하다. Google Map v2의 Key를 넣는 것 처럼 매니페스트에 아래 내용을 추가하면 이 문제는 해결된다.


<Application 
...
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
...
</Application>


그런데, 비슷한 문제가 또 발생한다.

int iErrorCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);


여기서 에러코드 "2"를 뱉어낸다.


public static final int SERVICE_VERSION_UPDATE_REQUIRED The installed version of Google Play services is out of date. The calling activity should pass this error code to getErrorDialog(int, Activity, int) to get a localized error dialog that will resolve the error when shown. Constant Value: 2 (0x00000002) Details... 


버전이 낮아서 발생하는 문제란다. 
이때 출력된 로그를 보면, 자기는 4030500을 원했는데, 내꺼는 3266136이란다.

W/GooglePlayServicesUtil(4728): Google Play services out of date. Requires 4030500 but found 3266136 


4030500이란 숫자는 뭔가 찾아봤다.

[SDK]\extras\google\google_play_services\libproject\google-play-services_lib\res\values

폴더에 version.xml파일이 있는데, 열어보면 4030500이라는 버전이 적혀있다.

<?xml version="1.0" encoding="utf-8"?> 
<resources>
    <integer name="google_play_services_version">4030500</integer>
</resources>


3266136은 못찾겠다. 어디에 적혀있었을텐데, 버전을 관리하기 위에서 이번부터 리소스에 넣기로 (안드로이드 OS개발자가...) 결정했나보다. 


어쨌든, 그렇다면 해결책은? 두 달전에 이 이슈가 발생했을 때는 해결책이 없었다. 구글플레이서비스 앱은 아직 4030500을  지원하지 않는데, 라이브러리만 4030500으로 올려놓고 먼저 배포한 구글직원의 잘못이었다.

새로운 라이브러리를 삭제하고 다시 잘 동작하던 라이브러리로 원복해서 사용할 수 밖에 없었다.


이 문제를 접한건 2013년 11월 초였는데, 지난 주, 2014년 1월 9일에 구글 플레이 서비스가 업데이트 되었다는 내용이 안드로이드 공식 블로그에 올라왔다. 구글플레이스토어 앱의 버전을 확인하니 4.5.10이란다. 업데이트 되었다. (이전 버전은 4.4.21, 구글플레이스토어 앱은 별도 설치없이 나 몰래 자동업그레이드 된다.) 


다시, 최신 라이브러리를 꺼내서 적용했더니, 잘 동작한다. 해결됐다. 새로운 구글플레이스토어 앱 어딘가에 "4030500"이란 버전명이 적혀있나보다. 이러한 문제가 발생해도 공식적으로 아무런 조언도 해주지 않는 구글이 참 섭섭하지만 어쨌든 일은 해야하니까.. "프로젝트 진행중에는 왠만하면 ADT나 SDK 관련 업데이트를 하지말자!"



Posted by 데브로망스

댓글을 달아 주세요

  1. yong 2016.02.01 10:21  댓글주소  수정/삭제  댓글쓰기

    앱 내에 버전 하드코딩 하신거같은데요. 한번 찾아보세요. 그거 지우면 정상적으로 돌아갈겁니다.

  2. yong 2016.02.01 10:22  댓글주소  수정/삭제  댓글쓰기

    <integer name="google_play_services_version">3266136</integer> 이렇게 하드코딩 되어있을거에요

    • 데브로망스 2016.02.01 10:43 신고  댓글주소  수정/삭제

      아! 하드코딩했던게 아닙니다.
      저때, 발생했던 내용은 본문 그대로입니다.
      구글에서 버전 관리를 잘못해서 발생했다고 판단할 수 밖에 없었습니다.
      (당시, 이런저런 동일 발생 글을 보고 판단했던 기억이 있네요.)

      다행히 최근에는 이런 문제가 발생하지 않네요. ^^

      댓글 감사드립니다!