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, באופן הבא:
- ב-repository Index, מנווטים אל 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. כשמפעילים את AAPT2 להידור, מעבירים
קובץ משאב יחיד כקלט בכל הפעלה. AAPT2 ואז מנתח את הקובץ
ויוצרת קובץ ביניים בינארי עם סיומת .flat
.
כשמעבירים ספריות שלמות, הפונקציה AAPT2 מבצעת הידור מחדש של כל הקבצים בספרייה
גם אם רק משאב אחד השתנה. למרות שאפשר להעביר משאבים
ספריות שמכילות יותר מקובץ משאבים אחד ל-AAPT2 באמצעות --dir
כך לא תיהנו מהיתרונות של הידור מצטבר של משאבים.
הסוגים של קובצי הפלט עשויים להשתנות בהתאם לקלט שסיפקתם עבור ההידור, כפי שמוצג בטבלה הבאה:
קלט | פלט |
---|---|
קובצי משאבים בפורמט XML, כמו
מחרוזת ו
סגנון,
נמצאים בספרייה 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, השם של קובץ הפלט תלוי בקלט filename והשם של ספריית ההורה שלו.
בדוגמה הקודמת עם הקובץ strings.xml
כקלט, aapt2
באופן אוטומטי
נותן לקובץ הפלט את השם values-en_strings.arsc.flat
. עם זאת, הנתונים של
קובץ שניתן להזזה שמאוחסן בספרייה שניתנת להזזה נקרא drawable_img.png.flat
.
אפשרויות הידור
יש כמה אפשרויות לשימוש בפקודה compile
, כפי שמוצג כאן
בטבלה 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
|
יוצר קובץ טקסט שמכיל את סמלי המשאבים שצוינו
|
-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 ל-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
:
אפשרות | תיאור |
---|---|
-o path
|
מציינת את נתיב הפלט של ה-APK של המשאב המקושר. זהו סימון חובה, מכיוון שצריך לציין את הנתיב של את ה-APK לפלט שיכול להכיל את המשאבים המקושרים. |
--manifest file
|
מציינת את הנתיב ליצירת קובץ המניפסט ב-Android. זהו סימון חובה, מכיוון שקובץ המניפסט כולל מידע חיוני על האפליקציה, כמו שם החבילה והאפליקציה ID. |
-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 ספרייה. |
--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
:
פקודת משנה | תיאור |
---|---|
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
:
אפשרות | תיאור |
---|---|
--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
:
אפשרות | תיאור |
---|---|
-o path
|
מציינת את נתיב הפלט של ה-APK של המשאב המקושר.
זהו סימון חובה, מכיוון שצריך לציין את הנתיב של את ה-APK לפלט שיכול להכיל את המשאבים המקושרים. |
-d directory
|
מציינת את הנתיב לספריית הפלט לפיצולים. |
-x path
|
מציינת את הנתיב לקובץ התצורה של XML. |
-p
|
מדפיסה את פריטי המידע שנוצרו בתהליך הפיתוח (Artifact) של חבילות 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[..]]
|
מציינת רשימה של פריטי מידע שנוצרו בתהליך הפיתוח (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
:
אפשרות | תיאור |
---|---|
-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, ולפרסם מחדש את לספרייה.