[Andriod] apktool 이란?
$ apktool build [options] <decoded_dir> [-o <output_file>]
참고) https://guleum-zone.tistory.com/151
[Android] 디컴파일 & 리패키징(Apktool)
개요 Apktool 이란 난독화가 수행된 Android 앱의 개발 코드를 원복 수준 형태로 되돌릴 수 있게 도와주며 앱을 다시 설치하여 실행시킬 수 있게 도와주는 "리버스 엔지니어링" 도구입니다. Apktool은 W
guleum-zone.tistory.com
apktool을 기존에 사용해 본적 있었으나 더 자세히 알아보기 위해 위의 블로그를 인용하여 작성
1. apktool이란?
apktool은 안드로이드 앱의 리소스 파일과 소스 코드를 분석하고 수정하는 데 사용되는 오픈 소스 도구입니다.
이 도구는 APK 파일(안드로이드 앱의 설치 파일)을 디컴파일하여 해당 앱의 리소스 파일과 소스 코드를 추출합니다. 디컴파일된 소스 코드는 Java 코드, XML 파일, 리소스 파일과 관련된 소스 코드 등으로 이루어져 있습니다.
apktool은 특히 안드로이드 앱을 분석하고 수정하는 보안 연구자, 해커, 앱 개발자 등에게 유용합니다. 보안 연구자나 해커는 앱의 보안 취약점을 분석하고 이를 이용하여 앱의 취약점을 개선하거나 공격에 이용할 수 있습니다. 앱 개발자는 apktool을 사용하여 안드로이드 앱의 리소스 파일과 소스 코드를 분석하고, 앱의 디자인, 기능 등을 수정할 수 있습니다.
apktool을 사용하여 디컴파일된 리소스 파일과 소스 코드는 텍스트 파일 형태로 제공됩니다. 이를 수정하여 원하는 내용으로 변경한 후 apktool을 사용하여 다시 재컴파일하여 새로운 APK 파일을 생성할 수 있습니다. 그러나 이때, APK 파일의 서명 정보가 손상됩니다. 서명 정보는 APK 파일의 인증서로 앱의 개발자나 배포자를 식별하는 중요한 정보이므로, 수정된 APK 파일을 배포하기 전에 다시 서명해야 합니다. APK 파일을 서명하는 방법은 안드로이드 개발자 문서에서 자세히 설명되어 있습니다.
apktool은 다양한 운영 체제에서 사용할 수 있습니다. Windows, macOS, Linux 등에서 모두 사용 가능합니다. 또한, apktool은 명령 줄 인터페이스(Command-line Interface, CLI)를 제공하므로, 프로그래밍 언어에서 이를 사용할 수 있습니다.
안드로이드 앱의 디컴파일은 법적인 문제를 야기할 수 있으며, 다른 사람의 개인 정보를 유출할 수 있습니다. 따라서, 안드로이드 앱의 디컴파일은 절대적으로 합법적인 목적으로 사용되어야 하며, 유용성과 함께 주의사항을 염두에 두어야 합니다
2. APKTOOL 의 사용법
apktool은 다양한 명령어를 제공하여 apk파일의 디컴파일, 재컴파일 등을 수행할 수 있습니다.

1. decode: : apk 파일을 디컴파일하여 리소스 파일과 소스 파일을 추출합니다
$ apktool decode [options] <apk_file>
옵션:
- -f : 디컴파일 된 디렉토리가 이미 존재할 경우, 덮어쓰기를 수행합니다
- -o <output_dir> : 디컴파일 된 파일을 저장할 디렉토리를 지정합니다.
ex)
apktool d <AppName> -o <임의 디렉토리 지정>
또한 이렇게 decode 를 d로 요약해서 작성해도 무방합니다.
2. build : 디컴파일 리소스 파일과 소스코드를 기반으로 APK 파일을 재컴파일 합니다
$ apktool build [options] <decoded_dir> [-o <output_file>]
옵션 :
- -f: APK 파일이 이미 존재할 경우, 덮어쓰기를 수행합니다.
- -d: 디버그 모드로 APK 파일을 생성합니다.
- -a <alias>: APK 파일을 서명할 때 사용할 인증서의 별칭을 지정합니다.
- -p <path>: 안드로이드 SDK의 경로를 지정합니다.
- --use-aapt2: aapt2를 사용하여 APK 파일을 생성합니다
ex)
apktool b <패키징 할 폴더명> -o <apk파일명 지정>
이 또한 build를 b로 요약하여 해도 괜찮습니다.
3. apkmod : APK 파일을 수정합니다.
이 명령어는 decode와 build 명령어를 결합해서 작동시키는 원리입니다.
$ apktool apkmod [options] <apk_file> [-o <output_file>]
옵션:
- -f: APK 파일이 이미 존재할 경우, 덮어쓰기를 수행합니다.
- -d: 디버그 모드로 APK 파일을 생성합니다.
- -a <alias>: APK 파일을 서명할 때 사용할 인증서의 별칭을 지정합니다.
- -p <path>: 안드로이드 SDK의 경로를 지정합니다.
- --use-aapt2: aapt2를 사용하여 APK 파일을 생성합니다.
4. 자주 발생하는 오류 2가지

첫 번째로 리패키징 과정에서 에러 메시지가 나타날 경우가 존재합니다. 에러 메시지가 나타나면 커맨드에 출력된 경로를 그대로 타고 들어가 에러가 발생한 파일을 유심히 보시면 해결이 가능합니다.(보통 찌꺼기 파일일 가능성이 존재하기에 삭제하고 진행하시면 됩니다.)

해당 에러의 경우 "AAPT(Android Asset Packaging Tool) 관련한 에러일 가능성이 존재합니다. AAPT는 디렉토리 내부의 이미지나 문자열 등을 효율적으로 컴파일하기 위한 도구라고 보시면 됩니다. 이럴 때는 하단의 명령어를 통해 AAPT를 강제적으로 사용하여 리패키징해주시면 됩니다.
apktool -f b <패키징할 폴더명> -o <apk파일명 지정> --use-aapt2

aapt를 강제적으로 사용함으로 오류 해결이 가능합니다. 만약 위의 명령어를 통해 진행해도 계속 리패키징이 불가능하다면 하단의 명령어를 사용하여 최초에 리소스를 제외하고 디컴파일 해주시면 됩니다.
apktool -f d <AppName> -o <폴더명 지정> -r
또는
apktool --no-res d <AppName> -o <폴더명 지정>

발생한 오류들을 모두 해결하셨다면 위와 같이 성공적으로 리패키징된 것을 확인하실 수 있습니다.

adb 명령을 통해 다시 앱을 설치하는 과정에서 상단의 에러 메시지가 나타나거나 자동으로 install fail이 나타나면 수정된 apk파일에 대한 올바른 서명이 존재하지 않기 때문에 나타난 것입니다.