AAPT2

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

پلاگین Android Gradle نسخه 3.0.0 و بالاتر AAPT2 را به طور پیش فرض فعال می کند. معمولاً نیازی نیست خودتان aapt2 فراخوانی کنید. با این حال، اگر ترجیح می دهید از ترمینال و سیستم ساخت خود به جای Android Studio استفاده کنید، می توانید از AAPT2 از خط فرمان استفاده کنید. همچنین می توانید خطاهای ساخت مربوط به AAPT2 را از خط فرمان رفع اشکال کنید. برای انجام این کار، AAPT2 را به عنوان یک ابزار مستقل در Android SDK Build Tools نسخه 26.0.2 و بالاتر پیدا کنید.

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

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

پس از دانلود SDK Build Tools، AAPT2 را در android_sdk /build-tools/ version / پیدا کنید.

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

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

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

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

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

AAPT2 را از Google Maven دانلود کنید

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

  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] .جار

    به عنوان مثال، برای دانلود نسخه 3.2.0-alpha18-4804415 برای ویندوز، از: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ 3.2.0-alpha18- استفاده کنید. 4804415 /aapt2- 3.2.0-alpha18-4804415 - windows .jar

  4. در یک مرورگر به آدرس URL بروید. دانلود AAPT2 به زودی آغاز می شود.

  5. فایل JAR را که به تازگی دانلود کرده اید از بسته بندی خارج کنید.

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

کامپایل

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

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

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

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

ورودی خروجی
فایل‌های منبع 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/

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

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

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

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

جدول 2. گزینه های فرمان را کامپایل کنید

گزینه توضیحات
-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 ها اعمال می کند که برای همه منابع دیگر استفاده می شود. در غیر این صورت، همه استایل‌ها عمومی می‌شوند.
-visibility [ public | private | default |] قابلیت مشاهده منابع کامپایل شده را در سطح مشخص شده تنظیم می کند.
-trace-folder folder یک قطعه ردیابی systrace JSON به قسمت مشخص شده ایجاد می کند پوشه .
-source-path path مسیر فایل منبع فایل منبع کامپایل شده را روی آن تنظیم می کند مسیر .
-h راهنمای ابزار را نمایش می دهد.
-v گزارش دقیق را فعال می کند.

در مرحله پیوند، AAPT2 همه فایل‌های میانی را که فاز کامپایل تولید می‌کند، مانند جداول منبع، فایل‌های XML باینری و فایل‌های PNG پردازش شده، ادغام می‌کند و سپس فایل‌ها را در یک APK بسته بندی می‌کند. علاوه بر این، فایل‌های کمکی دیگری مانند فایل‌های قوانین R.java و ProGuard می‌توانند در این مرحله تولید شوند. با این حال، APK تولید شده حاوی بایت کد DEX نیست و بدون امضا است. شما نمی توانید این APK را در دستگاهی مستقر کنید.

اگر از پلاگین Android Gradle برای ساخت برنامه خود از خط فرمان استفاده نمی‌کنید، می‌توانید از ابزارهای خط فرمان دیگری مانند d8 برای کامپایل بایت کد جاوا در بایت کد DEX و apksigner برای امضای APK استفاده کنید.

نحو کلی برای استفاده link به شرح زیر است:

aapt2 link path-to-input-files [options] -o
outputdirectory/outputfilename.apk --manifest AndroidManifest.xml

در مثال زیر، AAPT2 دو فایل میانی drawable_Image.flat و values_values.arsc.flat و فایل AndroidManifest.xml را ادغام می کند. AAPT2 نتیجه را با فایل android.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 می توانید از گزینه های زیر استفاده کنید:

جدول 3. گزینه های فرمان پیوند

گزینه توضیحات
-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 خود با کتابخانه قابل ترسیم برداری استفاده کنید.
--no-version-transitions نسخه خودکار منابع انتقال را غیرفعال می کند. از این پرچم فقط هنگام ساختن APK خود با کتابخانه پشتیبانی انتقال استفاده کنید.
--no-resource-deduping حذف خودکار منابع با مقادیر یکسان در پیکربندی‌های سازگار را غیرفعال می‌کند.
--enable-sparse-encoding رمزگذاری ورودی های پراکنده را با استفاده از درخت جستجوی باینری فعال می کند. این برای بهینه سازی اندازه APK مفید است اما به قیمت عملکرد بازیابی منابع.
-z نیاز به محلی سازی رشته هایی با علامت "پیشنهاد شده" دارد.
-c config فهرستی از پیکربندی ها را که با کاما جدا شده اند ارائه می دهد.

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

شما باید پیکربندی زبان را با یک کد زبان دو حرفی ISO 639-1، به صورت اختیاری با یک کد منطقه ای ISO 3166-1-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 برای ایجاد یک Android App Bundle.

--non-final-ids R.java با شناسه های منبع غیر نهایی تولید می کند. ارجاع به شناسه‌های کد برنامه در طول کامپایل kotlinc یا javac به صورت خطی نیست.
--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 را ایجاد می کند.
--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 قطعه ردیابی systrace JSON را در 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 مشخص کنید:

جدول 4. دستورات فرعی را تخلیه کنید

فرمان فرعی توضیحات
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 را حدود 1-3٪ کاهش دهد.

بهینه سازی نحو

نحو کلی برای استفاده از 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 مناسب است، جمع‌آوری می‌کند. همچنین می توان فرمت protobuf را که برای AAB ها مناسب است با تعیین --proto-format مشخص کرد. دستور 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 نسخه 2.19 حالت دیمون را برای صدور دستورات معرفی کرد. حالت Daemon به شما امکان می دهد چندین دستور را در یک جلسه AAPT وارد کنید.

نحو دیمون

حالت Daemon را با دستور زیر شروع کنید:

aapt2 daemon

هنگامی که حالت دیمون اجرا می شود، می توانید دستورات را وارد کنید. هر آرگومان دستور باید در یک خط جداگانه قرار گیرد و یک خط خالی در انتهای دستور باشد. با تایپ Control+D از حالت daemon خارج شوید.

دستورات 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 نسخه پیش‌فرض ابزار بسته‌بندی دارایی Android بود که اکنون منسوخ شده است. اگرچه 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.

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

اعلام منابع

دیگر نمی توانید نوع منبع را از ویژگی name نشان دهید. مثال زیر به اشتباه یک آیتم منبع attr را اعلام می کند:

<style name="childStyle" parent="parentStyle">
    <item name="attr/my_attr">@color/pink</item>
</style>

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

Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)'
not found.

برای رفع این خطا، نوع را با استفاده از type="attr" به صراحت اعلام کنید:

<style name="childStyle" parent="parentStyle">
  <item type="attr" name="my_attr">@color/pink</item>
</style>

علاوه بر این، هنگام اعلان عنصر <style> ، والد آن نیز باید یک نوع منبع سبک باشد. در غیر این صورت با خطای زیر مواجه می شوید:

Error: (...) invalid resource type 'attr' for parent of style

استفاده نادرست از نمادهای مرجع منبع @

AAPT2 هنگامی که نمادهای مرجع منبع ( @ ) را حذف کرده یا به اشتباه قرار می دهید، خطاهای ساخت ایجاد می کند. به عنوان مثال، اگر هنگام تعیین یک ویژگی سبک، نماد را حذف کنید:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  ...
  <!-- Note the missing '@' symbol when specifying the resource type. -->
  <item name="colorPrimary">color/colorPrimary</item>
</style>

هنگام ساخت ماژول، AAPT2 خطای ساخت زیر را ایجاد می کند:

ERROR: expected color but got (raw string) color/colorPrimary

علاوه بر این، اگر هنگام دسترسی به منبعی از فضای نام android ، نماد را به اشتباه وارد کنید:

...
<!-- When referencing resources from the 'android' namespace, omit the '@' symbol. -->
<item name="@android:windowEnterAnimation"/>

هنگام ساخت ماژول، AAPT2 خطای ساخت زیر را ایجاد می کند:

Error: style attribute '@android:attr/windowEnterAnimation' not found

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

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

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

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