AAPT2

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:

  1. Trong phần chỉ mục kho lưu trữ, hãy chuyển đến com.android.tools.build > aapt2.
  2. Sao chép tên của phiên bản AAPT2 mới nhất.
  3. 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

  4. Di chuyển đến URL trong trình duyệt—AAPT2 sẽ bắt đầu tải xuống trong chốc lát.

  5. 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:

Bảng 1. Loại tệp đầu vào và đầu ra để biên dịch

Đầu vào Đầu ra
Các tệp tài nguyên XML, chẳng hạn như ChuỗiKiể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 res/values/ đều được chuyển đổi thành các tệp XML nhị phân có phần mở rộng *.flat.

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 *.png.flat . Nếu chọn không nén tệp PNG, bạn có thể dùng tuỳ chọn --no-crunch trong quá trình biên dịch.

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.xmlmyImage.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:

Bảng 2. Tuỳ chọn lệnh biên dịch

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-XAen-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 tệp được chỉ định.
-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 thư mục được chỉ định.
-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 path.
-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.

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 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.flatvalues_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

Bạn có thể dùng các tuỳ chọn sau với lệnh link:

Bảng 3. Tuỳ chọn lệnh liên kết

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.jar của nền tảng hoặc các tệp APK khác như framework-res.apk (có thể hữu ích trong khi xây dựng các tính năng).

Cờ này là bắt buộc nếu bạn đang sử dụng các thuộc tính có không gian tê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.

--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 --allow-reserved-package-id, bạn có thể chỉ định các ID nằm trong phạm vi ID gói đặt trước.

Bạn chỉ nên sử dụng tuỳ chọn này cho các gói có phiên bản min-sdk từ 26 trở xuống.

--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 bundletool để tạo Android App Bundle.

--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 --rename-manifest-package.

-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:

Bảng 4. Lệnh con kết xuất

Lệnh conMô 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:

Bảng 5. Tuỳ chọn kết xuất

Tuỳ chọnMô 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:

Bảng 6. Tùy chọn tối ưu hoá

Tuỳ chọnMô 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 resources.cfg chứa danh sách tài nguyên và lệnh cho từng tài nguyên.

Đị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:

Bảng 7. Các tuỳ chọn chuyển đổi

Tuỳ chọnMô 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à protobinary. 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.