테크 지식
[커뮤니티] Sony Xperia XZ 복원기 - 꼬여버린 TA 복구하기
안녕하세요. 잉여공학도 시류아 입니다.HTC 센세이션(12년)을 사용하던 시절 이후 몇 년만에 하드브릭이 된 기기에 대해서 복구 작업을 진행해보았습니다.앞으로 많은 분들께서 동일한 경우가 있을 경우 복구를 하시길 바라는 마음에서 한 번 차근차근 복원기를 작성해보고자 하니,제가 진행한 기기와 비슷한 경우가 있으실 경우 많은 참고부탁드리겠습니다.
주의사항
1. 진행한 방법은 100% 가능한 방법이 아닙니다.2. 진행한 방법은 분명히 무식한 방법입니다. 이 방법을 이용해서 성공하면 좋지만, 반대로 더 이상 복구가 불가능하게 될 수 있습니다.3. 메인보드가 복구가 불가능해도 상관없어서 공부 목적으로 해보겠다가 아닌 이상 권장하지 않습니다.4. 진행했던 과정이 상당히 복잡합니다. 따라하실 것이라면 몇 번의 정독 후 진행해보시길 바랍니다.5.진행한 방법에 대해서 문의하실 경우 저는 자세한 피드백을 드리지 못합니다. 저 역시 우연치 않게 성공한 사례입니다.6. 없어진 TA 에 대해서 다시 만들어내는 것이 아닙니다. 꼬인 TA 에 대해서 복구작업하는 것입니다.
복원을 할 기기 상태
1. Sony Xperia XZ(F8331)2. XZ의 순정 복원 과정에서 TA Backup Raw Img 파일을 XZ(F8331)의 백업파일이 아닌, 다른 기기인 Z5P(E6853)의 백업 파일로 복원하여, TA Partition 상의 등록 정보가 Z5P(E6853)으로 변경된 상태3. 기기의 하드웨어 정보와 TA Partition 상의 등록 정보가 매칭되지 않아서 부팅 시퀀스가 진행되지 않고 Flash Mode 로 자동 진입4. 전원/USB를 연결 할 경우 자동으로 Flash Mode 로만 진입이되며, System/Fastboot/Recovery 로는 진입이 불가능 한 상황5. 다행히도 기존 사용자가 오리지널 TA Backup 은 잘 보관중인 상태
왜 하드브릭인가?
Xperia 같은 경우 대략적으로 해결을 위해서 분석해본 결과 TA Partition 상의 정보와 기기의 하드웨어 정보가 일치되지 않을 경우 부팅이 되지 않고, 자동으로 Flash Mode 로 진입하게 되어있었습니다.복구를 위해서 Flash Tool 을 이용해서 진행해본 결과, 복원하려는 파일과 TA Partition 상의 정보가 틀려서 Flash 가 이루어지지 않는 상태가 유지되었고, 소프트 브릭이지만 일반적으로 복구가 불가능하기 때문에 하드브릭 상태로 정의하였습니다.
왜 Flash Tool 에서 복구가 되지 않는가?
Flashtool 은 기본적으로 TA Partition 에서 기기의 하드웨어 정보(Header)를 읽어와서 덮어 씌우려고 하는 펌웨어의 정보와 연결된 하드웨어 정보(Current device)가 서로 일치 할 경우에 대해서만 Flash를 진행 할 수 있도록 합니다.복원을 진행한 기기 같은 경우 TA Partition 에는 Z5P(E6853)로 등록되어있고, 복원을 진행해야되는 파일들은 전부 XZ(F8331)로 되어있어, 정보 매칭 과정에서 일치하지 않아 더 이상 진행할 수 없다고 ERROR 메세지 발생(The bundle does not match the connected device) 및 프로세스가 종료됩니다.
어떻게 복구 할 방법이 없는 것인가?
사용자 입장에서 가장 간단한 방법은 기기가 정상적으로 부팅이 되지 않는다고하면서, A/S 센터를 통해서 수리를 받는 것이 가장 빠르고 정상적인 방법 중 하나입니다. 이 경우 메인보드 교체를 진행하게되며, 그 만큼의 비용이 추가적으로 발생하게 됩니다.다른 방법이라면 살아있는 나머지 부속품들에 대해서 수리용 기기로 타인에게 판매하여 다른 기종으로 넘어가는 것 역시 방법 중 하나입니다.즉, 일반적인 방법으로는 확실하게 복구 할 방법이 없는 상태입니다.
복원기이지 않는가? 본인은 어떻게 했는가?
복원을 진행한 기기 같은 경우, 이전 사용자가 TA Partition 복원 과정에서 실수를 통해서 소프트웨어적으로 이슈 발생 시킨 것입니다. 즉, 메인보드가 완전히 파손되지 않았고, Flash Mode 상태로 장치 연결이 이상없이 진행되는 상태이므로, 저는 충분히 소프트웨어적으로 복원이 가능하다 판단했습니다.몇 가지 테스트를 진행해본 결과 Flash Tool 을 이용해서 Flash 과정이 진행되는 상황에서 덮어씌우려는 파일 정보와 기기의 하드웨어 정보(Header)가 일치하지 않기 때문에 계속해서 오류가 발생하는 것이므로, Flash Tool 의 Source 를 받아서 정보 매칭하는 부분 및 문제가 있다고 에러 경고를 내보내면서 종료시키는 부분에 대해서 주석처리하여 수정하는 것으로 충분히 강제적으로 TA Partition 에 대해서 Raw File 상태로 복원이 가능하다 판단하고 실행으로 옮겼습니다.
어떻게 하는가? - 환경 준비
먼저 시작하기 앞서서 몇 가지 준비 과정이 필요로 합니다.1. Flash Tool 설치
수정하기 앞서서 Flash Tool 기본적으로 필요로 합니다. 설치를 진행해주세요.2. Flash Tool Source
Androxyde/Flashtool Flashtool - Xperia device flashing github.com 자세히보기
"Clone or Download"에서 "Download ZIP"을 선택하여 원본 소스 파일들을 전부 다운로드 받아놓습니다.3. Java SE Development Kit 설치
본인이 사용하시는 OS 환경에 맞추어서 Java SE 를 다운로드 받아서 설치합니다.4. JAVA 환경변수 설정하기
JAVA 환경변수를 설정합니다.5. Eclipse 를 설치
Flash Tool 의 소스 수정 및 컴파일하여 구동시킬 목적으로 Eclipse Java IDE 를 설치합니다.6. Android USB Driver 설치https://dl-ssl.google.com/android/repository/latest_usb_driver_windows.zipAndroid USB Driver 를 다운로드 받으 신 후 inf 파일을 설치해주세요.7. Xperia XZ Driver 설치
Xperia XZ 의 USB 드라이버를 설치하여 Flash Tool 에서 장치가 연결 가능하도록 해주세요.
어떻게 하는가? - Flash Tool 코드 수정
Flash Tool 의 소스 코드를 수정을 진행해야되기 때문에, Eclipse 로 코드를 불러와야 됩니다.먼저 설치한 Eclipse JAVA 를 실행합니다.
좌측 상단 Open Projects from File System.. 을 선택합니다.
다운로드 받은 Flashtool-master.zip 압축파일을 풀고, 이클립스에서 우측 상단의 Directory 를 선택, 압축 푼 폴더를 선택하고 Finish 를 눌러줍니다.
좌측에 Package Explorer 창에 Flash Tool 소스 관련 폴더들이 올라오는 것을 확인합니다.정상적으로 올라오는가요?그럼 손대야될 것은 딱 하나, "src/flashsystem" 경로에 있는 "S1Flasher.java" 파일입니다.더블클릭하여 열어주세요.
"S1Flasher.java" 를 보게되면, 기기의 헤더를 받아오고 Flash 를 진행하는 부분까지 다양한 Class 들이 있습니다. 요기서 총 5개의 Class 에 주석처리(또는 삭제)를 진행해야 됩니다.자세한 수정사항은 아래를 참고해주세요.
1. processHeader(SinFile sin)
private void processHeader(SinFile sin) throws X10FlashException { //try { logger.info(" Checking header"); // if (!_bundle.simulate()) { // cmd.send(S1Command.CMD05, sin.getHeader(), false); // } //} //catch (IOException ioe) { // throw new X10FlashException("Error in processHeader : "+ioe.getMessage()); //} }
기기 정보를 읽어와서 체크를 진행하는 부분으로 파악됩니다. 진행 과정에서 체크하지 않도록 주석처리 합니다.
2. uploadImage(SinFile sin)
이미지는 1번 참고해주세요 :)
private void uploadImage(SinFile sin) throws X10FlashException { ... catch (Exception e) { logger.error("Processing of "+sin.getName()+" finished with errors."); //sin.closeFromSending(); //e.printStackTrace(); //throw new X10FlashException (e.getMessage()); } }
업로드 하는 도중에 이름이 매칭되지 않을 경우 에러로 종료하도록 되어있는 것으로 파악됩니다.log만 출력하도록 하고 주석처리 합니다.
3. sendLoader()
public void sendLoader() throws FileNotFoundException, IOException, X10FlashException, SinFileException { ... if (_bundle.hasLoader()) { SinFile sin = new SinFile(new File(_bundle.getLoader().getAbsolutePath())); if (sin.getVersion()>=2) sin.setChunkSize(0x10000); else sin.setChunkSize(0x1000); uploadImage(sin); if (!_bundle.simulate()) { //USBFlash.readS1Reply(); } } ...
장치에서 loader 사용 유무에 대해서 파악하는 것으로 보입니다. loader 를 사용하는 기기는 문제없지만, 사용하지 않는 기기 같은 경우 에러로그를 띄운 후 종료하게 됩니다.이 경우를 막기 위해 USBFlash.readS1Reply() 에 대해서 주석처리합니다.
4. flash()
public void flash() throws X10FlashException, IOException { ... catch (Exception ioe) { //ioe.printStackTrace(); //close(); logger.error(ioe.getMessage()); logger.error("Error flashing. Aborted"); //LogProgress.initProgress(0); } }
flash 를 진행하는 과정에서 만약의 오류가 있을 경우 강제로 종료하도록 되어있는 듯 합니다. 중간에 매칭이 맞지 않는 것이 파악되어도 위의 구문에서 종료처리를 하는 듯 하니, 주석처리하여 무시하고 계속 진행하도록 합니다.
5. open(boolean simulate)
public boolean open(boolean simulate) { ... if (_bundle.getDevice()!=null) { if (_bundle.getDevice().length()>0 && !currentdevice.equals(_bundle.getDevice())) { logger.error("The bundle does not match the connected device"); //close(); //found=false; found=true; } else found=true; } ...
정보가 매칭되지 않으면 에러로그를 띄우고 종료하게 되어있습니다.종료를 진행하는 close() 에 대해서 주석처리하고 found 값에 대해서는 true 로 변환시켜 매칭된 것으로 속이도록 합니다.
어떻게 하는가? - 수정한 Flash Tool 실행
수정을 완료하셨다면, 이제 수정한 Flash Tool 을 실행할 차례입니다.
우측 Package Explorer 에서 "src"폴더 또는 "gui" 를 선택하고 우클릭하여,Run As > Run Configurations... 를 클릭합니다.
Run Configurations 창이 올라오면 Name 은 Main, Project 는 Flashtool, Main class 는 gui.Main 으로 설정하고 Run 을 누릅니다.
오류 없이 수정이 완료되었다면, 정상적으로 수정된 Flash Tool 이 로딩됩니다.
어떻게 하는가? - TA 복원하기
수정한 Flash Tool 은 우리가 집어넣으려는 이미지와 기기의 상태정보를 비교하지 않도록 되어있기 때문에, TA Raw Image 에 대해서 강제적으로 집어 넣을 수 있습니다.
Advanced > Trim Area > S1 > Flash from raw image 를 클릭하여 TA Backup Image 를 넣습니다.
정상적인 TA Image 파일을 선택하고..
Partition 을 2 로 설정하고, TA Unit list 에서 TA Unit to flash 로 전부 옮긴 후 Flash 를 눌러서 Flash 를 진행합니다. (Partition 1은 진행하지 않았습니다.)
Flash 를 진행하면 기기가 매칭되지 않는다, loader 를 찾을 수 없다 등 오류 알림이 올라오지만, 이를 무시하고 강제적으로 Flash 작업이 진행되어, 위의 이미지와 같이 TA partition에 대해서 writing 작업이 진행되게 됩니다.
Flash 작업이 정상적으로 완료되고 나면, 강제적으로 휴대폰은 PC 와의 연결이 끊어지게 됩니다. 이후 전원이 연결되어있으면, 위의 화면이 나타났다가 꺼지는 현상을 계속해서 반복하게 됩니다.이로서 TA 파티션에서 기기 정보(Current Device)관련해서 일부 복구되었으며, 무한 Flash Mode 에서 벗어나게 되었습니다.
왜 Partition 2 만 TA Flash 진행했는가?
이 부분은 진행하는 기기마다 분명히 차이가 있을 것이라 생각됩니다. 몇 차례 테스트 및 코드를 보고 확정지은 부분이지만, 제가 복원을 진행한 XZ 같은 경우 Opening TA partition 에서 항상 partition 2 를 열었습니다.즉 기기 정보(Current device)가 TA partition 2 에 있다고 판단하게 되었으며, 복원 과정에서 당장 진행할 필요가 없다 생각된 TA partition 1 에 대해서는 생략하였습니다.
어떻게 하는가? - 복구 마무리하기
Xperia 같은 경우 위의 이미지가 올라오면 대다수 커스텀 펌웨어가 올라간 상태에서 부트로더 락이 걸려있을 경우 뜨는 것으로 알고있습니다. 이제 수정한 Flash Tool 이 아닌, 정식 Flash Tool 을 이용해서 부트로더 언락을 진행합니다.
BLU 를 눌러서 부트로더 언락을 진행하게되면 정상적으로 기기 정보(Current device)가 F8331로 올라오는 것을 확인 할 수 있으며, fastboot mode 로 넘어가라는 구문까지 확인 할 수 있습니다.
fastboot mode 로 넘거가면 IMEI 코드가 나타나면서 Unlock Code 를 입력하라고 합니다. Unlock Code 를 입력하여 Unlock 을 진행합니다.
이후 기기가 재부팅되면서 정상적으로 부팅되는 것을 확인 할 수 있습니다. 이전 사용자 분께서는 AOSP를 올려두셨는지 초기화된 AOSP가 부팅되었습니다. 이로서 기기 정상화가 완료되었습니다.
마지막으로 ADB를 이용하여 Recovery 모드로 접속, 아래의 구문을 이용하여 TA 에 대해서 완벽하게 복원 작업을 진행하고, Flashtool 을 이용하여 완전히 순정 펌웨어를 올리는 것으로 복원작업을 마무리합니다.
adb push TA.img /data/local/tmp/TA.img adb shell dd if=/data/local/tmp/TA.img of=/dev/block/bootdevice/by-name/TA
마무리..
TA 파티션이 꼬여버린 Sony Xperia XZ 에 대해서 복원 작업을 한 번 쭉 해보았습니다. 진짜 몇 년 만에복원 작업을 진행하니 힘드네요 ㅎㅎ;;원리 및 수정하는 부분은 정말 간단한데 이를 진행하기 위해서 Flash 진행과정 하나하나에 대해서 몇 차례의 시행착오를 겪고 문제 없이 넘어가도록 분석 하는 과정이 참 오래걸렸던 것 같습니다.확실히 제가 진행한 방법이 무식한 방법이기는 하지만, 그래도 성공해서 정상적인 기기를 얻게 되었다는 점과 이렇게라도 TA 가 꼬였을때 복원 할 방법을 찾은 것이 가장 큰 수확이 아니였는가 싶습니다.제 복원기를 바탕으로 비슷한 경우가 있으신 분들께서 복원하여 정상적으로 사용하실 수 있기를 바랍니다.이상 끝.감사합니다 :)