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 گوگل به شرح زیر دانلود کنید:
- در فهرست مخزن ، به مسیر com.android.tools.build > aapt2 بروید.
- نام آخرین نسخه AAPT2 را کپی کنید.
نام نسخهای که کپی کردهاید را در 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
در مرورگر خود به آدرس اینترنتی (URL) بروید. AAPT2 به زودی شروع به دانلود خواهد کرد.
فایل JAR که دانلود کردهاید را از حالت فشرده خارج کنید.
فایل JAR باید حاوی یک فایل اجرایی
aapt2و برخی کتابخانههایی باشد که این فایل اجرایی به آنها وابسته است.
کامپایل
AAPT2 از کامپایل کردن تمام انواع منابع اندروید ، مانند فایلهای drawable و XML، پشتیبانی میکند. وقتی AAPT2 را برای کامپایل کردن فراخوانی میکنید، در هر فراخوانی، یک فایل منبع واحد را به عنوان ورودی ارسال کنید. سپس AAPT2 فایل را تجزیه کرده و یک فایل باینری میانی با پسوند .flat تولید میکند.
هنگام ارسال کل دایرکتوریها، AAPT2 تمام فایلهای موجود در دایرکتوری را حتی زمانی که فقط یک منبع تغییر کرده باشد، دوباره کامپایل میکند. اگرچه میتوانید دایرکتوریهای منبع حاوی بیش از یک فایل منبع را با استفاده از پرچم --dir به AAPT2 ارسال کنید، اما از مزایای کامپایل تدریجی منابع به این روش بهرهمند نمیشوید.
انواع فایلهای خروجی میتوانند بسته به ورودی که برای کامپایل ارائه میدهید، متفاوت باشند، همانطور که در جدول زیر نشان داده شده است:
جدول ۱. انواع فایلهای ورودی و خروجی برای کامپایل
| ورودی | خروجی |
|---|---|
فایلهای منبع XML، مانند String و Style که در دایرکتوری res/values/ قرار دارند | جدول منابع با پسوند *.arsc.flat . |
| تمام فایلهای منبع دیگر. | تمام فایلها به غیر از فایلهای موجود در دایرکتوری علاوه بر این، تمام فایلهای PNG به طور پیشفرض فشرده میشوند و پسوند |
فایلهای خروجی 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 در فایلهای منبع خود استفاده میکنید، این پرچم الزامی است. |
-A directory | دایرکتوری داراییها را که قرار است در APK گنجانده شود، مشخص میکند. شما میتوانید از این دایرکتوری برای ذخیره فایلهای اصلی و پردازش نشده استفاده کنید. برای کسب اطلاعات بیشتر، بخش «دسترسی به فایلهای اصلی» را مطالعه کنید. |
-R file | یک فایل .flat منفرد را با استفاده از معنای overlay بدون استفاده از تگ <add-resource> به link ارسال میکند.وقتی یک فایل منبع ارائه میدهید که روی یک فایل موجود قرار میگیرد، آخرین منبع متناقض ارائه شده استفاده میشود. |
--package-id package-id | شناسه بستهای را که برای برنامه شما استفاده میشود، مشخص میکند. شناسه بستهای که مشخص میکنید باید بزرگتر یا مساوی 0x7f باشد، مگر اینکه در ترکیب با |
--allow-reserved-package-id | اجازه استفاده از شناسه بسته رزرو شده را میدهد. شناسههای بسته رزرو شده، شناسههایی هستند که معمولاً به کتابخانههای مشترک اختصاص داده میشوند و در محدوده 0x02 تا 0x7e قرار دارند. با استفاده از این گزینه فقط باید برای بستههایی با نسخه |
--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 تولید میکند. به عنوان ورودی به |
--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 را تغییر میدهد. این گزینه باید همراه با |
-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 | مسیر فایل قالب: 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 اندروید بازسازی کند و کتابخانه را دوباره منتشر کند.