AAPT2

AAPT2 (כלי לאריזת נכסים ב-Android) הוא כלי build שמערכת Android Studio השימוש בפלאגין של Android Gradle כדי להדר ולצרף את האפליקציות שלך משאבים. ניתוחי AAPT2, מדדים מה שמשנה את המשאבים לפורמט בינארי שמותאם במיוחד פלטפורמת Android.

פלאגין Android Gradle מגרסה 3.0.0 ואילך מפעיל AAPT2 כברירת מחדל. שלך בדרך כלל לא צריכים להפעיל aapt2 בעצמכם. עם זאת, אם אתם מעדיפים להשתמש בטרמינל ובמערכת ה-build שלכם במקום Android Studio, אפשר להשתמש AAPT2 משורת הפקודה. אפשר גם לנפות באגים בשגיאות build שקשורות ל-AAPT2 משורת הפקודה. כדי לעשות את זה, צריך למצוא את AAPT2 ככלי עצמאי Android SDK Build Tools מגרסה 26.0.2 ואילך.

כדי להוריד את כלי הפיתוח ל-Android SDK משורת הפקודה, צריך להשתמש ב sdkmanager ומריצים את הפקודה הבאה:

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

אחרי שמורידים את SDK Build Tools, צריך לאתר את AAPT2 ב- android_sdk/build-tools/version/

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

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

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

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

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

הורדת AAPT2 מ-Google Maven

כדי לקבל את הגרסה החדשה ביותר של AAPT2 שלא כלולה בכלי ה-build: מורידים את AAPT2 ממאגר Maven של Google, באופן הבא:

  1. ב-repository Index, מנווטים אל 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. כשמפעילים את AAPT2 להידור, מעבירים קובץ משאב יחיד כקלט בכל הפעלה. AAPT2 ואז מנתח את הקובץ ויוצרת קובץ ביניים בינארי עם סיומת .flat.

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

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

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

קלט פלט
קובצי משאבים בפורמט XML, כמו מחרוזת ו סגנון, נמצאים בספרייה 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, השם של קובץ הפלט תלוי בקלט filename והשם של ספריית ההורה שלו.

בדוגמה הקודמת עם הקובץ 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 או אם יוצרים גרסאות build לניפוי באגים שלא מחייבות הקטנה של גודל הקבצים. הפעלת האפשרות הזו תגרום להפעלה מהירה יותר, אבל התוצאה מוגדלת גודל הקובץ.

--legacy טיפול בשגיאות שמותרות כשמשתמשים בגרסאות קודמות של AAPT בתור אזהרות.

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

-zip file file הוא קובץ ZIP שמכיל את ספריית res שצריך לסרוק במשאבי אנוש.
-output-text-symbols file יוצר קובץ טקסט שמכיל את סמלי המשאבים שצוינו 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 ל-bytecode של 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.

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

-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 ספרייה.
--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:

טבלה 4. מחיקת פקודות משנה

פקודת משנהתיאור
apc הדפסה של התוכן של מאגר AAPT2 (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 מדפיסה את פריטי המידע שנוצרו בתהליך הפיתוח (Artifact) של חבילות 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[..]] מציינת רשימה של פריטי מידע שנוצרו בתהליך הפיתוח (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 הצגת העזרה של הכלי.

המרה

כברירת מחדל, הפקודה AAPT compile מבצעת הידור של המשאבים בפורמט בינארי. שמתאים לחבילות APK. אפשר גם לציין פורמט של פרוטובוף שמתאים ל-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 הצגת העזרה של הכלי.

מצב Daemon

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

תחביר Daemon

התחלת מצב דימון (daemon) באמצעות הפקודה הבאה:

aapt2 daemon

אחרי שמצב דימון פועל, אפשר להזין פקודות. כל ארגומנט הפקודה חייבת להיות בשורה נפרדת, עם שורה ריקה בסוף הפקודה. כדי לצאת ממצב דימון (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. שהוצא משימוש. למרות ש-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 גורם לשגיאות build כשמשמיטים או מציבים משאב באופן שגוי סימני עזר (@). לדוגמה, אם תשמיטו את הסמל ציון מאפיין סגנון:

<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 יקפיץ את שגיאת ה-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"/>

במהלך בניית המודול, AAPT2 יקפיץ את שגיאת ה-build הבאה:

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

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

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

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

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