AAPT2

‫AAPT2 ‏ (Android Asset Packaging Tool) הוא כלי build ש-Android Studio ו-Android Gradle Plugin משתמשים בו כדי לקמפל ולארוז את המשאבים של האפליקציה. ‫AAPT2 מנתח, יוצר אינדקס ומקמפל את המשאבים לפורמט בינארי שעבר אופטימיזציה לפלטפורמת Android.

‫Android Gradle Plugin מגרסה 3.0.0 ואילך מפעיל את AAPT2 כברירת מחדל. בדרך כלל לא צריך להפעיל את aapt2 בעצמכם. עם זאת, אם אתם מעדיפים להשתמש בטרמינל ובמערכת ה-build שלכם במקום ב-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/.

כי גרסאות חדשות של כלי ה-Build של Android SDK לא יוצאות לעיתים קרובות, יכול להיות שהגרסה של AAPT2 שכלולה בכלי ה-Build של SDK לא תהיה הגרסה העדכנית ביותר. כדי לקבל את הגרסה האחרונה של AAPT2,‏ מורידים את AAPT2 מ-Google Maven.

כדי להשתמש ב-AAPT2 משורת הפקודה ב-Linux או ב-Mac, מריצים את הפקודה aapt2. ב-Windows, מריצים את הפקודה aapt2.exe.

‫AAPT2 תומך בהידור מהיר יותר של משאבים על ידי הפעלת הידור מצטבר. כדי לבצע קומפילציה מצטברת, עיבוד המשאבים מתבצע בשני שלבים:

  • Compile: קומפילציה של קובצי משאבים לפורמטים בינאריים.
  • קישור: ממזג את כל הקבצים המהודרים ומאגד אותם לחבילה אחת.

ההפרדה הזו עוזרת לשפר את הביצועים של בנייה מצטברת. לדוגמה, אם יש שינויים בקובץ אחד, צריך לבצע קומפילציה מחדש רק של הקובץ הזה.

הורדת AAPT2 מ-Google Maven

כדי לקבל את הגרסה החדשה ביותר של AAPT2 שלא כלולה בחבילת כלי ה-build, צריך להוריד את 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].jar

    לדוגמה, כדי להוריד את גרסה 3.2.0-alpha18-4804415 ל-Windows, משתמשים בכתובת הבאה: 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 תומך בהידור של כל סוגי משאבי Android, כמו קובצי XML ומשאבים מסוג drawable. כשמפעילים את AAPT2 לצורך קומפילציה, מעבירים קובץ משאבים יחיד כקלט לכל הפעלה. לאחר מכן, הכלי AAPT2 מנתח את הקובץ ויוצר קובץ בינארי ביניים עם סיומת .flat.

כשמעבירים ספריות שלמות, כלי AAPT2 מבצע קומפילציה מחדש של כל הקבצים בספרייה, גם אם רק משאב אחד השתנה. אפשר להעביר ל-AAPT2 ספריות משאבים שמכילות יותר מקובץ משאבים אחד באמצעות הדגל --dir, אבל לא תקבלו את היתרונות של קומפילציה מצטברת של משאבים בדרך הזו.

סוגי קובצי הפלט יכולים להיות שונים בהתאם לקלט שסיפקתם לקומפילציה, כמו שמוצג בטבלה הבאה:

טבלה 1. סוגי קובצי הקלט והפלט של ההידור

קלט פלט
קובצי משאבים בפורמט XML, כמו String ו-Style, שנמצאים בספרייה res/values/ טבלת משאבים עם *.arsc.flat כהרחבה שלה.
כל שאר קובצי המשאבים.

כל הקבצים מלבד הקבצים בספרייה res/values/ מומרים לקובצי XML בינאריים עם סיומות *.flat.

בנוסף, כל קובצי ה-PNG עוברים דחיסה כברירת מחדל ומקבלים את הסיומת *.png.flat . אם אתם בוחרים לא לדחוס קובצי PNG, אתם יכולים להשתמש באפשרות --no-crunch במהלך הקומפילציה.

הקבצים שנוצרים על ידי AAPT2 הם לא קבצים הפעלה, ותצטרכו לכלול את הקבצים הבינאריים האלה כקלט בשלב הקישור כדי ליצור קובץ APK. עם זאת, קובץ ה-APK שנוצר הוא לא קובץ הפעלה שאפשר לפרוס במכשיר Android באופן מיידי, כי הוא לא מכיל קובצי 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 שעבר קומפילציה ומאוחסן בספריית ה-drawable נקרא 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 אם מציינים, חלים אותם כללי חשיפה על רכיבים שניתנים לעיצוב שמשמשים לכל שאר המשאבים. אחרת, כל הרכיבים שניתן לעצב יהיו גלויים לכולם.
-visibility [public|private|default|] ההגדרה הזו קובעת את רמת החשיפה של המשאבים שעברו קומפילציה.
-trace-folder folder יוצר קטע של נתוני מעקב בפורמט JSON‏ systrace בתיקייה שצוינה.
-source-path path מגדיר את נתיב קובץ המקור של קובץ המשאבים שעבר קומפילציה לערך path.
-h הצגת העזרה של כלי ההמרה.
-v הפעלה של רישום מפורט ביומן.

בשלב הקישור, כלי AAPT2 ממזג את כל הקבצים הזמניים שנוצרים בשלב ההידור, כמו טבלאות משאבים, קובצי XML בינאריים וקובצי PNG שעברו עיבוד, ואז אורז את הקבצים בחבילת APK אחת. בנוסף, יכולים להיווצר בשלב הזה קבצים עזר אחרים, כמו R.java וקבצים של כללי ProGuard. עם זאת, קובץ ה-APK שנוצר לא מכיל קוד בייט של DEX והוא לא חתום. אי אפשר לפרוס את ה-APK הזה במכשיר.

אם אתם לא משתמשים בתוסף Android Gradle כדי לבנות את האפליקציה משורת הפקודה, אתם יכולים להשתמש בכלים אחרים משורת הפקודה, כמו d8 כדי לקמפל קוד בייטקוד של Java לקוד בייטקוד של 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

מציין את הנתיב לקובץ המניפסט של Android שרוצים ליצור.

זהו דגל חובה, כי קובץ המניפסט כולל מידע חיוני על האפליקציה, כמו שם החבילה ומזהה האפליקציה.

-I

הנתיב אל android.jar של הפלטפורמה או אל קובצי APK אחרים, כמו framework-res.apk, שיכולים להיות שימושיים בזמן בניית תכונות.

חובה להשתמש בדגל הזה אם משתמשים במאפיינים עם מרחב השמות android בקובצי המשאבים.
-A directory מציין ספריית נכסים שתיכלל בחבילת ה-APK.

אפשר להשתמש בספרייה הזו כדי לאחסן קבצים מקוריים שלא עברו עיבוד. מידע נוסף מופיע במאמר גישה לקבצים המקוריים.

-R file מעבירה קובץ .flat בודד אל link, באמצעות סמנטיקה של overlay בלי להשתמש בתג <add-resource>.

כשמספקים קובץ משאבים שמחליף קובץ קיים, נעשה שימוש במשאב האחרון שסופק שמתנגש עם משאב קיים.

--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 Library.
--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 ליצירת קובץ 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 מציין את חבילת Java המותאמת אישית שמתחתיה ייווצר R.java.
--extra-packages package_name יוצר את אותו קובץ R.java, אבל עם שמות חבילות שונים.
--add-javadoc-annotation annotation מוסיף הערת JavaDoc לכל מחלקות Java שנוצרו.
--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 יוצרת ספריית זמן ריצה משותפת של Android.
--static-lib יוצרת ספרייה סטטית של Android.
--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

הפקודה dump משמשת להדפסת מידע על קובץ ה-APK שנוצר באמצעות הפקודה link.

תחביר של dump

התחביר הכללי לשימוש ב-dump הוא:

aapt2 dump sub-command filename.apk [options]

בדוגמה הבאה מודפס תוכן מטבלת המשאבים של קובץ ה-APK שצוין:

aapt2 dump resources output.apk

פקודות משנה של dump

מציינים אחת מהפקודות המשניות הבאות עם הפקודה dump:

טבלה 4. פקודות משנה של 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

אפשר להשתמש באפשרויות הבאות עם dump:

טבלה 5. אפשרויות של dump

אפשרותתיאור
--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 הצגת העזרה של הכלי.

מצב דימון

בגרסה 2.19 של AAPT נוסף מצב דימון (daemon) להנפקת פקודות. מצב Daemon מאפשר להזין כמה פקודות בסשן AAPT אחד.

תחביר של Daemon

מפעילים את מצב הדמון באמצעות הפקודה הבאה:

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, שיוצרת קטע של מעקב בפורמט JSON‏ systrace למיקום שצוין folder.

גרסה

כדי לדעת באיזו גרסה של AAPT2 אתם משתמשים, מריצים את הפקודה version:

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

שינויים בהתנהגות כשמשתמשים ב-AAPT2

לפני AAPT2, ‏ AAPT הייתה גרסת ברירת המחדל של Android Asset Packaging Tool (כלי לאריזת נכסים ב-Android), שכבר הוצאה משימוש. למרות ש-AAPT2 אמור לפעול באופן מיידי עם פרויקטים ישנים יותר, בקטע הזה מתוארים כמה שינויים בהתנהגות שכדאי להכיר.

היררכיות של רכיבים במניפסט של Android

בגרסאות קודמות של 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>

הצהרה על סוג משאב בדרך הזו מובילה לשגיאת ה-build הבאה:

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>

כשמבצעים build של המודול, AAPT2 מחזיר את שגיאת ה-build הבאה:

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

בנוסף, אם כוללים בטעות את הסמל כשניגשים למשאב ממרחב השמות android:

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

כשמבצעים build של המודול, AAPT2 מחזיר את שגיאת ה-build הבאה:

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

הגדרות שגויות של ספריות

אם האפליקציה שלכם תלויה בספרייה של צד שלישי שנבנתה באמצעות גרסאות ישנות יותר של Android SDK Build Tools, יכול להיות שהאפליקציה תקרוס בזמן הריצה בלי להציג שגיאות או אזהרות. יכול להיות שהקריסה הזו מתרחשת כי במהלך יצירת הספרייה, השדות R.java מוצהרים כ-final. כתוצאה מכך, כל מזהי המשאבים מוטמעים בכיתות של הספרייה.

כדי לבנות את האפליקציה, כלי AAPT2 צריך להיות מסוגל להקצות מחדש מזהים למשאבי הספרייה. אם הספרייה מניחה שהמזהים הם final ומטמיעה אותם ב-DEX של הספרייה, יש אי התאמה בזמן הריצה.

כדי לפתור את השגיאה הזו, צריך ליצור קשר עם מחבר הספרייה כדי לבנות מחדש את הספרייה באמצעות הגרסה העדכנית של Android SDK Build Tools, ולפרסם מחדש את הספרייה.