기존에 웹 서비스를 외부 업체에 외주를 주어 하이브리드 앱이 제작되어 있었다.
이유는 모르겠지만, 로그인 방식이 웹과 앱이 다르게 되어 있는데, 이러니까 소스를 고쳐도 웹은 잘되는데 앱은 이상하더라.
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 클릭
그 다음 부터는 입력폼에 내가 설정하고 싶은 키정보들을 입력하면 된다.
저장된 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 로 들어가면 아래와 같이 웹뷰 정보가 나타난다.
inspect 를 눌러주면 개발자도구툴과 앱 화면이 같이 나오는데 여기서 console log 를 찍어보거나, source 에서 break point 를 걸어서 디버깅할 수 있다. 웹뷰이기 때문에 window 객체에 있는 모든 프로퍼티와 메서드에 접근가능하다.
처음에는 original.apk 를 디컴파일한뒤 내 스마트폰에 설치, PC 를 연결해서 PC 에서 실시간으로 작업한 내용을 안드로이드 스튜디오 logcat 에서 확인하고 싶었다. 방향성을 잡기 위해 ChatGPT 에게 물어보았고, ChatGPT 가 알려준 방법대로 해보았으나 잘되지 않아 ChatGPT 가 알려준 내용에서 키 단어들로 구글링해가며 이것저것 시도해보았고 결국에는 해결했다.
분명히 더 효율적인 방법이 있을 것인데, 나로써는 다른 사람들이 제시하는 방법이 잘 이해되지 않았고, 하라는데로 했는데 에러만 나와서 어려웠다.
다시 이렇게 작업해야 하는 상황이 없을거라고 생각해서 더이상 이 부분에 대한 지식습득에 시간을 투자하지 않으려고 한다.
댓글