본문 바로가기
카테고리 없음

하이브리드앱 디컴파일해서 수정하기(apktool, apksigner, chrome://inspect)

by 찬찬2 2024. 7. 4.

기존에 웹 서비스를 외부 업체에 외주를 주어 하이브리드 앱이 제작되어 있었다.

 

이유는 모르겠지만, 로그인 방식이 웹과 앱이 다르게 되어 있는데, 이러니까 소스를 고쳐도 웹은 잘되는데 앱은 이상하더라.

 

PC 로컬 서버에서 작업하는 것 처럼 모바일에서도 똑같이 할 수 있을까??

 

가능하다. original.apk 를 뜯어서 url 을 localhost 로 연결하면 되니까. 하지만 애뮬레이터에서는 localhost:4200 처럼 쓰면 안되고, http://10.0.2.2:4200 와 같이 주소를 넣어줘야 한다.

 

그런데, net::ERR_CLEARTEXT_NOT_PERMITTED 문구가 모바일 디바이스 스크린에 나오더라. AndroidManifest 에서 usesCleartextTraffic 을 true 로 설정해도, targetSandboxVersion 을 1로 보안설정을 낮춰도, network-security-config 에 cleartextTrafficPermitted 를 true 로 해도 안되더라.

 

하는 수 없이 로컬 주소를 넣지 않고 베포되어 있는 테스트 서버 주소를 넣고 apk 파일을 만들어서 내 스마트폰에 설치했다. 이제 수정하고, 배포하고, 확인하는 번거로운 방법으로 작업해야 한다.

 

디컴파일 하는 방법에 대해서 알아보자...

 

이와 관련해서 게시글이 많이 있다. 하지만 나 처럼 안드로이드 스튜디오를 써본적이 없는 웹 개발자 입장에서는 게시글들을 다소 이해하기 어려웠다.

 

1. apktool 설치

특별할 것 없다. 인터넷에서 apktool 검색해서 최신 버전을 받고, install 하는 메뉴에 들어가면 실행하는 방법을 알려주는데 그대로 하면 된다.

 

2. 터미널에서 apktool 실행

터미널에서 apktool 을 실행하면 에러가 발생한다고 하는 사람이 있다. windows 폴더에 설치하고, powershell 이든 뭐든, 사용하고 있는 터미널을 관리자 권한으로 실행하면 된다고한다.

 

3. apktool 디컴파일 커맨드

apktool d target.apk -o decompile-app

 

이렇게 하면 target.apk 을 디컴파일한 폴더 decompile-app 이 생성되고, 이 안에 디컴파일된 소스들이 있다.

 

4. 디컴파일된 소스 수정하기

안드로이드 스튜디오에서 decompile-app 폴더를 열고 코드를 수정하면 된다.

여기서 골치아팠던게 디컴파일하고 나니 smali 파일들이더라. 이건 또 뭐냐... 이전 회사 서비스도 하이브리드앱이라 안드로이드 스튜디오에서 코틀린 문법을 조금씩 보기는 했지만 smali 파일은 뭔가 압축된 형태인 것 같았다. 나는 단순히 앱이 가르키고 있는 URL 주소만 변경하면 되었기에 smali 에 대해 깊히 알아보지 않았다.

기존 URL 주소로 프로젝트 전체에서 검색했을때 나오는 파일들에 테스트 주소를 넣었다.

 

5. 다시 컴파일 하기

apktool b decompile-app -o test.apk

 

코드를 잘못 수정하면 컴파일이 안되는 경우가 있다.

이제 끝이라고 생각했는가? 위에 커맨드로 생성된 test.apk 를 sign(서명) 해줘야 한다. 이 것 때문에 시간이 많이 걸렷는데... sign 하는 방법이 여러 가지 있는데 일단 나 처럼 앱에 초보라면 시키는데로 해보아라.

 

핵심:

- 서명정보를 담고 있는 jks 파일이 필요하다는 것.

- 터미널에서 apsigner 로 apk 에 서명을 해줘야 한다는 것.

 

 서명정보를 담고 있는 jks 파일 만들기.

이걸 또다른 말로 key 라고 부르더라. 서명과 키... 나는 무식한 방법으로 했을 수도 있는데, 우선 안드로이드 스튜디오에서 아무 프로젝트를 새롭게 만들고, Build → Generate Signed App Bundle or APK 를 누르고 APK 를 체크 create new 클릭

그 다음 부터는 입력폼에 내가 설정하고 싶은 키정보들을 입력하면 된다.

 

위 입력폼에 있는 password 와 confirm 은 필수 입력칸으로써, 모두 입력해주시오

 

저장된 jks 파일을 일단 복사하자.

 

터미널 실행하기 - APK 서명

안드로이드 스튜디오가 저장된 폴더 안에 Sdk > build-tools > 내가 설치한 SDK 버전(나는 35.0.0) 폴더에 test.apk 와 jks 파일을 옮겨준다. 이 폴더에는 apsigner.bat 파일이 있는데 이게 있어야 터미널에서 아래 머캔드가 먹힌다. (처음에는 이 파일만 빼서 내가 원하는 폴더에서 실행해보았으나, 에러가 나더라.)

 

apksigner sign --ks ttttest.jks --out signed-test.apk test.apk

 

실행하면 터미널에서 앞에서 서명한 jks 파일에 담겨있는 key 비밀번호를 입력하라고 한다. 입력해주면 마침내 "signed-text.apk" 파일이 생성된다. 생성된 apk 파일을 내 스마트폰에 설치한 뒤 PC 에 연결한다. 모바일에서 데이터 전송 허용을 눌러주고, 이제 크롬을 켜서 chrome://inspect#device 로 들어가면 아래와 같이 웹뷰 정보가 나타난다.

 

하이브리드앱의 경우, apk 파일로 설치된 경우에만 inspect 가능하다.

 

inspect 를 눌러주면 개발자도구툴과 앱 화면이 같이 나오는데 여기서 console log 를 찍어보거나, source 에서 break point 를 걸어서 디버깅할 수 있다. 웹뷰이기 때문에 window 객체에 있는 모든 프로퍼티와 메서드에 접근가능하다.

 


 

처음에는 original.apk 를 디컴파일한뒤 내 스마트폰에 설치, PC 를 연결해서 PC 에서 실시간으로 작업한 내용을 안드로이드 스튜디오 logcat 에서 확인하고 싶었다. 방향성을 잡기 위해 ChatGPT 에게 물어보았고, ChatGPT 가 알려준 방법대로 해보았으나 잘되지 않아 ChatGPT 가 알려준 내용에서 키 단어들로 구글링해가며 이것저것 시도해보았고 결국에는 해결했다.

 

분명히 더 효율적인 방법이 있을 것인데, 나로써는 다른 사람들이 제시하는 방법이 잘 이해되지 않았고, 하라는데로 했는데 에러만 나와서 어려웠다.

 

다시 이렇게 작업해야 하는 상황이 없을거라고 생각해서 더이상 이 부분에 대한 지식습득에 시간을 투자하지 않으려고 한다.

댓글