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 באופן הבא:
- באינדקס המאגר, מנווטים אל 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
לדוגמה, כדי להוריד את גרסה 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
עוברים לכתובת ה-URL בדפדפן. ההורדה של AAPT2 תתחיל בקרוב.
מבטלים את האריזה של קובץ ה-JAR שהורדתם.
קובץ ה-JAR צריך להכיל קובץ הפעלה
aapt2וכמה ספריות שהקובץ תלוי בהן.
הידור
AAPT2 תומך בהידור של כל סוגי משאבי Android, כמו קובצי XML ומשאבים מסוג drawable. כשמפעילים את AAPT2 לצורך קומפילציה, מעבירים קובץ משאבים יחיד כקלט לכל הפעלה. לאחר מכן, הכלי AAPT2 מנתח את הקובץ ויוצר קובץ בינארי ביניים עם סיומת .flat.
כשמעבירים ספריות שלמות, כלי AAPT2 מבצע קומפילציה מחדש של כל הקבצים בספרייה, גם אם רק משאב אחד השתנה. אפשר להעביר ל-AAPT2 ספריות משאבים שמכילות יותר מקובץ משאבים אחד באמצעות הדגל --dir, אבל לא תקבלו את היתרונות של קומפילציה מצטברת של משאבים בדרך הזו.
סוגי קובצי הפלט יכולים להיות שונים בהתאם לקלט שסיפקתם לקומפילציה, כמו שמוצג בטבלה הבאה:
טבלה 1. סוגי קובצי הקלט והפלט של ההידור
| קלט | פלט |
|---|---|
קובצי משאבים בפורמט XML, כמו String ו-Style, שנמצאים בספרייה res/values/
|
טבלת משאבים עם *.arsc.flat כהרחבה שלה.
|
| כל שאר קובצי המשאבים. |
כל הקבצים מלבד הקבצים בספרייה
בנוסף, כל קובצי ה-PNG עוברים דחיסה כברירת מחדל ומקבלים את הסיומת |
הקבצים שנוצרים על ידי 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
|
מגדיר את נתיב קובץ המקור של קובץ המשאבים שעבר קומפילציה לערך |
-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 בקובצי המשאבים.
|
-A directory
|
מציין ספריית נכסים שתיכלל בחבילת ה-APK.
אפשר להשתמש בספרייה הזו כדי לאחסן קבצים מקוריים שלא עברו עיבוד. מידע נוסף מופיע במאמר גישה לקבצים המקוריים. |
-R file
|
מעבירה קובץ .flat בודד אל link, באמצעות סמנטיקה של overlay
בלי להשתמש בתג <add-resource>.
כשמספקים קובץ משאבים שמחליף קובץ קיים, נעשה שימוש במשאב האחרון שסופק שמתנגש עם משאב קיים. |
--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 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.
מתאים כקלט ל-
|
--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.
מומלץ להשתמש באפשרות הזו בשילוב עם
|
-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
|
מציינים את הנתיב לקובץ פורמט: 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, ולפרסם מחדש את הספרייה.