בעבר הייתה ב-Android תמיכה רק בגודלי דפי זיכרון בגודל של 4KB, ביצוע אופטימיזציה של ביצועי זיכרון המערכת עבור הכמות הממוצעת של הזיכרון הכוללת בדרך כלל יש במכשירי Android. החל מ-Android 15, מערכת AOSP תומכת מכשירים שמוגדרים להשתמש בגודל דף של 16KB (16KB) מכשירים). אם באפליקציה נעשה שימוש בספריות NDK, ישירות או בעקיפין דרך SDK, תצטרכו לבנות את האפליקציה מחדש כדי פועלים במכשירים האלה בגודל 16KB.
יצרני מכשירים ממשיכים לפתח מכשירים עם כמויות גדולות יותר של זיכרון פיזי (RAM), רבים מהמכשירים האלה ישתמשו ב- 16KB בסופו של דבר, הם יהיו גדולים יותר) כדי לבצע אופטימיזציה של ביצועי המכשיר. ההוספה מתבצעת תמיכה במכשירים בגודל דף של 16KB תאפשר לאפליקציה לפעול מכשירים ועוזרים לאפליקציה להפיק תועלת מהביצועים המשויכים ושיפורים. בלי הידור מחדש, יכול להיות שאפליקציות לא יפעלו במכשירים עם נפח אחסון של 16KB כשהם יופקו בגרסאות עתידיות של Android.
כדי לעזור לך להוסיף תמיכה עבור האפליקציה, הכנו הנחיות בנושא בדיקה אם האפליקציה שלכם הושפעה, איך ליצור מחדש את האפליקציה (אם רלוונטי), ואיך לבדוק את האפליקציה סביבה של 16KB באמצעות אמולטורים (כולל Android 15) תמונות מערכת עבור אמולטור Android).
יתרונות ושיפורים בביצועים
配置为 16 KB 页面的设备平均使用的内存会略多,但系统和应用性能也会有所提升:
- 在系统面临内存压力时缩短应用启动时间:平均降低了 3.16%,对于我们测试过的一些应用而言,改进幅度更显著(提升幅度高达 30%)
- 降低应用启动时的功耗:平均降低 4.56%
- 相机启动速度更快:平均热启动速度加快 4.48%,冷启动速度平均加快 6.60%
- 缩短了系统启动时间:平均缩短了 1.5%(约 0.8 秒)
这些改进基于我们的初始测试,实际设备上的结果可能会有所不同。在继续测试的过程中,我们会进一步分析应用的潜在益处。
איך בודקים אם האפליקציה מושפעת?
אם האפליקציה משתמשת בקוד מקורי, צריך ליצור מחדש את האפליקציה עם תמיכה במכשירים בנפח 16 KB. אם אתם לא בטוחים שהאפליקציה שלכם משתמשת בקוד נייטיב, תוכלו להשתמש בכלי הניתוח ל-APK כדי לזהות אם קיים קוד נייטיב כלשהו, ואז לבדוק את ההתאמה של פלחי ELF לכל ספריות משותפות שתמצאו.
אם האפליקציה שלכם משתמשת רק בקוד שנכתב בשפת התכנות Java או ב-Kotlin, כולל כל הספריות או ערכות ה-SDK, האפליקציה כבר תומכת במכשירים בנפח 16KB. עם זאת, מומלץ לבדוק את האפליקציה בסביבה של 16 KB כדי לוודא שאין נסיגה לא צפויה בהתנהגות האפליקציה.
האם האפליקציה שלך משתמשת בקוד נייטיב?
האפליקציה שלכם משתמשת בקוד מקורי אם מתקיים אחד מהמצבים הבאים:
- האפליקציה שלך משתמשת בכל קוד C/C++ (מותאם). אם באפליקציה נעשה שימוש ב-NDK, אז היא משתמשת בקוד נייטיב.
- האפליקציה מקשרת לספריות מותאמות או ליחסי תלות של צד שלישי שמשתמשים בהן.
- האפליקציה שלכם נוצרה על ידי כלי של צד שלישי ליצירת אפליקציות שמשתמש בספריות נייטיב במכשיר.
זיהוי ספריות נייטיב באמצעות כלי הניתוח של APK
כלי הניתוח ל-APK הוא כלי שמאפשר לבחון היבטים שונים של חבילת APK מובנית. כדי לבדוק אם האפליקציה משתמשת בקוד מקורי או בספריות, פועלים לפי השלבים הבאים:
- פותחים את Android Studio, לוחצים על File > Open (קובץ > פתיחה) ובוחרים פרויקט כלשהו.
בסרגל התפריטים, לוחצים על Build > ניתוח APK...
בוחרים את ה-APK שרוצים לנתח.
בודקים בתיקייה
lib
, שמארחת קבצים של אובייקטים משותפים (.so
), אם יש כאלה. אם יש קובצי אובייקטים משותפים, האפליקציה משתמשת בקוד נייטיב. אם אין קובצי אובייקטים משותפים או שאין תיקייהlib
, האפליקציה לא משתמשת בקוד מקורי.
בניית האפליקציה עם תמיכה במכשירים עם 16KB
כדי לתמוך במכשירים עם נפח של 16KB, אפליקציות שמשתמשות בקוד נייטיב צריכות להשלים את השלבים שמתוארים בקטעים הבאים. אם מעדכנים לגרסה 8.5.1 ואילך של AGP מגרסה r28 ואילך של NDK ומשתמשים ביחסי תלות מוכנים מראש שתואמים ל-16KB, האפליקציות תואמות ל-16KB כברירת מחדל.
עדכון האריזה של הספריות המשותפות
מומלץ לשדרג ל-AGP בגרסה 8.5.1 ואילך ולהשתמש בספריות משותפות לא דחוסות.
AGP גרסה 8.5.1 ואילך
במכשירים עם 16 KB נדרשים אפליקציות שנשלחות עם ספריות משותפות לא דחוסות כדי ליישר אותן על תחום ממורכז בגודל 16 KB. לשם כך, צריך לשדרג את Android Gradle Plugin (AGP) לגרסה 8.5.1 ואילך. פרטים על תהליך השדרוג מופיעים בקטע Android Plugin Upgrade Assistant.
AGP גרסה 8.5 ומטה
אם אתם לא יכולים לשדרג את AGP לגרסה 8.5.1 ואילך, האפשרות החלופית היא לעבור לשימוש בספריות משותפות דחוסות. מעדכנים את ההגדרות של Gradle כדי ש-Gradle ידחס את הספריות המשותפות בזמן האריזה של האפליקציה, כדי למנוע בעיות בהתקנת האפליקציה עקב ספריות משותפות לא תואמות.
מגניב
מוסיפים את האפשרות הבאה לקובץ build.gradle
:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Kotlin
בקובץ build.gradle.kts
, מוסיפים את האפשרות הבאה:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
הידור האפליקציה באמצעות יישור ELF של 16KB
כדי שהאפליקציה תוכל לפעול, במכשירים עם 16KB צריך ליישר נכון את מקטעי ה-ELF של הספריות המשותפות באמצעות יישור של 16KB.
כדי לקמפל את האפליקציה באמצעות התאמה של ELF בגודל 16 KB, צריך לבצע את השלבים שמפורטים באחד מהקטעים הבאים, בהתאם לגרסה של Android NDK שבה אתם משתמשים.
Android NDK r28 ואילך
NDK מגרסה r28 ואילך של הידור של 16 KB מותאם כברירת מחדל.
Android NDK r27
כדי לתמוך בהידור של ספריות משותפות שמותאמות ל-16KB עם Android NDK מגרסה r27 ואילך, צריך לעדכן את הדגלים ndk-build
, build.gradle
, build.gradle.kts
או linker באופן הבא:
ndk-build
בתוך Application.mk
:
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
מגניב
בקובץ build.gradle
, מגדירים את הארגומנט -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
:
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
}
}
}
}
Kotlin
בקובץ build.gradle.kts
, מגדירים את הארגומנט -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
:
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments += listOf("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON")
}
}
}
}
מערכות פיתוח אחרות
מציינים את הדגלים הבאים של הקישור:
-Wl,-z,max-page-size=16384
Android NDK r26 ומטה
כדי לתמוך בהידור של ספריות משותפות שמותאמות ל-16KB עם Android NDK מגרסה r26 ומטה, צריך לעדכן את ההגדרות של ndk-build
או cmake
באופן הבא:
ndk-build
מעדכנים את Android.mk
כדי להפעיל התאמה של ELF בנפח 16KB:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
CMake
מעדכנים את CMakeLists.txt
כדי להפעיל התאמה של ELF בנפח 16KB:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
חיפוש מופעי קוד שמפנים לגדלים ספציפיים של דפים
גם אם האפליקציה מותאמת ל-16 KB, יכול להיות שתופיעו בה שגיאות אם בחלקים מסוימים בקוד מוגדרת הנחה שהמכשיר משתמש בגודל דף ספציפי. כדי למנוע זאת, צריך לבצע את השלבים הבאים:
מסירים יחסי תלות בתוך הקוד שמפנים הקבוע
PAGE_SIZE
או למופעים בלוגיקת הקוד, שמניחים שגודל הדף של המכשיר הוא 4KB (4096
).במקום זאת, צריך להשתמש ב-
getpagesize()
או ב-sysconf(_SC_PAGESIZE)
.כדאי לחפש שימושים ב-
mmap()
ובממשקי API אחרים שמחייבים ארגומנטים תואמים לדפים, ולהחליף אותם בחלופות במקרה הצורך.
במקרים מסוימים, אם באפליקציה נעשה שימוש ב-PAGE_SIZE
כערך נוח שלא קשור לגודל הדף הבסיסי, הדבר לא יגרום לשגיאות באפליקציה כשמשתמשים בה במצב 16KB. עם זאת, אם הערך הזה מועבר לליבה עם mmap
בלי MAP_FIXED
, הליבה עדיין משתמשת בדף שלם, מה שמבזבז חלק מהזיכרון. לכן, הערך של PAGE_SIZE
לא מוגדר כשמפעילים את המצב של 16KB ב-NDK בגרסה 27 ואילך.
אם האפליקציה משתמשת ב-PAGE_SIZE
בצורה הזו ואף פעם לא מעבירה את הערך הזה ישירות לליבה, במקום להשתמש ב-PAGE_SIZE
צריך ליצור משתנה חדש עם שם חדש, שישקף שהוא משמש למטרות אחרות ולא משקף דף זיכרון אמיתי.
בדיקת האפליקציה בסביבה של 16 KB
אחרי שמפתחים את האפליקציה עם תמיכה במכשירים עם נפח של 16KB, כדאי לבדוק את האפליקציה בסביבה של 16KB כדי לראות אם היא חווה רגרסיות. לשם כך, בצע את הצעדים הבאים:
מגדירים אחת מסביבות הבדיקה הבאות:
מפעילים את מכשיר הבדיקה ומריצים את הפקודה הבאה כדי לוודא שהוא משתמש בסביבה של 16 KB:
adb shell getconf PAGE_SIZE
הפקודה צריכה להחזיר את הערך
16384
.בכל ספרייה משותפת, צריך לוודא שהפלחים של ה-ELF בספריות המשותפות מותאמים בצורה נכונה באמצעות התאמה של 16 KB ELF. אפשר להשתמש בסקריפט הזה כדי לעזור בתהליך:
#!/bin/bash # usage: alignment.sh path to search for *.so files dir="$1" RED="\e[31m" GREEN="\e[32m" ENDCOLOR="\e[0m" matches="$(find $dir -name "*.so" -type f)" IFS=$'\n' for match in $matches; do res="$(objdump -p ${match} | grep LOAD | awk '{ print $NF }' | head -1)" if [[ $res =~ "2**14" ]] || [[ $res =~ "2**16" ]]; then echo -e "${match}: ${GREEN}ALIGNED${ENDCOLOR} ($res)" else echo -e "${match}: ${RED}UNALIGNED${ENDCOLOR} ($res)" fi done
שומרים את הסקריפט בקובץ, למשל
alignment.sh
.לחלץ את קובץ ה-APK של האפליקציה:
unzip APK_NAME.apk -d /tmp/my_apk_out ``` 1. Run the script on the extracted files in the `/tmp/my_apk_out` directory: ```none {: .devsite-terminal .devsite-click-to-copy } alignment.sh /tmp/my_apk_out | grep "arm64-v8a" ``` The script outputs either `ALIGNED` or `UNALIGNED` for all the `arm64-v8a` shared libraries. 1. If any `arm64-v8a` shared libraries are `UNALIGNED`, you'll need to [update the packaging for those libraries][20], then [recompile your app][21] and retest by following the steps in this section.
מריצים את הפקודה הבאה
zipalign
כדי לוודא שהאפליקציה תואמת ל-16KB, כאשר APK_NAME הוא השם של קובץ ה-APK של האפליקציה:zipalign -c -P 16 -v 4 APK_NAME.apk
בודקים ביסודיות את האפליקציה ומתמקדים באזורים שעלולים להיות מושפעים משינוי מופעי הקוד שמפנים לגדלים ספציפיים של דפים.
הגדרת אמולטור Android עם תמונת מערכת של Android 15 שמבוססת על 16KB
כדי להגדיר סביבה של 16 KB באמצעות Android Emulator:
תמונות מערכת עם אמולטור Android 15 המבוססות על 16KB תואמות ל-Android Studio Jellyfish | 2023.3.1 ואילך. עם זאת, כדי ליהנות מחוויית השימוש הטובה ביותר כשעובדים עם גרסת הבטא של Android 15, צריך להוריד את גרסת התצוגה המקדימה העדכנית של Android Studio.
חשוב לזכור שאפשר להשאיר את הגרסה הקיימת של Android Studio מותקנת, כי אפשר להתקין כמה גרסאות זו לצד זו.
ב-Android Studio, לוחצים על Tools (כלים) > SDK Manager (מנהל SDK).
בכרטיסייה SDK Platforms, מסמנים את התיבה Show Package Details, מרחיבים את הקטע Android VanillaIceCream Preview ובוחרים אחת או את שתי קובצי האימג' הבאים של מערכת האמולטור, בהתאם למכשירים הווירטואליים שרוצים ליצור:
- תמונת מערכת ניסיונית של Google APIs בגודל 16k של דף ARM 64 v8a
- Google APIs Experimental 16k Page Size Intel x86_64 Atom System Image
לוחצים על החלה > אישור כדי להוריד את תמונות המערכת שבחרתם.
פועלים לפי השלבים להגדרת מכשיר וירטואלי ל-Android 15, וכשמופיעה בקשה לבחור קובץ אימג' של מערכת, בוחרים את קובץ האימג' בגודל 16KB שהורדתם. אם לא מוצגת המלצה אוטומטית, אפשר למצוא את תמונת המערכת בגודל 16KB בכרטיסייה Other Images.
- במנהל המכשירים, לוחצים על 3 הנקודות לצד התמונה בגודל 16KB ואז על הצגה בדיסק.
- בתיקייה הזו, מחפשים את הקובץ
config.ini
. מוסיפים את השורה הבאה לקובץ
config.ini
ושומרים את השינויים:kernel.parameters = androidboot.page_shift=14
כדי לאמת את השינויים, מריצים את הפקודה הבאה, שאמורה להחזיר את הערך
16384
:adb shell getconf PAGE_SIZE
הפעלה של מצב 16KB במכשיר באמצעות האפשרויות למפתחים
החל מ-Android 15 QPR1, להשתמש באפשרות למפתחים שזמינה מכשירים לאתחול המכשיר במצב 16 KB ולביצוע בדיקות במכשיר.
האפשרות הזו למפתחים זמינה במכשירים הבאים:
- Pixel 8 ו-Pixel 8 Pro (עם Android 15 QPR1 Beta 1 ואילך)