AAPT2

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

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 của bạn. 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 hóa cho nền tảng Android.

Trình bổ trợ Android cho Gradle 3.0.0 trở lên mặc định bật AAPT2 và thông thường, bạn không cần 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 gỡ lỗi, bạn có thể tìm AAPT2 như một công cụ độc lập trong Bộ công cụ xây dựng SDK Android phiên bản 26.0.2 trở lên.

Để tải xuống Bộ công cụ xây 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ụ xây dựng SDK, bạn có thể tìm thấy AAPT2 trong android_sdk/build-tools/version/. Do Bộ công cụ xây dựng SDK Android không được phát hành phiên bản mới thường xuyên, phiên bản AAPT2 có trong Bộ công cụ xây 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ừ Google Maven.

Để 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 hỗ trợ việc biên dịch tài nguyên nhanh hơn bằng cách cho phép biên dịch gia tăng. Bạn có thể thực hiện việc này bằng cách chia quy trình xử lý tài nguyên 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 tất cả các tệp đã biên dịch và đóng gói chúng 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. Chuyển đến com.android.tools.build > aapt2 trong phần chỉ mục kho lưu trữ.
  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 gọi AAPT2 để biên dịch, bạn nên 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.

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 đến AAPT2 thông qua cờ --dir, nhưng bạn không nhận được lợi ích từ việc biên dịch tài nguyên gia tăng dần khi chuyển thư mục. Điều này nghĩa là khi chuyển toàn bộ thư mục, AAPT2 sẽ biên dịch lại tất cả các tệp trong thư mục, ngay cả khi chỉ có một tài nguyên thay đổi.

Các loại tệp đầu ra có thể khác nhau tùy theo dữ liệu đầu vào mà bạn cung cấp để biên dịch. Các loại tệp này được giải thích trong bảng dưới đây:

Đầu vào Đầu ra
Các tệp tài nguyên XML, chẳng hạn như ChuỗiPhong cách, 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ả các tệp tài nguyên khác. Tất cả cá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ả cá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 tùy 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 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ý.

Biên dịch cú pháp

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ư hiển thị trong bảng trên, 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ẹ (loại tài nguyên và cấu hình). Với ví dụ trên, trong đó strings.xml là dữ liệu đầu vào, aapt2 sẽ tự động đặt tên tệp đầu ra là values-en_strings.arsc.flat. Mặt khác, tên tệp của 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ẽ sẽ là drawable_img.png.flat.

Tùy chọn biên dịch

Có một số tùy chọn mà bạn có thể sử dụng cùng với lệnh compile, như hiển thị trong bảng dưới đây:

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 hóa lợi ích của quá trình biên dịch gia tăng và do đó, bạn không nên sử dụng cờ này cho các dự án lớn.

--pseudo-localize Tạo ra các phiên bản bản địa hóa giả của các chuỗi mặc định, chẳng hạn như en-XA và en-XB.
--no-crunch Tắt tính năng xử lý PNG.

Hãy sử dụng tùy chọn này nếu bạn đã xử lý tệp PNG hoặc nếu bạn đang tạo bản dựng gỡ lỗi không yêu cầu giảm kích thước tệp. Nếu bật tùy 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 Xử lý các lỗi được phép khi sử dụng các phiên bản AAPT trước đó dưới dạng nhắc nhở.

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 mà bạn có thể nhận được khi sử dụng AAPT2, hãy đọc bài viết Các thay đổi về hành vi trong AAPT2.

-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ả các tệp trung gian được tạo từ giai đoạn biên dịch (như bảng tài nguyên, tệp XML nhị phân, tệp PNG đã xử lý và đóng gói thành một APK duy nhất). Ngoài ra, bạn có thể tạo các tệp phụ khác như tệp quy tắc R.java và ProGuard trong giai đoạn này. Tuy nhiên, APK đã tạo không chứa mã byte DEX và chưa được ký. Có nghĩa là bạn không thể triển khai APK này cho một thiết bị. Nếu bạn không dùng Trình bổ trợ Android cho Gradle để xây 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ý APK của bạn.

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 – drawable_Image.flatvalues_values.arsc.flat với tệp AndroidManifest.xml. AAPT2 liên 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 tùy chọn sau với lệnh link:

Tuỳ chọn Mô tả
-o path Chỉ định đường dẫn đầu ra cho 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 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 để xây dựng.

Cờ này là bắt buộc vì tệp kê khai bao gồm các thông tin quan trọng về ứng dụng của bạn như tên gói và ID ứng dụng.

-I Cung cấp đường dẫn đến android.jar của nền tảng hoặc các 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 (ví dụ: android:id) 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 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ý. Để tìm hiểu thêm, hãy đọc bài viết Truy cập các tệp gốc.

-R file Chuyển từng tệp .flat để liên kết bằng cách 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ở rộng hoặc sửa đổi) 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 ID gói để sử dụng cho ứng dụng của bạn.

ID 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 ID gói đặt trước.

ID gói đặt trước là các ID 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 tùy chọn này cho các gói có phiên bản sdk tối thiểu từ 26 trở xuống.

--java directory Chỉ định thư mục để tạo R.java.
--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ách này khi xây dựng 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ách này khi xây dựng 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ã hóa 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 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 hóa các chuỗi được đánh dấu 'đề xuất'.
-c config Cung cấp danh sách các 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ả những 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 xóa tất cả các mật độ khác.

--output-to-dir Xuất nội dung APK sang thư mục do -o chỉ định.

Nếu bạn gặp bất kỳ 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ụ xây dựng SDK Android 28.0.0 trở lên.

--min-sdk-version min-sdk-version Đặt phiên bản SDK tối thiểu mặc định để sử dụng cho AndroidManifest.xml.
--target-sdk-version target-sdk-version Đặt 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 (số nguyên) để đưa vào AndroidManifest.xml nếu không có mã này.
--compile-sdk-version-name compile-sdk-version-name Chỉ định tên phiên bản để đưa vào AndroidManifest.xml nếu không có tên nào.
--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 công cụ gói để tạo Android App Bundle.

--non-final-ids Tạo R.java bằng ID tài nguyên không phải cuối cùng (tham chiếu đến các ID từ mã của ứng dụng sẽ không cùng dòng trong quá trình biên dịch kotlinc/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 ID của các tài nguyên đó. Ứng dụng này thích 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à ID được chỉ định của các tài nguyên đó.

Tùy chọn này cho phép các ID được chỉ định giữ trạng thái ổn định ngay cả khi bạn xóa 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 tùy chỉnh để tạo R.java.
--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ả cá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 AndroidManifest.xml.
--rename-instrumentation-target-package instrumentation- target-package Đổi tên gói mục tiêu cho khả năng đo lường.

Bạn nên dùng yếu tố này cùng với --rename-manifest-package.

-0 extension

Chỉ định phần mở rộng 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 APK khác.

Bạn phải chỉ định đường dẫn đến APK đầu ra cùng với tập hợp các cấu hình.

-v Bật tăng độ chi tiết cho tệp đầu ra.

Dump

dump được dùng để in thông tin về APK bạn đã tạo bằng lệnh link. Ví dụ: lệnh sau đây in nội dung từ bảng tài nguyên của APK đã chỉ định:

aapt2 dump resources output.apk

Cú pháp kết xuất

Cú pháp chung để sử dụng dump như sau:

aapt2 dump sub-command filename.apk [options]

Lệnh con kết xuất

Bạn cần chỉ định một trong các lệnh con sau đây bằng lệnh dump:

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 APK.
configurations In mọi cấu hình mà tài nguyên sử dụng trong APK.
packagename In tên gói của APK.
permissions In các quyền được trích xuất từ tệp kê khai của APK.
strings In nội dung của nhóm chuỗi bảng tài nguyên của APK.
styleparents In tệp tin 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 APK.
xmlstrings In chuỗi từ xml đã biên dịch của APK.
xmltree In cây xml đã biên dịch của APK.

Tùy chọn kết xuất

Bạn có thể sử dụng các tùy chọn sau với dump:

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.

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 và hiện không 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 kê khai Android sẽ bị bỏ qua hoặc dẫn đến cảnh báo. Ví dụ: hãy xem xét mẫu sau:

<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. Tuy nhiên, 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 phần Cấu trúc tệp kê khai.

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ụ: mẫu sau đây khai báo không chính xác một mục tài nguyên attr:

<style name="foo" parent="bar">
    <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="foo" parent="bar">
  <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à loại 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

Không gian tên Android với ForegroundLinearLayout

ForegroundLinearLayout bao gồm 3 thuộc tính: foregroundInsidePadding, android:foregroundandroid:foregroundGravity. Lưu ý rằng foregroundInsidePadding không nằm trong không gian tên android, không giống như hai thuộc tính còn lại.

Trong các phiên bản AAPT trước, trình biên dịch sẽ tự động bỏ qua các thuộc tính foregroundInsidePadding khi bạn xác định thuộc tính bằng không gian tên android. Khi sử dụng AAPT2, trình biên dịch sẽ sớm phát hiện được lỗi này và phát ra lỗi bản dựng sau đây:

Error: (...) resource android:attr/foregroundInsidePadding is private

Để giải quyết vấn đề này, chỉ cần thay thế android:foregroundInsidePadding bằng foregroundInsidePadding.

Sử dụng không đúng các ký hiệu tham chiếu tài nguyên @

AAPT2 phát ra lỗi bản dựng khi bạn bỏ qua hoặc đặt không chính xác các ký hiệu tham chiếu tài nguyên (@). Ví dụ: hãy cân nhắc xem bạn có bỏ qua biểu tượng khi chỉ định thuộc tính kiểu, như minh họa dưới đây:

<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, hãy cân nhắc xem bạn có đưa vào biểu tượng không chính xác khi truy cập một tài nguyên từ không gian tên android hay không, như minh họa dưới đây:

...
<!-- 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ụ xây 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 thị bất kỳ 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 và do đó, tất cả ID tài nguyên nằm trong các lớp của thư viện.

AAPT2 căn cứ vào việc chỉ định lại ID cho các tài nguyên thư viện khi bạn xây dựng ứng dụng. Nếu thư viện giả định rằng các ID này là final và đặt các mã này trong dex 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 và đăng lại thư viện.