1. 문제 상황 및 오류 메시지 분석
안드로이드 APK 파일을 디컴파일한 후 다시 리빌드(Rebuild)하는 과정에서 다음과 같은 유형의 오류가 발생하며 작업이 중단되는 경우가 있습니다. 특히 Windows 환경에서 사용자 계정명이 한글이나 특수 문자로 설정된 경우 빈번하게 나타납니다.
W: ziparchive: Unable to open 'C:\Users\관리자\AppData\Local\apktool\framework\1.apk': Illegal byte sequence
W: Error opening archive C:\Users\관리자\AppData\Local\apktool\framework\1.apk: I/O error
W: AndroidManifest.xml:1: error: No resource identifier found for attribute 'compileSdkVersion' in package 'android'
이 오류의 핵심은 프레임워크 파일(1.apk)을 로드하지 못하는 것에 있습니다. Apktool은 리소스를 해석하기 위해 시스템 프레임워크 파일이 필요한데, 기본 경로인 사용자 폴더(AppData) 내에 한글이나 공백 등 비 ASCII 문자가 포함되어 있으면 인코딩 문제로 인해 파일을 찾지 못하게 됩니다.
2. 해결 방법: 프레임워크 경로 수동 지정
이 문제를 해결하는 가장 확실한 방법은 특수 문자가 없는 안전한 경로(예: C:\apk_work\framework)를 생성하고, Apktool이 해당 경로를 참조하도록 명령어를 명시하는 것입니다.
단계 1: 디컴파일 시 프레임워크 경로 설정
APK를 분해할 때부터 프레임워크 파일이 저장될 위치를 직접 지정합니다. -p 옵션을 사용하여 경로를 설정할 수 있습니다.
# 명령어 구조
# apktool d [원본_파일] -o [출력_폴더] -p [프레임워크_저장_경로]
apktool d sample_app.apk -o ./decompiled_out -p C:\Android\apktool_framework
위 명령어를 실행하면 지정한 경로(C:\Android\apktool_framework)에 1.apk 파일이 생성되거나 해당 위치의 파일을 참조하게 됩니다.
단계 2: 수정 후 리빌드(Build) 수행
파일 수정을 마친 후 다시 APK로 합칠 때도 동일한 프레임워크 경로를 참조해야 합니다. 이때는 --frame-path 옵션을 사용합니다. 단순하게 -p를 사용할 수도 있지만, 빌드 시에는 명확한 경로 지정을 위해 아래 형식을 권장합니다.
# 명령어 구조
# apktool b [수정된_폴더] --frame-path [프레임워크_참조_경로]
apktool b ./decompiled_out --frame-path C:\Android\apktool_framework
성공적으로 빌드가 완료되면 decompiled_out/dist 폴더 내에 다시 패키징된 APK 파일이 생성됩니다.
3. 핵심 요약 및 주의 사항
- 경로 단순화: 안드로이드 개발 및 리버스 엔지니어링 도구는 경로 내 한글이나 공백에 취약합니다. 작업 디렉토리와 도구 경로는 반드시 영문 위주로 구성하는 것이 좋습니다.
- 프레임워크 파일: 만약 특정 기기에서 추출한 앱의 리소스 오류가 계속된다면, 해당 기기의
/system/framework/framework-res.apk파일을 가져와apktool if framework-res.apk -p [경로]명령어로 미리 설치해두어야 합니다. - 환경 변수: 매번 경로를 입력하기 번거롭다면 시스템 환경 변수에
APKTOOL_FRAMEWORK_DIR를 설정하는 방법도 고려할 수 있으나, 명령어 옵션을 통한 명시적 지정이 가장 오류가 적습니다.