AAPT2(Android Asset Packaging Tool)는 Android 스튜디오 및 Android Gradle 플러그인이 앱의 리소스를 컴파일하고 패키징하는 데 사용하는 빌드 도구입니다. AAPT2는 리소스를 Android 플랫폼에 최적화된 바이너리 형식으로 파싱하고 색인을 생성하며 컴파일합니다.
Android Gradle 플러그인 3.0.0 이상에서는 기본적으로 AAPT2가 사용 설정됩니다. 일반적으로 aapt2
를 직접 호출하지 않아도 됩니다. 그러나 Android 스튜디오 대신 터미널 및 자체 빌드 시스템 사용을 선호한다면 명령줄에서 AAPT2를 사용할 수 있습니다. 명령줄에서 AAPT2와 관련된 빌드 오류를 디버그할 수도 있습니다. 이렇게 하려면 Android SDK 빌드 도구 26.0.2 이상에서 AAPT2를 독립형 도구로 사용하면 됩니다.
명령줄에서 Android SDK 빌드 도구를 다운로드하려면 sdkmanager
를 사용하여 다음 명령어를 실행합니다.
sdkmanager "build-tools;build-tools-version"
SDK 빌드 도구를 다운로드하고 나면 android_sdk/build-tools/version/
에서 AAPT2를 찾으세요.
Android SDK 빌드 도구의 버전은 자주 출시되지 않으므로 SDK 빌드 도구에 포함된 AAPT2가 최신 버전이 아닐 수도 있습니다. AAPT2의 최신 버전을 받으려면 Google Maven에서 AAPT2를 다운로드하세요.
Linux 또는 Mac의 명령줄에서 AAPT2를 사용하려면 aapt2
명령어를 실행합니다.
Windows의 경우 aapt2.exe
명령어를 실행합니다.
AAPT2에서는 증분 컴파일을 사용 설정하여 리소스를 더 빨리 컴파일할 수 있습니다. 증분 컴파일을 위해 리소스 처리는 다음 두 단계로 구분됩니다.
이렇게 구분하면 증분 빌드의 성능 향상에 도움이 됩니다. 예를 들어 파일 하나가 변경된 경우 그 파일만 다시 컴파일하면 됩니다.
Google Maven에서 AAPT2 다운로드
빌드 도구에 번들로 포함되지 않은 AAPT2의 최신 버전이 필요한 경우 다음과 같이 Google Maven 저장소에서 AAPT2를 다운로드하세요.
- 저장소 색인에서 com.android.tools.build > aapt2로 이동합니다.
- AAPT2 최신 버전의 이름을 복사합니다.
복사한 버전 이름을 다음 URL에 삽입하고 타겟 운영체제를 지정합니다. https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar
예를 들어 Windows용 버전 3.2.0-alpha18-4804415를 다운로드하려면 다음을 사용합니다. https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ 3.2.0-alpha18-4804415/aapt2-3.2.0-alpha18-4804415-windows.jar
브라우저에서 URL로 이동하면 곧 AAPT2 다운로드가 시작됩니다.
방금 다운로드한 JAR 파일의 패키지를 해제합니다.
JAR 파일에는
aapt2
실행 파일과 실행 파일에서 사용하는 라이브러리가 포함되어야 합니다.
컴파일
AAPT2는 모든 Android 리소스 유형(예: 드로어블 및 XML 파일)의 컴파일을 지원합니다. 컴파일을 위해 AAPT2를 호출하는 경우 단일 리소스 파일을 호출당 입력으로 전달합니다. 그런 다음 AAPT2는 파일을 파싱하고 확장자가 .flat
인 중간 바이너리 파일을 생성합니다.
전체 디렉터리를 전달하면 AAPT2는 리소스가 하나만 변경되었더라도 디렉터리의 모든 파일을 재컴파일합니다. --dir
플래그를 사용하여 리소스 파일이 두 개 이상 포함된 리소스 디렉터리를 AAPT2에 전달할 수 있지만 이렇게 하면 증분 리소스 컴파일의 이점을 활용하지 못합니다.
출력 파일 형식은 다음 표와 같이 컴파일을 위해 제공하는 입력에 따라 다를 수 있습니다.
입력 | 출력 |
---|---|
문자열, 스타일과 같은 XML 리소스 파일(res/values/ 디렉터리에 있음)
|
확장자가 *.arsc.flat 인 리소스 테이블 |
다른 모든 리소스 파일 |
또한 기본적으로 모든 PNG 파일이 크런치되며 |
AAPT2 출력 파일은 실행 파일이 아니므로 APK를 생성하려면 나중에 링크 단계에서 이러한 바이너리 파일을 입력으로 포함해야 합니다. 그러나 생성된 APK 파일은 Android 기기에 즉시 배포할 수 있는 실행 파일이 아닙니다. DEX 파일이 포함되어 있지 않고 서명되지 않았기 때문입니다.
컴파일 문법
compile
을 사용하는 일반적인 구문은 다음과 같습니다.
aapt2 compile path-to-input-files [options] -o output-directory/
다음 예에서 AAPT2는 이름이 각각 values.xml
및 myImage.png
인 리소스 파일을 컴파일합니다.
aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/ aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/
표 1에서 볼 수 있듯이 출력 파일의 이름은 입력 파일 이름과 그 상위 디렉터리의 이름에 따라 다릅니다.
앞의 예에서 strings.xml
파일을 입력으로 사용하면 aapt2
는 자동으로 출력 파일의 이름을 values-en_strings.arsc.flat
으로 지정합니다. 그러나 드로어블 디렉터리에 저장된 컴파일된 드로어블 파일의 이름은 drawable_img.png.flat
입니다.
컴파일 옵션
표 2와 같이 compile
명령어와 함께 사용할 수 있는 몇 가지 옵션이 있습니다.
옵션 | 설명 |
---|---|
-o path
|
컴파일된 리소스의 출력 경로를 지정합니다. AAPT2가 컴파일된 리소스를 출력 및 저장할 수 있는 디렉터리의 경로를 지정해야 하므로 이 옵션은 필수 플래그입니다. |
--dir directory
|
리소스를 검색할 디렉터리를 지정합니다. 이 플래그를 사용하면 명령어 하나로 여러 리소스 파일을 컴파일할 수 있지만 증분 컴파일의 이점은 활용할 수 없습니다. 따라서 대규모 프로젝트에는 이 플래그를 사용하면 안 됩니다. |
--pseudo-localize
|
en-XA 및 en-XB 와 같은 기본 문자열의 pseudolocalized 버전을 생성합니다.
|
--no-crunch
|
PNG 처리를 사용 중지합니다.
PNG 파일을 이미 처리했거나 파일 크기 축소가 필요 없는 디버그 빌드를 만드는 경우 이 옵션을 사용합니다. 그러면 실행 속도는 빨라지지만 출력 파일 크기가 커집니다. |
--legacy
|
이전 버전의 AAPT를 사용할 때 허용되는 오류를 경고로 처리합니다.
이 플래그는 예기치 않은 컴파일 시간 오류에 사용해야 합니다. AAPT2를 사용하는 동안 발생할 수 있는 알려진 동작 변경사항을 확인하려면 AAPT2 사용 시 동작 변경사항을 참고하세요. |
-zip file
|
file은 res 디렉터리가 포함된 ZIP 파일로, 리소스를 검색합니다.
|
-output-text-symbols file
|
지정된 |
-preserve-visibility-of-styleables
|
지정되면 다른 모든 리소스에 사용되는 스타일 지정 가능 항목에 동일한 공개 상태 규칙을 적용합니다. 그 외 경우에는 모든 스타일 지정 가능 항목이 공개로 설정됩니다. |
-visibility [public|private|default|]
|
컴파일된 리소스의 공개 상태를 지정된 수준으로 설정합니다. |
-trace-folder folder
|
지정된 systrace JSON 트레이스 프래그먼트를 생성합니다.
|
-source-path path
|
컴파일된 리소스 파일의 소스 파일 경로를 |
-h
|
도구 도움말을 표시합니다. |
-v
|
상세 로깅을 사용 설정합니다. |
링크
링크 단계에서 AAPT2는 컴파일 단계에서 생성되는 모든 중간 파일(예: 리소스 테이블, 바이너리 XML 파일, 처리된 PNG 파일)을 병합한 후 파일을 단일 APK로 패키징합니다. 또한 이 단계에서는 R.java
및 ProGuard 규칙 파일과 같은 다른 보조 파일도 생성될 수 있습니다. 그러나 생성된 APK는 DEX 바이트 코드를 포함하지 않으며 서명되어 있지 않습니다. 이 APK는 기기에 배포할 수 없습니다.
Android Gradle 플러그인을 사용하여 명령줄에서 앱을 빌드하지 않는 경우 d8과 같은 다른 명령줄 도구를 사용하여 자바 바이트 코드를 DEX 바이트 코드로 컴파일하고 apksigner를 사용하여 APK에 서명할 수 있습니다.
링크 문법
link
를 사용하는 일반적인 문법은 다음과 같습니다.
aapt2 link path-to-input-files [options] -o outputdirectory/outputfilename.apk --manifest AndroidManifest.xml
다음 예에서 AAPT2는 drawable_Image.flat
과 values_values.arsc.flat
이라는 중간 파일 두 개와 AndroidManifest.xml
파일을 병합합니다. AAPT2는 android
패키지에 정의된 리소스를 보유하는 android.jar
파일을 기준으로 결과를 연결합니다.
aapt2 link -o output.apk -I android_sdk/platforms/android_version/android.jar compiled/res/values_values.arsc.flat compiled/res/drawable_Image.flat --manifest /path/to/AndroidManifest.xml -v
링크 옵션
link
명령어와 함께 다음 옵션을 사용할 수 있습니다.
옵션 | 설명 |
---|---|
-o path
|
연결된 리소스 APK의 출력 경로를 지정합니다. 연결된 리소스를 포함할 수 있는 출력 APK의 경로를 지정해야 하므로 이 옵션은 필수 플래그입니다. |
--manifest file
|
빌드할 Android 매니페스트 파일의 경로를 지정합니다. 매니페스트 파일은 패키지 이름 및 애플리케이션 ID와 같은 앱 관련 필수 정보를 포함하므로 이 옵션은 필수 플래그입니다. |
-I
|
기능을 빌드하는 동안 유용할 수 있는 플랫폼의 android 네임스페이스가 있는 속성을 사용하는 경우 이 플래그는 필수입니다.
|
-A directory
|
APK에 포함할 assets 디렉터리를 지정합니다.
처리되지 않은 원본 파일을 저장하는 데 이 디렉터리를 사용할 수 있습니다. 자세한 내용은 원본 파일 액세스를 참고하세요. |
-R file
|
<add-resource> 태그를 사용하지 않고 overlay 시맨틱을 사용하여 개별 .flat 파일을 link 에 전달합니다.
기존 파일을 오버레이하는 리소스 파일을 제공하면 주어진 마지막 충돌 리소스가 사용됩니다. |
--package-id package-id
|
앱에 사용할 패키지 ID를 지정합니다.
지정한 패키지 ID는 0x7f보다 크거나 같아야 합니다. 단 |
--allow-reserved-package-id
|
예약된 패키지 ID를 사용할 수 있습니다. 예약된 패키지 ID는 일반적으로 공유 라이브러리에 할당되며 0x02~0x7e 범위(포함)에 속하는 ID입니다. 이 옵션은 |
--java directory
|
R.java 를 생성할 디렉터리를 지정합니다.
|
--proguard proguard_options
|
ProGuard 규칙의 출력 파일을 생성합니다. |
--proguard-conditional-keep-rules
|
기본 DEX에 관한 ProGuard 규칙의 출력 파일을 생성합니다. |
--no-auto-version
|
자동 스타일 및 레이아웃 SDK 버전 관리를 사용 중지합니다. |
--no-version-vectors
|
벡터 드로어블의 자동 버전 관리를 사용 중지합니다. 벡터 드로어블 라이브러리로 APK를 빌드할 경우에만 이 플래그를 사용합니다. |
--no-version-transitions
|
전환 리소스의 자동 버전 관리를 사용 중지합니다. 전환 지원 라이브러리를 사용하여 APK를 빌드할 때만 이 플래그를 사용합니다. |
--no-resource-deduping
|
호환 가능한 구성 전체에서 동일한 값을 가진 리소스의 자동 중복 제거를 사용 중지합니다. |
--enable-sparse-encoding
|
바이너리 검색 트리를 사용하여 희소 항목의 인코딩을 사용 설정합니다. 이는 APK 크기를 최적화하는 데에는 유용하지만, 리소스 검색 성능이 저하됩니다. |
-z
|
'suggested'로 표시된 문자열의 현지화가 필요합니다. |
-c config
|
쉼표로 구분된 구성 목록을 제공합니다.
예를 들어, 여러 언어의 번역이 포함되어 있는 지원 라이브러리의 종속 항목이 있는 경우 영어 또는 스페인어와 같은 특정 언어 구성에 대해서만 리소스를 필터링할 수 있습니다. 두 글자로 된 ISO 639-1 언어 코드 및 원하는 경우 두 글자로 된 ISO 3166-1-alpha-2 지역 코드(앞에 소문자 'r' 표시, 예: en-rUS)로 언어 구성을 정의해야 합니다. |
--preferred-density density
|
AAPT2가 가장 근접한 일치 밀도를 선택하고 다른 모든 밀도를 제거하도록 허용합니다.
ldpi, hdpi 및 xhdpi와 같이 앱에서 사용할 수 있는 몇 가지 픽셀 밀도 한정자가 있습니다. 원하는 밀도를 지정하면 AAPT2는 리소스 테이블에서 가장 근접한 일치 밀도를 선택하여 저장하고 다른 밀도는 모두 삭제합니다. |
--output-to-dir
|
-o 로 지정된 디렉터리에 APK 콘텐츠를 출력합니다.
이 플래그 사용 시 오류가 발생하면 Android SDK 빌드 도구 28.0.0 이상으로 업그레이드하여 문제를 해결할 수 있습니다. |
--min-sdk-version min-sdk-version
|
AndroidManifest.xml 에 사용할 기본 최소 SDK 버전을 설정합니다. |
--target-sdk-version target-sdk-version
|
AndroidManifest.xml 에 사용할 기본 타겟 SDK 버전을 설정합니다. |
--version-code version-code
|
존재하지 않는 경우 AndroidManifest.xml 에 삽입할 버전 코드를 지정합니다.
|
--version-name version-name
|
존재하지 않는 경우 AndroidManifest.xml 에 삽입할 버전 이름을 지정합니다. |
--revision-code revision-code
|
존재하지 않는 경우 AndroidManifest.xml 파일에 삽입할 버전 코드를 지정합니다.
|
--replace-version
|
--version-code , --version-name 또는 --revision-code 가 지정되면 이러한 값은 이미 매니페스트에 있는 모든 값을 대체합니다. 기본적으로 매니페스트에서 이러한 속성을 이미 정의한 경우에는 아무것도 변경되지 않습니다.
|
--compile-sdk-version-nacodeme compile-sdk-version-name
|
존재하지 않는 경우 AndroidManifest.xml 파일에 삽입할 버전 코드를 지정합니다.
|
--compile-sdk-version-name compile-sdk-version-name
|
존재하지 않는 경우 AndroidManifest.xml 파일에 삽입할 버전 이름을 지정합니다. |
--proto-format
|
컴파일된 리소스를 Protobuf 형식으로 생성합니다. Android App Bundle 생성용
|
--non-final-ids
|
최종이 아닌 리소스 ID로 R.java 를 생성합니다. kotlinc 또는 javac 컴파일 중에 앱 코드의 ID 참조가 인라인 처리되지 않습니다.
|
--emit-ids path
|
리소스 유형 이름과 각 ID 매핑의 목록을 사용하여 지정된 경로에서 파일을 생성합니다. --stable-ids 와 함께 사용하기에 적합합니다.
|
--stable-ids outputfilename.ext
|
리소스 유형 이름과 각 이름에 할당된 ID의 목록이 포함된 --emit-ids 로 생성된 파일을 사용합니다.
이 옵션을 사용하면 연결하는 동안 새 리소스를 삭제하거나 추가할 때도 할당된 ID가 안정적으로 유지됩니다. |
--custom-package package_name
|
R.java 를 생성할 맞춤 자바 패키지를 지정합니다.
|
--extra-packages package_name
|
동일한 R.java 파일을 생성하지만 패키지 이름은 다릅니다. |
--add-javadoc-annotation annotation
|
생성된 모든 자바 클래스에 JavaDoc 주석을 추가합니다. |
--output-text-symbols path
|
지정된 파일에서 R 클래스의 리소스 기호를 포함하는 텍스트 파일을 생성합니다.
출력 파일의 경로를 지정해야 합니다. |
--auto-add-overlay
|
<add-resource> 태그를 사용하지 않고 오버레이에서 새 리소스를 추가할 수 있습니다. |
--rename-manifest-package manifest-package
|
AndroidManifest.xml 파일에서 패키지 이름을 바꿉니다.
|
--rename-instrumentation-target-package instrumentation-
target-package
|
instrumentation 을 위한 타겟 패키지의 이름을 변경합니다.
이 옵션은 |
-0 extension
|
압축하지 않을 파일의 확장자를 지정합니다. |
--split path:config[,config[..]]
|
구성 집합을 기반으로 리소스를 분할하여 다른 버전의 APK를 생성합니다.
구성 집합과 함께 출력 APK의 경로를 지정해야 합니다. |
--proguard-main-dex file
|
기본 DEX에 관해 생성된 ProGuard 규칙의 출력 파일입니다. |
--proguard-minimal-keep-rules
|
최소 ProGuard keep 규칙 집합을 생성합니다. |
--no-resource-removal
|
기본값 없이 리소스 자동 삭제를 사용 중지합니다. 이 옵션은 런타임 리소스 오버레이 패키지를 빌드할 때만 사용하세요. |
-x
|
패키지 식별자 0x01의 사용을 지정하는 기존 플래그입니다. |
--product products-list
|
유지할 제품 이름의 쉼표로 구분된 목록을 지정합니다. |
--no-xml-namespaces
|
AndroidManifest.xml 파일 및 res/* 의 XML 바이너리에서 XML 네임스페이스 접두사 및 URI 정보를 삭제합니다.
|
--shared-lib
|
공유된 Android 런타임 라이브러리를 생성합니다. |
--static-lib
|
정적 Android 라이브러리를 생성합니다. |
--no-static-lib-packages
|
앱의 패키지 아래에 있는 모든 라이브러리 리소스를 병합합니다. |
--no-proguard-location-reference
|
ProGuard 규칙 파일에 소스 파일에 대한 참조가 포함되지 않도록 합니다. |
--private-symbols package-name
|
package-name은 비공개 기호에 관해 R.java 를 생성할 때 사용할 패키지 이름을 지정합니다. 지정하지 않으면 공개 및 비공개 기호가 앱의 패키지 이름을 사용합니다.
|
--override-styles-instead-of-overlaying
|
-R 리소스에 정의된 스타일이 이전 정의를 병합하는 대신 대체하게 합니다.
|
--rename-resources-package package-name
|
리소스 테이블의 패키지 이름을 package-name으로 바꿉니다. |
--no-compress
|
리소스를 압축하지 않습니다. |
--keep-raw-values
|
XML 파일에 원시 속성 값을 보존합니다. |
--no-compress-regex regular-expression
|
regular-expression과 일치하는 확장 프로그램을 압축하지 않습니다.
줄 끝에 $ 기호를 사용합니다. 대소문자를 구분하는 ECMAScript 정규 표현식 문법을 사용합니다.
|
--warn-manifest-validation
|
매니페스트 유효성 검사 오류를 경고로 처리합니다. |
--exclude-configs qualifier[,qualifier[..]]
|
지정된 한정자가 구성에 포함된 리소스의 값이 제외됩니다. |
--debug-mode
|
매니페스트의 애플리케이션 노드에 android:debuggable="true" 를 삽입하여 프로덕션 기기에서도 애플리케이션을 디버그할 수 있도록 합니다.
|
--strict-visibility
|
공개 상태 수준이 다른 오버레이는 허용되지 않습니다. |
--exclude-sources
|
리소스를 Protobuf 형식으로 생성할 때 소스 파일 정보를 직렬화하지 않습니다. |
--trace-folder folder
|
지정된 folder에 대한 systrace JSON 트레이스 프래그먼트를 생성합니다.
|
--merge-only
|
리소스 참조를 확인하지 않고 리소스만 병합합니다. 이 플래그는 --static-lib 플래그와 함께만 사용해야 합니다.
|
-h
|
도움말 메뉴를 표시합니다. |
-v
|
출력을 훨씬 자세히 표시할 수 있습니다. |
덤프
dump
는 link
명령어를 사용하여 생성한 APK 관련 정보를 출력하는 데 사용됩니다.
덤프 문법
dump
를 사용하는 일반적인 문법은 다음과 같습니다.
aapt2 dump sub-command filename.apk [options]
다음 예는 지정된 APK의 리소스 테이블에서 콘텐츠를 출력합니다.
aapt2 dump resources output.apk
덤프 하위 명령어
dump
명령어를 사용하여 다음 하위 명령어 중 하나를 지정합니다.
하위 명령어 | 설명 |
---|---|
apc
|
컴파일 중에 생성된 AAPT2 컨테이너(APC)의 콘텐츠를 출력합니다. |
badging
|
APK의 매니페스트에서 추출한 정보를 출력합니다. |
configurations
|
APK의 리소스에서 사용하는 모든 구성을 출력합니다. |
overlayable
|
APK의 오버레이 가능한 리소스를 출력합니다. |
packagename
|
APK의 패키지 이름을 출력합니다. |
permissions
|
APK의 매니페스트에서 추출한 권한을 출력합니다. |
strings
|
APK의 리소스 테이블 문자열 풀에 있는 콘텐츠를 출력합니다. |
styleparents
|
APK에 사용된 스타일의 상위 요소를 출력합니다. |
resources
|
APK 리소스 테이블의 콘텐츠를 출력합니다. |
xmlstrings
|
APK의 컴파일된 XML에서 문자열을 출력합니다. |
xmltree
|
APK의 컴파일된 XML 트리를 출력합니다. |
덤프 옵션
dump
와 함께 다음 옵션을 사용하세요.
옵션 | 설명 |
---|---|
--no-values
|
리소스를 표시할 때 값의 출력을 억제합니다. |
--file file
|
파일을 APK에서 덤프할 인수로 지정합니다. |
-v
|
결과가 더욱 상세하게 출력됩니다. |
diff
diff
를 사용하여 두 APK를 비교하고 차이점을 식별합니다.
diff 문법
diff
를 사용하는 일반적인 문법은 다음과 같습니다.
aapt2 diff first.apk second.apk
diff
명령어에는 옵션이 없습니다.
최적화
optimize
는 APK에 패키징하기 전에 병합된 리소스와 resources.arsc
에서 최적화를 실행하는 데 사용됩니다. 이 최적화는 사용 중인 리소스의 크기와 수에 따라 APK 크기를 약 1~3% 줄일 수 있습니다.
최적화 문법
optimize
를 사용하는 일반적인 문법은 다음과 같습니다.
aapt2 optimize options file[,file[..]]
다음 예에서는 input.apk
의 리소스를 최적화하고 output.apk
에 최적화된 새 APK를 만듭니다. 일반 플랫 테이블 표현을 더 작은 바이너리 검색 트리로 대체하므로 검색 성능을 희생하는 대신 APK가 더 작아집니다.
aapt2 optimize -o output.apk --enable-sparse-encoding input.apk
최적화 옵션
optimize
와 함께 다음 옵션을 사용할 수 있습니다.
옵션 | 설명 |
---|---|
-o path
|
연결된 리소스 APK의 출력 경로를 지정합니다.
연결된 리소스를 포함할 수 있는 출력 APK의 경로를 지정해야 하므로 이 옵션은 필수 플래그입니다. |
-d directory
|
분할을 위한 출력 디렉터리 경로를 지정합니다. |
-x path
|
XML 구성 파일의 경로를 지정합니다. |
-p
|
다중 APK 아티팩트를 출력하고 종료합니다. |
--target-densities density[,density[..]]
|
APK가 최적화되는 화면 밀도에 관한 쉼표로 구분된 목록을 지정합니다. 주어진 밀도의 기기에서 사용되지 않는 모든 리소스는 APK에서 삭제됩니다. |
--resources-config-path path
|
리소스 목록과 각 리소스의 지시어가 포함된 형식: type/resource_name#[directive][,directive] |
-c config[,config[..]]
|
포함할 쉼표로 구분된 구성 목록을 지정합니다. 기본값은 모든 구성입니다. |
--split path:config[,config[..]]
|
구성 집합을 기반으로 리소스를 분할하여 다른 버전의 APK를 생성합니다.
구성 집합과 함께 출력 APK의 경로를 지정해야 합니다. |
--keep-artifacts artifact[,artifact[..]]
|
유지할 쉼표로 구분된 아티팩트 목록을 지정합니다. 아무것도 지정하지 않으면 모든 아티팩트가 유지됩니다. |
--enable-sparse-encoding
|
바이너리 검색 트리를 사용하여 희소 항목의 인코딩을 사용 설정합니다. 이 옵션은 APK 크기를 최적화하는 데에는 유용하지만, 리소스 검색 성능이 저하됩니다. |
--collapse-resource-names
|
리소스 이름을 키 문자열 풀의 단일 값으로 축소합니다.
리소스는 --resources-config-path 로 지정된 파일에서 no_collapse 지시어를 사용하여 제외됩니다.
|
--shorten-resource-paths
|
APK 내부의 리소스 경로를 단축합니다. |
--resource-path-shortening-map path
|
이전 리소스 경로의 맵을 단축된 경로로 출력할 경로를 지정합니다. |
-v
|
결과가 더욱 상세하게 출력됩니다. |
-h
|
도구 도움말을 표시합니다. |
변환
기본적으로 AAPT compile
명령어는 리소스를 APK에 적합한 바이너리 형식으로 컴파일합니다. --proto-format
을 지정하여 AAB에 적합한 protobuf 형식을 지정할 수도 있습니다. convert
명령어는 두 형식 간에 APK를 변환합니다.
변환 문법
convert
의 일반적인 문법은 다음과 같습니다.
aapt2 convert -o output-file options file[,file[..]]
다음 예에서는 input.apk
의 리소스를 변환하고 output.apk
에 protobuf 형식 리소스가 포함된 새로운 APK를 만듭니다. 일반 플랫 테이블 표현을 더 작은 바이너리 검색 트리로 대체하므로 검색 성능은 저하되지만 APK가 더 작아집니다.
aapt2 convert -o output.apk --output-format proto --enable-sparse-encoding input.apk
변환 옵션
convert
와 함께 다음 옵션을 사용하세요.
옵션 | 설명 |
---|---|
-o path
|
연결된 리소스 APK의 출력 경로를 지정합니다. 연결된 리소스를 포함할 수 있는 출력 APK의 경로를 지정해야 하므로 이 옵션은 필수 플래그입니다. |
--output-format [proto|binary]
|
출력 형식입니다. 허용되는 값은 proto , binary 입니다. 값을 설정하지 않으면 기본값은 binary 입니다.
|
--enable-sparse-encoding
|
바이너리 검색 트리를 사용하여 희소 항목의 인코딩을 사용 설정합니다. 이 옵션은 APK 크기를 최적화하는 데에는 유용하지만, 리소스 검색 성능이 저하됩니다. |
--keep-raw-values
|
XML 파일에 원시 속성 값을 보존합니다. |
-v
|
결과가 더욱 상세하게 출력됩니다. |
-h
|
도구 도움말을 표시합니다. |
데몬 모드
AAPT 버전 2.19에서는 명령어 실행을 위한 데몬 모드를 도입했습니다. 데몬 모드를 사용하면 단일 AAPT 세션에서 여러 명령어를 입력할 수 있습니다.
데몬 문법
다음 명령어를 사용하여 데몬 모드를 시작하세요.
aapt2 daemon
데몬 모드가 실행되면 명령어를 입력할 수 있습니다. 명령어의 각 인수는 별도의 줄에 있어야 하며, 명령어 끝에는 빈 줄이 있어야 합니다. Control+D를 입력하여 데몬 모드를 종료합니다.
다음과 같은 개별 compile
명령어를 살펴보세요.
aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/ aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/
이러한 명령어를 데몬 모드에서는 다음과 같이 입력할 수 있습니다.
aapt2 daemon Ready compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/ Done compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/ Done ^D Exiting daemon
데몬 모드 옵션
데몬 모드의 단일 옵션은 --trace-folder folder
로, 지정된 folder에 대한 systrace
JSON 트레이스 프래그먼트를 생성합니다.
버전
사용 중인 AAPT2 버전을 version
명령어를 통해 확인합니다.
aapt2 version Android Asset Packaging Tool (aapt) 2.19-8678579
AAPT2 사용 시 동작 변경사항
AAPT2 이전에는 AAPT가 Android Asset Packaging Tool의 기본 버전이었으며 지금은 지원 중단되었습니다. AAPT2를 이전 프로젝트에서 즉시 사용할 수 있지만 이 섹션에서는 반드시 알아야 할 몇 가지 동작 변경사항을 설명합니다.
Android 매니페스트의 요소 계층 구조
이전 버전의 AAPT에서는 AndroidManifest.xml
파일의 잘못된 노드에 요소가 중첩되어 있으면 이를 무시하거나 경고를 보냈습니다.
다음 예를 살펴보세요.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myname.myapplication"> <application ... <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <action android:name="android.intent.action.CUSTOM" /> </activity> </application> </manifest>
이전 버전의 AAPT에서는 위치가 잘못된 <action>
태그를 간단히 무시했습니다.
AAPT2에서는 다음과 같은 오류가 발생합니다.
AndroidManifest.xml:15: error: unknown element <action> found.
문제를 해결하려면 매니페스트 요소를 올바르게 중첩해야 합니다. 자세한 내용은 앱 매니페스트 개요를 참고하세요.
리소스 선언
더 이상 name
속성에서 리소스 유형을 표시할 수 없습니다.
다음 예에서는 attr
리소스 항목을 잘못 선언합니다.
<style name="childStyle" parent="parentStyle"> <item name="attr/my_attr">@color/pink</item> </style>
이렇게 리소스 유형을 선언하면 다음과 같은 빌드 오류가 발생합니다.
Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)' not found.
이 오류를 해결하려면 type="attr"
을 사용하여 유형을 명시적으로 선언합니다.
<style name="childStyle" parent="parentStyle"> <item type="attr" name="my_attr">@color/pink</item> </style>
또한 <style>
요소를 선언할 때 그 상위 요소도 스타일 리소스 유형이어야 합니다. 그렇지 않으면 다음과 비슷한 오류가 발생합니다.
Error: (...) invalid resource type 'attr' for parent of style
리소스 참조 기호 @의 잘못된 사용
AAPT2에서는 리소스 참조 기호(@
)를 생략하거나 잘못된 위치에 배치하면 빌드 오류가 발생합니다. 예를 들어 다음은 스타일 속성을 지정할 때 기호를 생략하는 경우입니다.
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> ... <!-- Note the missing '@' symbol when specifying the resource type. --> <item name="colorPrimary">color/colorPrimary</item> </style>
AAPT2에서는 모듈을 빌드할 때 다음과 같은 빌드 오류가 발생합니다.
ERROR: expected color but got (raw string) color/colorPrimary
또한 다음은 android
네임스페이스에서 리소스에 액세스할 때 기호를 잘못 포함하는 경우입니다.
... <!-- When referencing resources from the 'android' namespace, omit the '@' symbol. --> <item name="@android:windowEnterAnimation"/>
AAPT2에서는 모듈을 빌드할 때 다음과 같은 빌드 오류가 발생합니다.
Error: style attribute '@android:attr/windowEnterAnimation' not found
라이브러리의 잘못된 구성
앱에 Android SDK 빌드 도구의 이전 버전을 사용하여 빌드된 서드 파티 라이브러리의 종속 항목이 있는 경우, 런타임 시 오류나 경고를 표시하지 않고 앱이 비정상 종료될 수 있습니다. 이러한 비정상 종료는 라이브러리를 만드는 동안 R.java
필드가 final
로 선언되어 발생할 수도 있습니다. 따라서 모든 리소스 ID가 라이브러리의 클래스에서 인라인 처리됩니다.
AAPT2는 앱을 빌드할 때 ID를 라이브러리 리소스에 다시 할당할 수 있는 기능에 의존합니다. 라이브러리가 ID를 final
로 가정하고 라이브러리 DEX에서 인라인 처리하면 런타임 불일치가 발생합니다.
이 오류를 해결하려면 라이브러리 작성자에게 문의하여 최신 버전의 Android SDK 빌드 도구를 사용하는 라이브러리를 다시 빌드하여 라이브러리를 다시 게시합니다.