JS

2013년 9월 28일 토요일

기기 관리자 문제 해결

문제가 발생하는 원인:
* OTA를 빨리 받기 위한 방법 중에 Google Services Framework의 데이터를 지우는 방법이 있다. 그런데 이 방법을 적용하면 몇 가지 문제가 발생하기도 한다.

안드로이드 기기 관리자에 내 기기가 안 보이는 경우

참고: https://support.google.com/accounts/answer/3265955?hl=ko

1. Google 설정에서 원격 기기 초기화 허용을 비활성화한다.
2. 설정 > 애플리케이션에서 Google Play 서비스의 데이터를 지운다.
3. Google 설정에서 원격 기기 초기화 허용을 활성화한다.
4. 기기를 리부팅하고 기다린다.

구글 플레이 스토어에서 내 기기가 안 보이는 경우 (앱 원격 설치 불가능)

참고: https://support.google.com/googleplay/answer/1141080?hl=en

1. 설정 > 애플리케이션에서 Google Play 스토어의 데이터를 지운다.
2. 플레이 스토어를 다시 실행하면 약관 동의를 묻는 창이 다시 나올 것이다. 여기에 동의하고 기다린다.

2013년 9월 27일 금요일

넥서스 7 (2013) OTA 실패

넥서스 7 (2013)을 루팅 등을 하지 않고 순정 상태로 사용 중이었다. 그런데 시스템 업데이트 과정에서 오류가 발생하였다. 처음에는 일시적인 오류라고 착각을 했는데, 같은 오류가 두세번 반복되고 난 후, 내 넥서스 7에 문제가 있다는 것을 알게 되었다. 오류가 발생한 화면에서 volume up key + power key를 누르면 recovery mode가 나오면서 어디서 오류가 발생했는지도 볼 수 있다. 에러 메시지는 다음과 같았다.

Finding update package...
Opening update package...
Verifying update package...
Installing update...
Verifying current system...
assert failed: apply_patch_check("/system/framework/framework-res.apk", "d6ff2a1767bec4e906ee8498fc852d74c16e328d", "b92dd7bde4e18298ee24053ba36436f4f03fcb79")
E:Error in /cache/58a0583c950458ab96dc1fc29b020c6782493c3b.signed-razor-JSS15R-from-JSS15Q.58a0583c.zip
(Status 7)
Installation aborted.

정상적인 방법으로 OTA를 시도한 경우에도 실패했고, adb sideload를 이용한 방법도 실패했다. 공장 초기화를 한 후 다시 시스템 업데이트를 시도한 경우에도 실패했다. 모든 경우에 위와 같은 assert failed 메시지가 나타났다.

* 루팅을 시도하지도 않았고, 커스톰 롬을 설치하지도 않았다.

* 설정의 메뉴에서 공장 초기화를 해도 문제는 해결되지 않았다.

* 리커버리 모드에서 공장 초기화를 해도 문제는 해결되지 않았다.

* 위 메시지에서 assert failed에 해당하는 부분은 OTA update 파일에서 META-INF/com/google/android/update-script의 line #196에 해당하는 내용이다.

* 루팅은 하지 않았고, 시스템 파티션에 read-only로 접근 가능하다. adb pull /system/framework/framework-res.apk로 JSS15Q 상태의 기기에서 framework-res.apk를 추출한 후 sha1sum을 해보니 결과는 b92dd7bd... 이였다.

* Factory image의 압축을 해제한 후 apk의 파일을 추출할 수 있다 (참고1, 참고2). 요약하면 sgs2toext4.jar을 이용하여 .img 파일을 .ext4.img 파일로 바꿀 수 있고, 그 파일은 DiskInternals Linux Reader에서 읽을 수 있다. 이렇게 해서 framework-res.apk를 추출했고, 그 파일의 sha1sum은 b92dd7bd... 이였다.

* 그리고 d6ff2a17...은 업데이트 적용 후의 sha1sum인 것 같다.

* OTA 파일에서 patch/system/framework/framework-res.apk.p가 바이너리 패치 파일인 것 같다.

* apply_patch_check가 정확히 무슨 일을 하는지 모르겠다. 내 시스템에서 framework-res.apk의 sha1sum은 분명히 문제가 없다. 그리고 OTA 파일도 아마 문제가 없을 것이다. 정상적인 방법(sideload 말고)을 이용했을 때도 같은 에러가 발생했으며, 에러 메시지에서 보이는 파일명(zip 파일)은 sideload를 위해 다운 받은 zip 파일의 파일명과 일치하기 때문이다.

안드로이드 adb를 설치하고 사용하는 방법

1. SDK 설치

여기를 클릭하여 Android SDK에 접속하여, 필요한 프로그램을 다운받아 설치해야 한다. 참고로 ADT bundle이라고 되어 있는 것은 이런 저런 프로그램이 통합되어 있어서 용량이 크다. 앱을 개발할 생각이 없다면 SDK tools only라고 되어 있는 것을 다운받아서 설치해도 된다. 본인에게 맞는 방법으로 설치하자. 참고로 JDK도 설치해야 된다. System requirements에 자세히 적혀 있다.


SDK 설치가 완료되면 Android SDK Manager를 실행하고 Tools/Android SDK Platform-tools를 설치한다. 앱을 개발할 계획이 없다면 Android 4.3 (API 18) 등은 설치하지 않아도 된다.



2. USB 드라이버 설치

단순히 파일 복사만 하는 경우에는 드라이버를 설치하지 않아도 되지만, USB 디버깅을 하려면 추가 드라이버를 설치해야 한다. 이 드라이버는 제품에 따라 다운 받는 위치가 다르다. 이 글에서는 윈도우에서 넥서스 7 (2013)을 사용하는 경우를 기준으로 설명하겠다. 그 이외의 상황이라면 윈도우를 쓰는 경우에는 win-usb.html 또는 oem-usb.html을 참고하고, 다른 운영체제를 쓰는 경우에는 device.html을 참고하자.

Android SDK Manager를 실행하고 Extras/Google USB Driver를 설치한다. 앱을 개발할 계획이 없다면 Android 4.3 (API 18) 등은 설치하지 않아도 된다.

그 다음에 윈도우의 장치 관리자를 열고 기타 장치에서 느낌표가 떠 있는 Nexus 7을 선택하여 드라이버 업데이트를 한다. 수동으로 설치하는 옵션을 선택하자. 그 다음 드라이버를 검색할 위치를 지정해야 한다. 이 위치를 C:\Program Files\Android\android-sdk\extras\google\usb_driver으로 지정한다. (정확한 위치는 android-sdk를 설치한 위치에 따라 알맞게 수정.)

설치가 제대로 되었는지 확인하려면 cmd 창에서 adb devices 명령을 내려보고 기기가 나타나는지 보면 된다. adb가 기본적으로 PATH에 없으므로 PATH를 수정하든가 C:\Program Files\Android\android-sdk\platform-tools에서 cmd를 열어야 한다.

3. Recovery 모드에서 adb 사용

USB 코드가 달라서 드라이버를 또 설치해야 한다. 방법은 위와 비슷한데, 드라이버를 검색하는 옵션 대신 드라이버 목록에서 직접 선택하는 옵션을 사용해야 한다. 그렇게 하지 않으면 설치가 안 된다. (수동 설치 -> 직접 선택 -> (모든 장치) -> 디스크 있음 -> Andorid ADB Interface 선택)