AAPT2

AAPT2 (ابزار بسته‌بندی دارایی‌های اندروید) یک ابزار ساخت است که اندروید استودیو و افزونه‌ی اندروید گریدل از آن برای کامپایل و بسته‌بندی منابع برنامه‌ی شما استفاده می‌کنند. AAPT2 منابع را تجزیه، فهرست‌بندی و به فرمت باینری که برای پلتفرم اندروید بهینه شده است، کامپایل می‌کند.

افزونه‌ی اندروید گریدل نسخه ۳.۰.۰ و بالاتر، به طور پیش‌فرض AAPT2 را فعال می‌کند. معمولاً نیازی نیست خودتان aapt2 فراخوانی کنید. با این حال، اگر ترجیح می‌دهید به جای اندروید استودیو از ترمینال و سیستم ساخت خودتان استفاده کنید، می‌توانید از AAPT2 از خط فرمان استفاده کنید. همچنین می‌توانید خطاهای ساخت مربوط به AAPT2 را از خط فرمان اشکال‌زدایی کنید. برای انجام این کار، AAPT2 را به عنوان یک ابزار مستقل در ابزارهای ساخت SDK اندروید نسخه ۲۶.۰.۲ و بالاتر پیدا کنید.

برای دانلود ابزارهای ساخت SDK اندروید از خط فرمان، از sdkmanager استفاده کنید و دستور زیر را اجرا کنید:

sdkmanager "build-tools;build-tools-version"

پس از دانلود ابزارهای ساخت SDK، AAPT2 را در android_sdk /build-tools/ version / پیدا کنید.

از آنجا که نسخه‌های جدید ابزارهای ساخت SDK اندروید اغلب منتشر نمی‌شوند، ممکن است نسخه AAPT2 موجود در ابزارهای ساخت SDK شما جدیدترین نباشد. برای دریافت آخرین نسخه AAPT2، AAPT2 را از Google Maven دانلود کنید .

برای استفاده از AAPT2 از طریق خط فرمان در لینوکس یا مک، دستور aapt2 را اجرا کنید. در ویندوز، دستور aapt2.exe را اجرا کنید.

AAPT2 با فعال کردن کامپایل افزایشی، از کامپایل سریع‌تر منابع پشتیبانی می‌کند. برای انجام کامپایل افزایشی، پردازش منابع به دو مرحله تقسیم می‌شود:

  • کامپایل : فایل‌های منبع را به فرمت‌های دودویی کامپایل می‌کند.
  • پیوند : تمام فایل‌های کامپایل شده را ادغام کرده و آنها را در یک بسته واحد بسته‌بندی می‌کند.

این جداسازی به بهبود عملکرد برای ساخت‌های افزایشی کمک می‌کند. برای مثال، اگر تغییراتی در یک فایل واحد وجود داشته باشد، فقط باید آن فایل را دوباره کامپایل کنید.

دانلود AAPT2 از گوگل ماون

برای دریافت جدیدترین نسخه AAPT2 که در ابزارهای ساخت وجود ندارد، AAPT2 را از مخزن Maven گوگل به شرح زیر دانلود کنید:

  1. در فهرست مخزن ، به مسیر com.android.tools.build > aapt2 بروید.
  2. نام آخرین نسخه AAPT2 را کپی کنید.
  3. نام نسخه‌ای که کپی کرده‌اید را در URL زیر وارد کنید و سیستم عامل مورد نظر خود را مشخص کنید: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ aapt2-version /aapt2- aapt2-version - [windows | linux | osx] .jar

    برای مثال، برای دانلود نسخه ۳.۲.۰-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

  4. در مرورگر خود به آدرس اینترنتی (URL) بروید. AAPT2 به زودی شروع به دانلود خواهد کرد.

  5. فایل JAR که دانلود کرده‌اید را از حالت فشرده خارج کنید.

    فایل JAR باید حاوی یک فایل اجرایی aapt2 و برخی کتابخانه‌هایی باشد که این فایل اجرایی به آنها وابسته است.

کامپایل

AAPT2 از کامپایل کردن تمام انواع منابع اندروید ، مانند فایل‌های drawable و XML، پشتیبانی می‌کند. وقتی AAPT2 را برای کامپایل کردن فراخوانی می‌کنید، در هر فراخوانی، یک فایل منبع واحد را به عنوان ورودی ارسال کنید. سپس AAPT2 فایل را تجزیه کرده و یک فایل باینری میانی با پسوند .flat تولید می‌کند.

هنگام ارسال کل دایرکتوری‌ها، AAPT2 تمام فایل‌های موجود در دایرکتوری را حتی زمانی که فقط یک منبع تغییر کرده باشد، دوباره کامپایل می‌کند. اگرچه می‌توانید دایرکتوری‌های منبع حاوی بیش از یک فایل منبع را با استفاده از پرچم --dir به AAPT2 ارسال کنید، اما از مزایای کامپایل تدریجی منابع به این روش بهره‌مند نمی‌شوید.

انواع فایل‌های خروجی می‌توانند بسته به ورودی که برای کامپایل ارائه می‌دهید، متفاوت باشند، همانطور که در جدول زیر نشان داده شده است:

جدول ۱. انواع فایل‌های ورودی و خروجی برای کامپایل

ورودی خروجی
فایل‌های منبع XML، مانند String و Style که در دایرکتوری res/values/ قرار دارند جدول منابع با پسوند *.arsc.flat .
تمام فایل‌های منبع دیگر.

تمام فایل‌ها به غیر از فایل‌های موجود در دایرکتوری res/values/ به فایل‌های XML باینری با پسوند *.flat تبدیل می‌شوند.

علاوه بر این، تمام فایل‌های PNG به طور پیش‌فرض فشرده می‌شوند و پسوند *.png.flat را می‌پذیرند. اگر تصمیم ندارید PNGها را فشرده کنید، می‌توانید در حین کامپایل از گزینه --no-crunch استفاده کنید.

فایل‌های خروجی AAPT2 قابل اجرا نیستند و شما باید بعداً این فایل‌های باینری را به عنوان ورودی در مرحله پیوند برای تولید APK وارد کنید. با این حال، فایل APK تولید شده قابل اجرا نیست که بتوانید بلافاصله آن را روی دستگاه اندروید مستقر کنید، زیرا حاوی فایل‌های 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/

همانطور که در جدول ۱ نشان داده شده است، نام فایل خروجی به نام فایل ورودی و نام دایرکتوری والد آن بستگی دارد.

برای مثال قبلی که فایل strings.xml به عنوان ورودی است، aapt2 به طور خودکار فایل خروجی را values-en_strings.arsc.flat نامگذاری می‌کند. با این حال، فایل drawable کامپایل شده که در دایرکتوری drawable ذخیره شده است، drawable_img.png.flat نامگذاری شده است.

گزینه‌های کامپایل

همانطور که در جدول 2 نشان داده شده است، چندین گزینه وجود دارد که می‌توانید با دستور compile از آنها استفاده کنید:

جدول ۲. گزینه‌های دستور کامپایل

گزینه توضیحات
-o path

مسیر خروجی برای منبع(های) کامپایل شده را مشخص می‌کند.

این یک پرچم اجباری است، زیرا شما باید مسیری را به دایرکتوری مشخص کنید که AAPT2 بتواند منابع کامپایل شده را در آن خروجی داده و ذخیره کند.

--dir directory

دایرکتوری را برای اسکن منابع مشخص می‌کند.

اگرچه می‌توانید از این پرچم برای کامپایل چندین فایل منبع با یک دستور استفاده کنید، اما مزایای کامپایل افزایشی را غیرفعال می‌کند. بنابراین، این پرچم نباید برای پروژه‌های بزرگ استفاده شود.

--pseudo-localize نسخه‌های شبه‌محلی‌شده از رشته‌های پیش‌فرض، مانند en-XA و en-XB تولید می‌کند.
--no-crunch پردازش PNG را غیرفعال می‌کند.

اگر قبلاً فایل‌های PNG را پردازش کرده‌اید یا در حال ایجاد نسخه‌های اشکال‌زدایی هستید که نیازی به کاهش اندازه فایل ندارند، از این گزینه استفاده کنید. فعال کردن این گزینه منجر به اجرای سریع‌تر می‌شود اما اندازه فایل خروجی را افزایش می‌دهد.

--legacy خطاهایی را که هنگام استفاده از نسخه‌های قبلی AAPT مجاز هستند، به عنوان هشدار در نظر می‌گیرد.

این پرچم باید برای خطاهای غیرمنتظره زمان کامپایل استفاده شود. برای رفع تغییرات رفتاری شناخته‌شده‌ای که ممکن است هنگام استفاده از AAPT2 رخ دهد، تغییرات رفتاری هنگام استفاده از AAPT2 را مطالعه کنید.

-zip file file یک فایل ZIP است که حاوی دایرکتوری res برای اسکن منابع است.
-output-text-symbols file یک فایل متنی حاوی نمادهای منبع در مسیر مشخص شده تولید می‌کند. فایل .
-preserve-visibility-of-styleables در صورت مشخص شدن، همان قوانین نمایش را برای styleableها که برای همه منابع دیگر استفاده می‌شوند، اعمال می‌کند. در غیر این صورت، همه styleableها عمومی می‌شوند.
-visibility [ public | private | default |] میزان دیده شدن منابع کامپایل شده را در سطح مشخص شده تنظیم می‌کند.
-trace-folder folder یک قطعه ردیابی JSON systrace به مسیر مشخص شده تولید می‌کند. پوشه .
-source-path path مسیر فایل منبع کامپایل شده را به صورت زیر تنظیم می‌کند: مسیر .
-h ابزار کمکی را نمایش می‌دهد.
-v ثبت وقایع طولانی (verbose logging) را فعال می‌کند.

در مرحله پیوند، 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.jar که منابع تعریف شده در بسته 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

شما می‌توانید از گزینه‌های زیر به همراه دستور link استفاده کنید:

جدول ۳. گزینه‌های دستور پیوند

گزینه توضیحات
-o path

مسیر خروجی برای منبع لینک شده APK را مشخص می‌کند.

این یک پرچم الزامی است، زیرا شما باید مسیر APK خروجی را که می‌تواند منابع لینک‌شده را در خود نگه دارد، مشخص کنید.

--manifest file

مسیر فایل مانیفست اندروید برای ساخت را مشخص می‌کند.

این یک پرچم اجباری است، زیرا فایل مانیفست شامل اطلاعات ضروری در مورد برنامه شما، مانند نام بسته و شناسه برنامه است.

-I

مسیر android.jar یا سایر APK های پلتفرم، مانند framework-res.apk ، را ارائه می‌دهد که ممکن است هنگام ساخت ویژگی‌ها مفید باشد.

اگر از ویژگی‌هایی با فضای نام android در فایل‌های منبع خود استفاده می‌کنید، این پرچم الزامی است.
-A directory دایرکتوری دارایی‌ها را که قرار است در APK گنجانده شود، مشخص می‌کند.

شما می‌توانید از این دایرکتوری برای ذخیره فایل‌های اصلی و پردازش نشده استفاده کنید. برای کسب اطلاعات بیشتر، بخش «دسترسی به فایل‌های اصلی» را مطالعه کنید.

-R file یک فایل .flat ‎ منفرد را با استفاده از معنای overlay بدون استفاده از تگ <add-resource> به link ارسال می‌کند.

وقتی یک فایل منبع ارائه می‌دهید که روی یک فایل موجود قرار می‌گیرد، آخرین منبع متناقض ارائه شده استفاده می‌شود.

--package-id package-id شناسه بسته‌ای را که برای برنامه شما استفاده می‌شود، مشخص می‌کند.

شناسه بسته‌ای که مشخص می‌کنید باید بزرگتر یا مساوی 0x7f باشد، مگر اینکه در ترکیب با --allow-reserved-package-id استفاده شود.

--allow-reserved-package-id

اجازه استفاده از شناسه بسته رزرو شده را می‌دهد.

شناسه‌های بسته رزرو شده، شناسه‌هایی هستند که معمولاً به کتابخانه‌های مشترک اختصاص داده می‌شوند و در محدوده 0x02 تا 0x7e قرار دارند. با استفاده از --allow-reserved-package-id می‌توانید شناسه‌هایی را اختصاص دهید که در محدوده شناسه‌های بسته رزرو شده قرار می‌گیرند.

این گزینه فقط باید برای بسته‌هایی با نسخه min-sdk 26 یا پایین‌تر استفاده شود.

--java directory دایرکتوری را برای تولید R.java مشخص می‌کند.
--proguard proguard_options فایل خروجی را برای قوانین ProGuard تولید می‌کند.
--proguard-conditional-keep-rules فایل خروجی مربوط به قوانین ProGuard را برای DEX اصلی تولید می‌کند.
--no-auto-version نسخه‌بندی خودکار SDK مربوط به سبک و طرح‌بندی را غیرفعال می‌کند.
--no-version-vectors نسخه‌بندی خودکار فایل‌های برداری قابل ترسیم را غیرفعال می‌کند. از این پرچم فقط هنگام ساخت APK خود با کتابخانه Vector Drawable استفاده کنید.
--no-version-transitions نسخه‌بندی خودکار منابع انتقال را غیرفعال می‌کند. از این پرچم فقط هنگام ساخت APK خود با کتابخانه پشتیبانی انتقال استفاده کنید.
--no-resource-deduping حذف خودکار داده‌های تکراری از منابع با مقادیر یکسان در پیکربندی‌های سازگار را غیرفعال می‌کند.
--enable-sparse-encoding رمزگذاری پراکنده ورودی‌های منابع را فعال می‌کند. این امر منجر به کاهش اندازه APK، استفاده از حافظه و تأخیر در راه‌اندازی و افزایش اندک زمان جستجوی منابع فردی پس از راه‌اندازی می‌شود.
-z نیازمند بومی‌سازی رشته‌های دارای علامت «پیشنهادی» است.
-c config فهرستی از پیکربندی‌ها را که با کاما از هم جدا شده‌اند، ارائه می‌دهد.

برای مثال، اگر به کتابخانه پشتیبانی وابسته دارید که شامل ترجمه‌هایی برای چندین زبان است، می‌توانید منابع را فقط برای پیکربندی زبان داده شده، مانند انگلیسی یا اسپانیایی، فیلتر کنید.

شما باید پیکربندی زبان را با یک کد زبان دو حرفی ISO 639-1 تعریف کنید، که به صورت اختیاری با یک کد منطقه دو حرفی ISO 3166-1-alpha-2 و قبل از آن با حرف کوچک 'r' همراه می‌شود. به عنوان مثال، en-rUS.

--preferred-density density به AAPT2 اجازه می‌دهد تا نزدیکترین چگالی منطبق را انتخاب کرده و سایر چگالی‌ها را حذف کند.

چندین معیار سنجش تراکم پیکسل برای استفاده در برنامه شما وجود دارد، مانند ldpi، hdpi و xhdpi. وقتی تراکم ترجیحی را مشخص می‌کنید، AAPT2 نزدیکترین تراکم منطبق را در جدول منابع انتخاب و ذخیره می‌کند و سایر موارد را حذف می‌کند.

--output-to-dir محتویات APK را در دایرکتوری مشخص شده توسط -o خروجی می‌دهد.

اگر در استفاده از این پرچم با خطایی مواجه شدید، می‌توانید با ارتقا به Android SDK Build Tools 28.0.0 یا بالاتر، آنها را برطرف کنید.

--min-sdk-version min-sdk-version حداقل نسخه پیش‌فرض SDK مورد استفاده برای AndroidManifest.xml را تنظیم می‌کند.
--target-sdk-version target-sdk-version نسخه SDK هدف پیش‌فرض را برای استفاده در AndroidManifest.xml تنظیم می‌کند.
--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 تولید می‌کند.

به عنوان ورودی به bundletool برای تولید یک بسته نرم‌افزاری اندروید مناسب است.

--non-final-ids R.java با شناسه‌های منبع غیر نهایی تولید می‌کند. ارجاعات به شناسه‌ها از کد برنامه در طول کامپایل kotlinc یا javac به صورت درون‌خطی (inline) انجام نمی‌شوند.
--emit-ids path فایلی را در مسیر داده شده با لیستی از نام انواع منابع و نگاشت‌های شناسه آنها منتشر می‌کند. این برای استفاده با --stable-ids مناسب است.
--stable-ids outputfilename.ext فایل تولید شده با --emit-ids که شامل لیست نام انواع منابع و شناسه‌های اختصاص داده شده به آنهاست را مصرف می‌کند.

این گزینه به شناسه‌های اختصاص داده شده اجازه می‌دهد حتی زمانی که منابع جدید را هنگام پیوند حذف یا اضافه می‌کنید، ثابت بمانند.

--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 را تغییر می‌دهد.

این گزینه باید همراه با --rename-manifest-package ‎ استفاده شود.

-0 extension

پسوند فایل‌هایی را که نمی‌خواهید فشرده شوند، مشخص می‌کند.

--split path:config[,config[..]] منابع را بر اساس مجموعه‌ای از پیکربندی‌ها تقسیم می‌کند تا نسخه متفاوتی از APK تولید شود.

شما باید مسیر فایل APK خروجی را به همراه مجموعه تنظیمات مشخص کنید.

--proguard-main-dex file فایل خروجی برای قوانین تولید شده ProGuard برای DEX اصلی.
--proguard-minimal-keep-rules یک مجموعه حداقلی از قوانین ProGuard keep ایجاد می‌کند.
--no-resource-removal حذف خودکار منابع بدون پیش‌فرض‌ها را غیرفعال می‌کند. از این گزینه فقط هنگام ساخت بسته‌های همپوشانی منابع زمان اجرا استفاده کنید.
-x پرچم قدیمی که استفاده از شناسه بسته 0x01 را مشخص می‌کند.
--product products-list لیستی از نام محصولات که با کاما از هم جدا شده‌اند و باید نگهداری شوند را مشخص می‌کند.
--no-xml-namespaces پیشوند فضای نام XML و اطلاعات URI را از فایل AndroidManifest.xml و فایل‌های باینری XML در res/* حذف می‌کند.
--shared-lib یک کتابخانه‌ی زمان اجرای مشترک اندروید تولید می‌کند.
--static-lib یک کتابخانه استاتیک اندروید تولید می‌کند.
--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 قطعه ردیابی JSON systrace را به folder مشخص شده تولید می‌کند.
--merge-only فقط منابع را بدون تأیید ارجاعات منابع ادغام می‌کند. این پرچم فقط باید با پرچم --static-lib استفاده شود.
-h منوی راهنما را نمایش می‌دهد.
-v افزایش وضوح خروجی را ممکن می‌سازد.

تخلیه

dump برای چاپ اطلاعات مربوط به APK تولید شده با استفاده از دستور link استفاده می‌شود.

سینتکس روگرفت

سینتکس کلی استفاده از dump به صورت زیر است:

aapt2 dump sub-command filename.apk [options]

مثال زیر محتوا را از جدول منابع APK مشخص شده چاپ می‌کند:

aapt2 dump resources output.apk

زیردستورات را حذف کنید

یکی از زیردستورات زیر را با دستور dump مشخص کنید:

جدول ۴. زیردستورات dump

زیرفرمان توضیحات
apc محتویات AAPT2 Container (APC) تولید شده در طول کامپایل را چاپ می‌کند.
badging اطلاعات استخراج شده از مانیفست APK را چاپ می‌کند.
configurations هر پیکربندی استفاده شده توسط یک منبع در APK را چاپ می‌کند.
overlayable منابع قابل همپوشانی APK را چاپ می‌کند.
packagename نام بسته APK را چاپ می‌کند.
permissions مجوزهای استخراج شده از مانیفست APK را چاپ می‌کند.
strings محتویات جدول منابع APK را چاپ می‌کند.
styleparents والدین سبک‌های استفاده شده در APK را چاپ می‌کند.
resources محتویات جدول منابع APK را چاپ می‌کند.
xmlstrings رشته‌ها را از XML کامپایل‌شده‌ی APK چاپ می‌کند.
xmltree درختی از XML کامپایل شده‌ی APK را چاپ می‌کند.

گزینه‌های تخلیه

از گزینه‌های زیر با dump استفاده کنید:

جدول 5. گزینه‌های تخلیه

گزینه توضیحات
--no-values هنگام نمایش منبع، خروجی مقادیر را سرکوب می‌کند.
--file file یک فایل را به عنوان آرگومان برای حذف از APK مشخص می‌کند.
-v حجم خروجی را افزایش می‌دهد.

تفاوت

از diff برای مقایسه دو APK و شناسایی هرگونه تفاوت بین آنها استفاده کنید.

نحو تفاوت

سینتکس کلی استفاده از diff به صورت زیر است:

aapt2 diff first.apk second.apk

هیچ گزینه‌ای برای دستور diff وجود ندارد.

بهینه سازی

optimize برای اجرای بهینه‌سازی‌ها روی منابع ادغام‌شده و resources.arsc قبل از بسته‌بندی آنها در APK استفاده می‌شود. این بهینه‌سازی می‌تواند اندازه APK را بسته به اندازه و تعداد منابعی که استفاده می‌شوند، حدود ۱ تا ۳ درصد کاهش دهد.

بهینه سازی سینتکس

سینتکس کلی استفاده از optimize به صورت زیر است:

aapt2 optimize options file[,file[..]]

مثال زیر منابع موجود در input.apk را بهینه می‌کند و یک APK جدید و بهینه‌شده در output.apk ایجاد می‌کند. این مثال، نمایش جدول مسطح معمول را با یک نمایش فشرده‌تر جایگزین می‌کند که منجر به کاهش اندازه APK، استفاده از حافظه و تأخیر راه‌اندازی و افزایش اندک زمان جستجوی منابع پس از راه‌اندازی می‌شود.

aapt2 optimize -o output.apk --enable-sparse-encoding input.apk

بهینه‌سازی گزینه‌ها

شما می‌توانید از گزینه‌های زیر با optimize استفاده کنید:

جدول 6. گزینه‌های بهینه‌سازی

گزینه توضیحات
-o path مسیر خروجی برای منبع لینک شده APK را مشخص می‌کند.

این یک پرچم الزامی است، زیرا شما باید مسیر APK خروجی را که می‌تواند منابع لینک‌شده را در خود نگه دارد، مشخص کنید.

-d directory مسیر دایرکتوری خروجی را برای تقسیم‌بندی‌ها مشخص می‌کند.
-x path مسیر فایل پیکربندی XML را مشخص می‌کند.
-p مصنوعات چند-APK را چاپ می‌کند و خارج می‌شود.
--target-densities density[,density[..]] لیستی از تراکم صفحه نمایش‌هایی که APK برای آنها بهینه شده است را با کاما از هم جدا می‌کند. تمام منابعی که در دستگاه‌هایی با تراکم داده شده بلااستفاده می‌مانند، از APK حذف می‌شوند.
--resources-config-path path

مسیر فایل resources.cfg را که شامل لیست منابع و دستورالعمل‌های مربوط به هر منبع است، مشخص می‌کند.

قالب: 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 نام منابع را به یک مقدار واحد در مجموعه رشته کلید تبدیل می‌کند. منابع با استفاده از دستورالعمل no_collapse در فایلی که توسط --resources-config-path مشخص شده است، مستثنی می‌شوند.
--shorten-resource-paths مسیر منابع داخل APK را کوتاه می‌کند.
--resource-path-shortening-map path مسیر خروجی نقشه مسیرهای منابع قدیمی به مسیرهای کوتاه شده را مشخص می‌کند.
-v حجم خروجی را افزایش می‌دهد.
-h راهنمای ابزار را نمایش می‌دهد.

تبدیل

به طور پیش‌فرض، دستور compile AAPT منابع را به فرمت دودویی که برای APKها مناسب است، کامپایل می‌کند. همچنین می‌توان با مشخص کردن --proto-format فرمت protobuf را که برای AABها مناسب است، مشخص کرد. دستور convert فایل‌های APK را به دو فرمت تبدیل می‌کند.

تبدیل نحو

سینتکس کلی convert به صورت زیر است:

aapt2 convert -o output-file options file[,file[..]]

مثال زیر منابع موجود در input.apk را تبدیل کرده و یک APK جدید در output.apk ایجاد می‌کند که حاوی منابع با فرمت protobuf است. این مثال، نمایش جدول مسطح معمول را با یک نمایش فشرده‌تر جایگزین می‌کند که منجر به کاهش اندازه APK، استفاده از حافظه و تأخیر راه‌اندازی و افزایش جزئی می‌شود.

aapt2 convert -o output.apk --output-format proto --enable-sparse-encoding input.apk

گزینه‌های تبدیل

از گزینه‌های زیر با convert استفاده کنید:

جدول 7. گزینه‌های تبدیل

گزینه توضیحات
-o path

مسیر خروجی برای منبع لینک شده APK را مشخص می‌کند.

این یک پرچم الزامی است، زیرا شما باید مسیر APK خروجی را که می‌تواند منابع لینک‌شده را در خود نگه دارد، مشخص کنید.

--output-format [proto|binary] قالب خروجی. مقادیر پذیرفته شده proto و binary هستند. در صورت عدم تنظیم، پیش‌فرض binary است.
--enable-sparse-encoding رمزگذاری پراکنده ورودی‌های منابع را فعال می‌کند. این امر منجر به کاهش اندازه APK، استفاده از حافظه و تأخیر در راه‌اندازی و افزایش اندک زمان جستجوی منابع فردی پس از راه‌اندازی می‌شود.
--keep-raw-values مقادیر خام ویژگی‌ها را در فایل‌های XML حفظ می‌کند.
-v حجم خروجی را افزایش می‌دهد.
-h راهنمای ابزار را نمایش می‌دهد.

حالت دیمون

نسخه ۲.۱۹ نرم‌افزار AAPT حالت دیمون (daemon mode) را برای صدور دستورات معرفی کرد. حالت دیمون به شما امکان می‌دهد چندین دستور را در یک جلسه 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/

این دستورات را می‌توان در حالت Daemon به صورت زیر وارد کرد:

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

گزینه‌های حالت دیمون

تنها گزینه برای حالت daemon، --trace-folder folder ‎ است که یک قطعه ردیابی systrace JSON به folder مشخص شده تولید می‌کند.

نسخه

نسخه AAPT2 مورد استفاده خود را با دستور version تعیین کنید:

aapt2 version
Android Asset Packaging Tool (aapt) 2.19-8678579

تغییر رفتار هنگام استفاده از AAPT2

قبل از AAPT2، AAPT نسخه پیش‌فرض ابزار بسته‌بندی دارایی‌های اندروید بود که اکنون منسوخ شده است. اگرچه AAPT2 باید بلافاصله با پروژه‌های قدیمی‌تر کار کند، این بخش برخی از تغییرات رفتاری را که باید از آنها آگاه باشید، شرح می‌دهد.

سلسله مراتب عناصر در مانیفست اندروید

در نسخه‌های قبلی 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.

برای حل این مشکل، مطمئن شوید که عناصر manifest شما به درستی تو در تو قرار گرفته‌اند. برای اطلاعات بیشتر، نمای کلی App Manifest را مطالعه کنید.

اعلام منابع

دیگر نمی‌توانید نوع منبع را از ویژگی 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> ، والد آن نیز باید از نوع منبع 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

پیکربندی نادرست کتابخانه‌ها

اگر برنامه شما به یک کتابخانه شخص ثالث که با استفاده از نسخه‌های قدیمی‌تر ابزارهای ساخت SDK اندروید ساخته شده است، وابستگی دارد، ممکن است برنامه شما در زمان اجرا بدون نمایش هیچ خطا یا هشداری از کار بیفتد. این از کار افتادن ممکن است به این دلیل رخ دهد که در طول ایجاد کتابخانه، فیلدهای R.java final اعلام شده‌اند. در نتیجه، تمام شناسه‌های منابع در کلاس‌های کتابخانه به صورت درون‌خطی (inline) قرار می‌گیرند.

AAPT2 به این متکی است که هنگام ساخت برنامه شما، شناسه‌ها را به منابع کتابخانه مجدداً اختصاص دهد. اگر کتابخانه فرض کند که شناسه‌ها final هستند و آنها را در DEX کتابخانه به صورت درون‌خطی قرار دهد، عدم تطابق زمان اجرا رخ می‌دهد.

برای رفع این خطا، با نویسنده کتابخانه تماس بگیرید تا کتابخانه را با استفاده از آخرین نسخه ابزارهای ساخت SDK اندروید بازسازی کند و کتابخانه را دوباره منتشر کند.