AAPT2 (Công cụ đóng gói tài nguyên Android) là một công cụ bản dựng mà Android Studio và Trình bổ trợ Android cho Gradle sử dụng để biên dịch và đóng gói các tài nguyên của ứng dụng. AAPT2 phân tích cú pháp, lập chỉ mục và biên dịch các tài nguyên thành định dạng nhị phân được tối ưu hoá cho nền tảng Android.
Trình bổ trợ Android cho Gradle 3.0.0 trở lên sẽ bật AAPT2 theo mặc định. Thường thì bạn không cần phải tự gọi aapt2
. Tuy nhiên, nếu bạn muốn sử dụng thiết bị đầu cuối và hệ thống xây dựng của riêng mình qua Android Studio, bạn có thể sử dụng AAPT2 từ dòng lệnh. Bạn cũng có thể gỡ lỗi bản dựng có liên quan đến AAPT2 từ dòng lệnh. Để thực hiện việc này, bạn có thể tìm AAPT2 dưới dạng công cụ độc lập trong Bộ công cụ bản dựng SDK Android phiên bản 26.0.2 trở lên.
Để tải xuống Bộ công cụ bản dựng SDK Android từ dòng lệnh, hãy sử dụng sdkmanager
và chạy lệnh sau:
sdkmanager "build-tools;build-tools-version"
Sau khi đã tải Bộ công cụ bản dựng SDK xuống, hãy tìm AAPT2 trong android_sdk/build-tools/version/
.
Vì các bản sửa đổi của Bộ công cụ bản dựng SDK Android không được phát hành thường xuyên, nên phiên bản AAPT2 đi kèm trong Bộ công cụ bản dựng SDK của bạn có thể không phải là phiên bản mới nhất. Để tải phiên bản AAPT2 mới nhất, hãy đọc bài viết Tải AAPT2 xuống từ Kho lưu trữ Maven của Google.
Để sử dụng AAPT2 từ dòng lệnh trên Linux hoặc Mac, hãy chạy lệnh aapt2
.
Trên Windows, hãy chạy lệnh aapt2.exe
.
AAPT2 có tính năng biên dịch gia tăng giúp hỗ trợ biên dịch tài nguyên nhanh hơn. Để hoàn thành việc biên dịch gia tăng, quá trình xử lý tài nguyên sẽ được tách thành hai bước:
- Biên dịch: biên dịch các tệp tài nguyên thành định dạng nhị phân.
- Liên kết: hợp nhất tất cả tệp đã biên dịch và đóng gói thành một gói duy nhất.
Cách phân chia này giúp cải thiện hiệu suất cho các bản dựng gia tăng. Ví dụ: nếu có thay đổi trong một tệp, bạn chỉ cần biên dịch lại tệp đó.
Tải AAPT2 xuống từ Google Maven
Để tải phiên bản AAPT2 mới nhất chưa được đóng gói trong bộ công cụ xây dựng, bạn có thể tải AAPT2 xuống từ Kho lưu trữ Maven của Google như sau:
- Trong phần chỉ mục kho lưu trữ, hãy chuyển đến com.android.tools.build > aapt2.
- Sao chép tên của phiên bản AAPT2 mới nhất.
Chèn tên phiên bản bạn vừa sao chép vào URL sau và chỉ định hệ điều hành đích: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar
Ví dụ: để tải phiên bản 3.2.0-alpha18-4804415 cho Windows, bạn hãy sử dụng: 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
Di chuyển đến URL trong trình duyệt—AAPT2 sẽ bắt đầu tải xuống trong chốc lát.
Mở gói tệp JAR bạn vừa tải xuống.
Tệp JAR phải chứa tệp thực thi
aapt2
và một số thư viện mà tệp thực thi phụ thuộc.
Biên dịch
AAPT2 hỗ trợ việc biên dịch tất cả các loại tài nguyên Android, chẳng hạn như các tệp XML và đối tượng có thể vẽ. Khi bạn gọi AAPT2 để biên dịch, hãy chuyển một tệp tài nguyên dưới dạng dữ liệu đầu vào cho mỗi lệnh gọi. Sau đó, AAPT2 sẽ phân tích cú pháp tệp và tạo tệp nhị phân trung gian có phần mở rộng .flat
.
Khi chuyển toàn bộ thư mục, AAPT2 sẽ biên dịch lại tất cả tệp trong thư mục ngay cả khi chỉ có một tài nguyên thay đổi. Mặc dù bạn có thể chuyển các thư mục tài nguyên chứa nhiều tệp tài nguyên cho AAPT2 bằng cách sử dụng cờ --dir
, nhưng làm như vậy sẽ không tận dụng được lợi ích của việc biên dịch tài nguyên gia tăng theo cách này.
Các loại tệp đầu ra có thể khác nhau tuỳ theo dữ liệu đầu vào mà bạn cung cấp để biên dịch, như trình bày trong bảng sau:
Đầu vào | Đầu ra |
---|---|
Các tệp tài nguyên XML, chẳng hạn như Chuỗi và Kiểu, nằm trong thư mục res/values/
|
Bảng tài nguyên với phần mở rộng *.arsc.flat .
|
Tất cả tệp tài nguyên khác. |
Tất cả tệp không phải là các tệp trong thư mục
Ngoài ra, tất cả tệp PNG đều được giảm kích thước theo mặc định và sử dụng phần mở rộng |
Các tệp đầu ra AAPT2 là tệp không thể thực thi, sau đó bạn phải đưa các tệp nhị phân này vào làm đầu vào trong giai đoạn liên kết để tạo tệp APK. Tuy nhiên, tệp APK được tạo không phải là tệp thực thi mà bạn có thể triển khai trên thiết bị Android ngay lập tức, vì tệp này không chứa các tệp DEX (mã byte biên dịch) và chưa được ký.
Cú pháp biên dịch
Cú pháp chung để sử dụng compile
như sau:
aapt2 compile path-to-input-files [options] -o output-directory/
Trong ví dụ sau, AAPT2 biên dịch riêng lẻ các tệp tài nguyên có tên values.xml
và 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/
Như trình bày trong bảng 1, tên của tệp đầu ra phụ thuộc vào tên tệp đầu vào và tên của thư mục mẹ.
Trong ví dụ trước, trong đó tệp strings.xml
làm dữ liệu đầu vào, aapt2
sẽ tự động đặt tên tệp đầu ra là values-en_strings.arsc.flat
. Tuy nhiên, tệp đối tượng có thể vẽ đã biên dịch lưu trữ trong thư mục đối tượng có thể vẽ có tên là drawable_img.png.flat
.
Tuỳ chọn biên dịch
Có một số tuỳ chọn mà bạn có thể sử dụng cùng với lệnh compile
, như được cho thấy trong bảng 2:
Tuỳ chọn | Mô tả |
---|---|
-o path
|
Chỉ định đường dẫn đầu ra cho tài nguyên đã biên dịch. Cờ này là bắt buộc vì bạn phải chỉ định đường dẫn đến một thư mục mà AAPT2 có thể xuất và lưu trữ các tài nguyên đã biên dịch. |
--dir directory
|
Chỉ định thư mục để quét tài nguyên. Mặc dù bạn có thể sử dụng cờ này để biên dịch nhiều tệp tài nguyên bằng một lệnh, nhưng phương thức này sẽ vô hiệu hoá lợi ích của quá trình biên dịch gia tăng. Do đó, bạn không nên dùng cờ này đối với các dự án lớn. |
--pseudo-localize
|
Tạo phiên bản giả lập của các chuỗi mặc định (ví dụ: en-XA và en-XB ).
|
--no-crunch
|
Tắt tính năng xử lý PNG.
Hãy sử dụng tuỳ chọn này nếu bạn đã xử lý tệp PNG hoặc đang tạo bản gỡ lỗi không yêu cầu giảm kích thước tệp. Nếu bật tuỳ chọn này thì quá trình thực thi sẽ diễn ra nhanh hơn, nhưng sẽ tăng kích thước tệp đầu ra. |
--legacy
|
Các lỗi được cho phép trong các phiên bản AAPT trước đó hiện được xử lý thành cảnh báo.
Bạn nên sử dụng cờ này cho các lỗi biên dịch không mong muốn. Để giải quyết các thay đổi về hành vi đã biết có thể xảy ra khi sử dụng AAPT2, hãy đọc bài viết Các thay đổi về hành vi khi sử dụng AAPT2. |
-zip file
|
file là một tệp ZIP chứa thư mục res để quét tài nguyên.
|
-output-text-symbols file
|
Tạo một tệp văn bản chứa các ký hiệu tài nguyên của lớp R trong |
-preserve-visibility-of-styleables
|
Nếu được chỉ định, hãy áp dụng cùng một quy tắc hiển thị cho các thành phần có thể định kiểu (styleable) được dùng cho mọi tài nguyên khác. Nếu không, tất cả thành phần có thể định kiểu sẽ được thiết lập là công khai. |
-visibility [public|private|default|]
|
Thiết lập chế độ hiển thị của các tài nguyên đã biên dịch thành cấp được chỉ định. |
-trace-folder folder
|
Tạo một mảnh dấu vết JSON systrace cho |
-source-path path
|
Thiết lập đường dẫn tệp nguồn của tệp tài nguyên được biên dịch thành |
-h
|
Hiện các công cụ trợ giúp. |
-v
|
Bật tính năng ghi nhật ký chi tiết. |
Liên kết
Trong giai đoạn liên kết, AAPT2 hợp nhất tất cả tệp trung gian mà giai đoạn biên dịch tạo ra, chẳng hạn như bảng tài nguyên, tệp XML nhị phân và tệp PNG đã xử lý, sau đó đóng gói các tệp này thành một tệp APK duy nhất. Ngoài ra, các tệp phụ khác, chẳng hạn như tệp quy tắc R.java
và ProGuard có thể được tạo trong giai đoạn này. Tuy nhiên, tệp APK đã tạo không chứa mã byte DEX và chưa được ký. Bạn không thể triển khai tệp APK này cho một thiết bị.
Nếu không dùng Trình bổ trợ Android cho Gradle để tạo bản dựng ứng dụng từ dòng lệnh, bạn có thể dùng các công cụ dòng lệnh khác, chẳng hạn như d8 để biên dịch mã byte Java thành mã byte DEX và apksigner để ký tệp APK của mình.
Cú pháp liên kết
Cú pháp chung để sử dụng link
như sau:
aapt2 link path-to-input-files [options] -o outputdirectory/outputfilename.apk --manifest AndroidManifest.xml
Trong ví dụ sau, AAPT2 hợp nhất hai tệp trung gian là drawable_Image.flat
và values_values.arsc.flat
với tệp AndroidManifest.xml
. AAPT2 liên kết kết quả với tệp android.jar
chứa các tài nguyên được xác định trong gói android
:
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
Tuỳ chọn liên kết
Bạn có thể dùng các tuỳ chọn sau với lệnh link
:
Tuỳ chọn | Mô tả |
---|---|
-o path
|
Chỉ định đường dẫn đầu ra cho tệp APK tài nguyên đã liên kết. Cờ này là bắt buộc vì bạn phải chỉ định đường dẫn cho tệp APK đầu ra có thể chứa các tài nguyên đã liên kết. |
--manifest file
|
Chỉ định đường dẫn tới tệp kê khai Android để tạo bản dựng. Cờ này là bắt buộc vì tệp kê khai cung cấp các thông tin quan trọng về ứng dụng của bạn như tên gói và mã ứng dụng. |
-I
|
Cung cấp đường dẫn đến android trong các tệp tài nguyên.
|
-A directory
|
Chỉ định một thư mục tài sản cần đưa vào tệp APK.
Bạn có thể sử dụng thư mục này để lưu trữ các tệp gốc chưa xử lý. Hãy đọc bài viết Truy cập vào tệp nguyên gốc để tìm hiểu thêm. |
-R file
|
Chuyển một tệp .flat riêng lẻ cho link , sử dụng ngữ nghĩa overlay mà không cần sử dụng thẻ <add-resource> .
Khi bạn cung cấp một tệp tài nguyên phủ lên một tệp hiện có, tài nguyên xung đột đã cung cấp gần đây nhất sẽ được sử dụng. |
--package-id package-id
|
Chỉ định mã nhận dạng gói để sử dụng cho ứng dụng của bạn.
Mã nhận dạng gói mà bạn chỉ định phải lớn hơn hoặc bằng 0x7f, trừ khi được dùng kết hợp với |
--allow-reserved-package-id
|
Cho phép sử dụng mã nhận dạng gói đặt trước. Mã nhận dạng gói đặt trước là các mã nhận dạng thường được chỉ định cho các thư viện chia sẻ và nằm trong phạm vi từ 0x02 đến 0x7e. Bằng cách sử dụng Bạn chỉ nên sử dụng tuỳ chọn này cho các gói có phiên bản |
--java directory
|
Chỉ định thư mục để tạo R.java trong đó.
|
--proguard proguard_options
|
Tạo tệp đầu ra cho các quy tắc ProGuard. |
--proguard-conditional-keep-rules
|
Tạo tệp đầu ra cho các quy tắc ProGuard cho DEX chính. |
--no-auto-version
|
Tắt tính năng tự động tạo phiên bản kiểu và bố cục SDK. |
--no-version-vectors
|
Tắt tính năng tự động tạo phiên bản cho các vectơ vẽ được. Chỉ sử dụng cờ này khi xây dựng tệp APK của bạn bằng Thư viện vectơ vẽ được. |
--no-version-transitions
|
Tắt tính năng tự động tạo phiên bản tài nguyên chuyển đổi. Chỉ dùng cờ này khi xây dựng tệp APK bằng thư viện Hỗ trợ chuyển đổi. |
--no-resource-deduping
|
Tắt tính năng tự động loại bỏ các tài nguyên có giá trị giống nhau trên các cấu hình tương thích. |
--enable-sparse-encoding
|
Bật mã hoá các mục nhập thưa thớt bằng cách sử dụng cây tìm kiếm nhị phân. Tính năng này hữu ích cho việc tối ưu hóa kích thước tệp APK, nhưng sẽ làm giảm hiệu suất truy xuất tài nguyên. |
-z
|
Yêu cầu bản địa hoá các chuỗi được đánh dấu "đề xuất". |
-c config
|
Cung cấp danh sách cấu hình được phân tách bằng dấu phẩy.
Ví dụ: nếu có các phần phụ thuộc trên thư viện hỗ trợ (chứa bản dịch cho nhiều ngôn ngữ), bạn có thể lọc các tài nguyên chỉ dành cho cấu hình ngôn ngữ cụ thể, chẳng hạn như tiếng Anh hoặc tiếng Tây Ban Nha. Bạn phải xác định cấu hình ngôn ngữ bằng mã ngôn ngữ gồm hai chữ cái theo ISO 639-1, theo sau là mã vùng gồm hai chữ cái theo ISO 3166-1-alpha-2 sau chữ 'r' viết thường (ví dụ: en-rUS). |
--preferred-density density
|
Cho phép AAPT2 chọn mật độ phù hợpp nhất và loại bỏ tất cả mật độ khác.
Bạn có thể sử dụng một số bộ định tính mật độ pixel trong ứng dụng của bạn, chẳng hạn như ldpi, hdpi và xhdpi. Khi bạn chỉ định mật độ ưu tiên, AAPT2 sẽ chọn và lưu trữ mật độ phù hợp nhất trong bảng tài nguyên, đồng thời xoá tất cả mật độ khác. |
--output-to-dir
|
Xuất nội dung tệp APK sang thư mục do -o chỉ định.
Nếu gặp bất cứ lỗi nào khi sử dụng cờ này, bạn có thể khắc phục bằng cách nâng cấp lên Bộ công cụ bản dựng SDK Android 28.0.0 trở lên. |
--min-sdk-version min-sdk-version
|
Thiết lập phiên bản SDK tối thiểu mặc định để sử dụng cho AndroidManifest.xml .
|
--target-sdk-version target-sdk-version
|
Thiết lập phiên bản SDK mục tiêu mặc định để sử dụng cho AndroidManifest.xml .
|
--version-code version-code
|
Chỉ định mã phiên bản để chèn vào AndroidManifest.xml (nếu chưa có).
|
--version-name version-name
|
Chỉ định tên phiên bản để đưa vào AndroidManifest.xml (nếu chưa có). |
--revision-code revision-code
|
Chỉ định mã sửa đổi để chèn vào tệp AndroidManifest.xml (nếu chưa có).
|
--replace-version
|
Nếu bạn chỉ định --version-code , --version-name hoặc --revision-code , thì các giá trị này sẽ thay thế mọi giá trị đã có trong tệp kê khai. Theo mặc định, sẽ không có gì thay đổi nếu tệp kê khai đã xác định các thuộc tính này.
|
--compile-sdk-version-nacodeme compile-sdk-version-name
|
Chỉ định mã phiên bản để đưa vào tệp AndroidManifest.xml (nếu chưa có).
|
--compile-sdk-version-name compile-sdk-version-name
|
Chỉ định tên phiên bản để đưa vào AndroidManifest.xml (nếu chưa có). |
--proto-format
|
Tạo tài nguyên đã biên dịch ở định dạng Protobuf.
Thích hợp để sử dụng làm dữ liệu đầu vào cho |
--non-final-ids
|
Tạo R.java bằng mã nhận dạng tài nguyên không phải cuối cùng. Các tham chiếu đến mã nhận dạng trong mã của ứng dụng sẽ không cùng dòng trong quá trình biên dịch kotlinc hoặc javac .
|
--emit-ids path
|
Phát hành một tệp tại đường dẫn đã cho có một danh sách tên của các loại tài nguyên và liên kết mã nhận dạng của các tài nguyên đó. Phù hợp để sử dụng với --stable-ids .
|
--stable-ids outputfilename.ext
|
Tiêu thụ tệp được tạo bằng --emit-ids chứa danh sách tên của các loại tài nguyên và mã nhận dạng được chỉ định của các tài nguyên đó.
Tuỳ chọn này cho phép các mã nhận dạng được chỉ định giữ trạng thái ổn định ngay cả khi bạn xoá hoặc thêm tài nguyên mới trong khi liên kết. |
--custom-package package_name
|
Chỉ định gói Java tuỳ chỉnh để tạo R.java trong đó.
|
--extra-packages package_name
|
Tạo cùng một tệp R.java với tên gói khác nhau.
|
--add-javadoc-annotation annotation
|
Thêm chú thích JavaDoc vào tất cả lớp Java đã tạo. |
--output-text-symbols path
|
Tạo một tệp văn bản chứa các ký hiệu tài nguyên của lớp R trong tệp được chỉ định.
Bạn phải chỉ định đường dẫn đến tệp đầu ra. |
--auto-add-overlay
|
Cho phép thêm các tài nguyên mới trong lớp phủ mà không cần dùng thẻ <add-resource> .
|
--rename-manifest-package manifest-package
|
Đổi tên gói trong tệp AndroidManifest.xml .
|
--rename-instrumentation-target-package instrumentation-
target-package
|
Đổi tên gói mục tiêu cho instrumentation .
Bạn nên sử dụng tuỳ chọn này cùng với |
-0 extension
|
Chỉ định phần mở rộng của loại tệp mà bạn không muốn nén. |
--split path:config[,config[..]]
|
Phân tách tài nguyên dựa trên một nhóm cấu hình để tạo một phiên bản tệp APK khác.
Bạn phải chỉ định đường dẫn đến tệp APK đầu ra cùng với tập hợp các cấu hình. |
--proguard-main-dex file
|
Tệp đầu ra cho các quy tắc ProGuard đã tạo cho DEX chính. |
--proguard-minimal-keep-rules
|
Tạo bộ quy tắc lưu giữ ProGuard tối thiểu. |
--no-resource-removal
|
Tắt tính năng tự động xoá tài nguyên mà không cần thiết lập mặc định. Chỉ sử dụng tuỳ chọn này khi tạo các gói lớp phủ tài nguyên thời gian chạy. |
-x
|
Cờ cũ chỉ định việc sử dụng giá trị nhận dạng gói 0x01. |
--product products-list
|
Chỉ định danh sách tên sản phẩm được phân tách bằng dấu phẩy. |
--no-xml-namespaces
|
Xoá tiền tố không gian tên XML và thông tin URI khỏi tệp AndroidManifest.xml và tệp nhị phân XML trong res/* .
|
--shared-lib
|
Tạo thư viện thời gian chạy Android dùng chung. |
--static-lib
|
Tạo thư viện Android tĩnh. |
--no-static-lib-packages
|
Hợp nhất tất cả tài nguyên thư viện trong gói của ứng dụng. |
--no-proguard-location-reference
|
Giữ cho các tệp quy tắc ProGuard không tham chiếu đến tệp nguồn. |
--private-symbols package-name
|
package-name chỉ định tên gói để sử dụng khi tạo R.java cho các ký hiệu riêng tư. Nếu không chỉ định, các ký hiệu công khai và riêng tư sẽ sử dụng tên gói của ứng dụng.
|
--override-styles-instead-of-overlaying
|
Cung cấp kiểu được xác định trong tài nguyên -R để thay thế các định nghĩa trước đó thay vì hợp nhất.
|
--rename-resources-package package-name
|
Đổi tên gói trong bảng tài nguyên thành package-name. |
--no-compress
|
Không nén tài nguyên. |
--keep-raw-values
|
Giữ lại các giá trị thuộc tính thô trong tệp XML. |
--no-compress-regex regular-expression
|
Không nén các tệp có phần mở rộng khớp với regular-expression.
Sử dụng ký hiệu $ cho ký tự cuối dòng. Sử dụng ngữ pháp biểu thức chính quy ECMAScript phân biệt chữ hoa chữ thường.
|
--warn-manifest-validation
|
Xem lỗi xác thực tệp kê khai là cảnh báo. |
--exclude-configs qualifier[,qualifier[..]]
|
Loại trừ giá trị của tài nguyên có cấu hình chứa bộ hạn định được chỉ định. |
--debug-mode
|
Chèn android:debuggable="true" vào nút ứng dụng của tệp kê khai, giúp ứng dụng có thể gỡ lỗi ngay cả trên các thiết bị được phát hành chính thức.
|
--strict-visibility
|
Không cho phép các lớp phủ có nhiều chế độ hiển thị. |
--exclude-sources
|
Không chuyển đổi tuần tự thông tin tệp nguồn khi tạo tài nguyên ở định dạng Protobuf. |
--trace-folder folder
|
Tạo mảnh theo dõi JSON systrace theo folder đã chỉ định.
|
--merge-only
|
Chỉ hợp nhất các tài nguyên mà không xác minh các tham chiếu tài nguyên. Bạn chỉ nên sử dụng cờ này cùng với cờ --static-lib .
|
-h
|
Hiện trình đơn trợ giúp. |
-v
|
Bật tinh năng tăng độ chi tiết cho tệp đầu ra. |
Dump
dump
được dùng để in thông tin về tệp APK bạn đã tạo bằng lệnh link
.
Cú pháp kết xuất
Cú pháp chung để sử dụng dump
như sau:
aapt2 dump sub-command filename.apk [options]
Ví dụ sau in nội dung từ bảng tài nguyên của tệp APK đã chỉ định:
aapt2 dump resources output.apk
Lệnh con kết xuất
Hãy chỉ định một trong các lệnh con sau đây bằng lệnh dump
:
Lệnh con | Mô tả |
---|---|
apc
|
In nội dung của Vùng chứa AAPT2 (APC) được tạo trong quá trình biên dịch. |
badging
|
In thông tin trích xuất từ tệp kê khai của tệp APK. |
configurations
|
In mọi cấu hình mà tài nguyên sử dụng trong tệp APK. |
overlayable
|
In tài nguyên có thể bao phủ của tệp APK. |
packagename
|
In tên gói của tệp APK. |
permissions
|
In các quyền được trích xuất từ tệp kê khai của tệp APK. |
strings
|
In nội dung của nhóm chuỗi bảng tài nguyên của tệp apk. |
styleparents
|
In thành phần mẹ của các kiểu được dùng trong APK. |
resources
|
In nội dung bảng tài nguyên của tệp apk. |
xmlstrings
|
In chuỗi từ XML đã biên dịch của tệp apk. |
xmltree
|
In cây XML đã biên dịch của tệp apk. |
Tuỳ chọn kết xuất
Sử dụng các tuỳ chọn sau với dump
:
Tuỳ chọn | Mô tả |
---|---|
--no-values
|
Nén tệp đầu ra các giá trị khi hiển thị tài nguyên. |
--file file
|
Chỉ định một tệp làm đối số sẽ được kết xuất từ APK. |
-v
|
Tăng độ chi tiết của tệp đầu ra. |
Diff
Sử dụng diff
để so sánh hai tệp APK và xác định mọi điểm khác biệt.
Cú pháp diff
Cú pháp chung để sử dụng diff
như sau:
aapt2 diff first.apk second.apk
Không có tuỳ chọn cho lệnh diff
.
Tối ưu hoá
optimize
được dùng để chạy các hoạt động tối ưu hoá trên tài nguyên hợp nhất và resources.arsc
trước khi được đóng gói vào tệp APK. Tính năng tối ưu hoá này có thể giảm kích thước tệp APK khoảng 1-3%, tuỳ thuộc vào kích thước và số lượng tài nguyên đang sử dụng.
Cú pháp tối ưu hoá
Cú pháp chung để sử dụng optimize
như sau:
aapt2 optimize options file[,file[..]]
Ví dụ sau đây tối ưu hoá tài nguyên trong input.apk
và tạo một tệp APK mới được tối ưu hoá trong output.apk
. Tệp APK này dùng một cây tìm kiếm nhị phân nhỏ gọn hơn thay cho cách trình bày bảng phẳng thông thường, nhờ đó giảm kích thước tệp APK cùng với chi phí hiệu suất truy xuất:
aapt2 optimize -o output.apk --enable-sparse-encoding input.apk
Tùy chọn tối ưu hoá
Bạn có thể sử dụng các tuỳ chọn sau với optimize
:
Tuỳ chọn | Mô tả |
---|---|
-o path
|
Chỉ định đường dẫn đầu ra cho tệp APK tài nguyên đã liên kết.
Cờ này là bắt buộc vì bạn phải chỉ định đường dẫn cho tệp APK đầu ra có thể chứa các tài nguyên đã liên kết. |
-d directory
|
Chỉ định đường dẫn đến thư mục đầu ra dành cho các phần phân tách. |
-x path
|
Chỉ định đường dẫn đến tệp cấu hình XML. |
-p
|
In các cấu phần phần mềm nhiều APK và thoát. |
--target-densities density[,density[..]]
|
Chỉ định danh sách mật độ màn hình được phân tách bằng dấu phẩy mà tệp APK được tối ưu hoá. Tất cả tài nguyên không dùng đến trên các thiết bị có mật độ cụ thể sẽ bị xoá khỏi tệp APK. |
--resources-config-path path
|
Chỉ định đường dẫn đến tệp Định dạng type/resource_name#[directive][,directive] |
-c config[,config[..]]
|
Chỉ định danh sách cấu hình được phân tách bằng dấu phẩy mà bạn muốn đưa vào. Tuỳ chọn mặc định là tất cả cấu hình. |
--split path:config[,config[..]]
|
Phân tách tài nguyên dựa trên một nhóm cấu hình để tạo một phiên bản tệp APK khác.
Bạn phải chỉ định đường dẫn đến tệp APK đầu ra cùng với tập hợp các cấu hình. |
--keep-artifacts artifact[,artifact[..]]
|
Chỉ định một danh sách cấu phần phần mềm được phân tách bằng dấu phẩy mà bạn muốn giữ lại. Nếu bạn không chỉ định thì tất cả cấu phần phần mềm sẽ được giữ lại. |
--enable-sparse-encoding
|
Bật mã hoá các mục nhập thưa thớt bằng cách sử dụng cây tìm kiếm nhị phân. Tính năng này hữu ích cho việc tối ưu hoá kích thước tệp APK, nhưng sẽ làm giảm hiệu suất truy xuất tài nguyên. |
--collapse-resource-names
|
Thu gọn tên tài nguyên thành một giá trị duy nhất trong nhóm chuỗi khoá.
Tài nguyên được miễn trừ bằng lệnh no_collapse trong một tệp do --resources-config-path chỉ định.
|
--shorten-resource-paths
|
Rút ngắn đường dẫn tài nguyên bên trong tệp APK. |
--resource-path-shortening-map path
|
Chỉ định đường dẫn để xuất bản đồ ánh xạ các đường dẫn tài nguyên cũ sang đường dẫn được rút ngắn. |
-v
|
Tăng độ chi tiết của tệp đầu ra. |
-h
|
Trình bày phần nội dung trợ giúp của công cụ. |
Chuyển đổi
Theo mặc định, lệnh compile
của AAPT biên dịch các tài nguyên thành một định dạng nhị phân phù hợp với tệp APK. Bạn cũng có thể chỉ định định dạng protobuf phù hợp với các AAB bằng cách chỉ định --proto-format
. Lệnh convert
chuyển đổi tệp APK giữa hai định dạng.
Cú pháp chuyển đổi
Cú pháp chung để sử dụng convert
như sau:
aapt2 convert -o output-file options file[,file[..]]
Ví dụ sau đây chuyển đổi các tài nguyên trong input.apk
và tạo một tệp APK mới trong output.apk
chứa các tài nguyên ở định dạng Protobuf. Tệp APK này dùng một cây tìm kiếm nhị phân nhỏ gọn hơn thay cho cách trình bày bảng phẳng thông thường, nhờ đó giảm kích thước tệp APK cùng với chi phí hiệu suất truy xuất:
aapt2 convert -o output.apk --output-format proto --enable-sparse-encoding input.apk
Tuỳ chọn chuyển đổi
Sử dụng các tuỳ chọn sau với convert
:
Tuỳ chọn | Mô tả |
---|---|
-o path
|
Chỉ định đường dẫn đầu ra cho tệp APK tài nguyên đã liên kết. Cờ này là bắt buộc vì bạn phải chỉ định đường dẫn cho tệp APK đầu ra có thể chứa các tài nguyên đã liên kết. |
--output-format [proto|binary]
|
Định dạng đầu ra. Giá trị được chấp nhận là proto và binary . Khi không được thiết lập, giá trị mặc định sẽ là binary .
|
--enable-sparse-encoding
|
Bật mã hoá các mục nhập thưa thớt bằng cách sử dụng cây tìm kiếm nhị phân. Tính năng này hữu ích cho việc tối ưu hoá kích thước tệp APK, nhưng sẽ làm giảm hiệu suất truy xuất tài nguyên. |
--keep-raw-values
|
Giữ lại các giá trị thuộc tính thô trong tệp XML. |
-v
|
Tăng độ chi tiết của tệp đầu ra. |
-h
|
Trình bày phần nội dung trợ giúp của công cụ. |
Chế độ trình nền (Daemon mode)
AAPT phiên bản 2.19 đã ra mắt chế độ trình nền để đưa ra các lệnh. Chế độ trình nền cho phép bạn nhập nhiều lệnh trong một phiên AAPT.
Cú pháp trình nền
Bắt đầu chế độ trình nền bằng lệnh sau:
aapt2 daemon
Khi chế độ trình nền đang chạy, bạn có thể nhập các lệnh. Mỗi đối số của lệnh phải nằm trên một dòng riêng biệt, với một dòng trống ở cuối lệnh. Thoát khỏi chế độ trình nền bằng cách nhấn tổ hợp phím Control+D.
Hãy cân nhắc các lệnh compile
riêng lẻ sau đây:
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/
Bạn có thể nhập các lệnh sau đây trong chế độ trình nền:
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
Tuỳ chọn chế độ trình nền
Một tuỳ chọn duy nhất cho chế độ trình nền là --trace-folder folder
, tuỳ chọn này sẽ tạo mảnh theo dõi JSON systrace
thành folder đã chỉ định.
Phiên bản
Xác định phiên bản AAPT2 mà bạn đang sử dụng bằng lệnh version
:
aapt2 version Android Asset Packaging Tool (aapt) 2.19-8678579
Các thay đổi về hành vi khi sử dụng AAPT2
Trước AAPT2, AAPT là phiên bản mặc định của Công cụ đóng gói tài nguyên Android nhưng hiện không còn được dùng nữa. Mặc dù AAPT2 sẽ hoạt động tức thì với các dự án cũ, nhưng phần này sẽ mô tả một số thay đổi về hành vi mà bạn cần lưu ý.
Hệ phân cấp phần tử trong tệp kê khai Android
Trong các phiên bản AAPT trước, các phần tử lồng trong các nút không chính xác trong tệp AndroidManifest.xml
sẽ bị bỏ qua hoặc dẫn đến cảnh báo.
Hãy xem ví dụ sau đây:
<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>
Các phiên bản AAPT trước sẽ chỉ bỏ qua thẻ <action>
bị đặt nhầm chỗ.
Với AAPT2, bạn sẽ gặp lỗi sau:
AndroidManifest.xml:15: error: unknown element <action> found.
Để giải quyết lỗi này, hãy nhớ lồng ghép chính xác các phần tử tệp kê khai của bạn. Để biết thêm thông tin, hãy đọc bài viết Tổng quan về tệp kê khai ứng dụng.
Khai báo tài nguyên
Bạn không còn chỉ định được loại tài nguyên từ thuộc tính name
.
Ví dụ sau đây khai báo không chính xác một mục tài nguyên attr
:
<style name="childStyle" parent="parentStyle"> <item name="attr/my_attr">@color/pink</item> </style>
Việc khai báo loại tài nguyên theo cách này sẽ dẫn đến lỗi bản dựng sau đây:
Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)' not found.
Để khắc phục lỗi này, hãy khai báo rõ ràng loại tệp bằng type="attr"
:
<style name="childStyle" parent="parentStyle"> <item type="attr" name="my_attr">@color/pink</item> </style>
Ngoài ra, khi khai báo phần tử <style>
, phần tử gốc cũng phải là tài nguyên kiểu. Nếu không, bạn sẽ gặp lỗi tương tự như sau:
Error: (...) invalid resource type 'attr' for parent of style
Sử dụng các ký hiệu tham chiếu tài nguyên @ không đúng cách
AAPT2 phát ra lỗi bản dựng khi bạn bỏ qua hoặc thiết lập không chính xác các ký hiệu tham chiếu tài nguyên (@
). Ví dụ: nếu bạn bỏ qua biểu tượng khi chỉ định thuộc tính kiểu:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> ... <!-- Note the missing '@' symbol when specifying the resource type. --> <item name="colorPrimary">color/colorPrimary</item> </style>
Khi xây dựng mô-đun, AAPT2 sẽ phát ra lỗi bản dựng sau đây:
ERROR: expected color but got (raw string) color/colorPrimary
Ngoài ra, nếu bạn thêm biểu tượng không chính xác khi truy cập vào một tài nguyên từ không gian tên android
:
... <!-- When referencing resources from the 'android' namespace, omit the '@' symbol. --> <item name="@android:windowEnterAnimation"/>
Khi xây dựng mô-đun, AAPT2 sẽ phát ra lỗi bản dựng sau đây:
Error: style attribute '@android:attr/windowEnterAnimation' not found
Cấu hình thư viện không chính xác
Nếu ứng dụng của bạn có phần phụ thuộc trên thư viện bên thứ ba được tạo bằng các phiên bản Bộ công cụ bản dựng SDK Android cũ hơn thì ứng dụng của bạn có thể gặp sự cố trong thời gian chạy mà không hiện lỗi hoặc cảnh báo nào. Sự cố này có thể xảy ra vì trong quá trình tạo thư viện, các trường R.java
được khai báo final
. Do đó, tất cả mã tài nguyên nằm trong các lớp của thư viện.
AAPT2 căn cứ vào việc gán lại mã nhận dạng cho các tài nguyên thư viện khi tạo bản dựng ứng dụng. Nếu thư viện giả định rằng các mã nhận dạng này là final
và cùng dòng trong DEX của thư viện, thì thời gian chạy sẽ không khớp.
Để giải quyết lỗi này, hãy liên hệ với người tạo thư viện để xây dựng lại thư viện bằng cách sử dụng phiên bản Bộ công cụ xây dựng SDK Android mới nhất rồi đăng lại thư viện.