תמיכה בגודלי דפים של 16KB

Android 过去仅支持 4 KB 内存页面大小, 优化了系统内存性能,以针对 Android 设备通常具备的功能。从 Android 15 开始,AOSP 支持 配置为使用 16 KB (16 KB) 页面大小的设备 设备)。如果您的应用使用任何 NDK 库,请直接使用 或者通过 SDK 间接创建,那么,您需要重新构建自己的应用 支持这些 16KB 设备。

随着设备制造商不断打造出 物理内存 (RAM),许多此类设备都会采用 16KB(以及 页面大小以优化设备的性能。正在添加 支持 16 KB 页面大小的设备,可使您的应用在这些设备上运行 并有助于您的应用从相关的广告效果中获益 改进。如果不重新编译,应用可能无法在 16KB 设备上运行 在未来的 Android 版本中正式推出。

为帮助您为应用添加支持,我们提供了有关如何检查 如果您的应用受到影响 重新构建您的应用(如果适用),以及如何在 Google Play 中 使用模拟器(包括 Android 15)的 16 KB 环境 系统映像)。

יתרונות ושיפור בביצועים

配置为使用 16 KB 页面大小的设备平均会使用略多一些的内存,但系统和应用的性能也会得到各种提升:

  • 缩短了系统内存压力时的应用启动时间:平均降低了 3.16%;对于我们测试的某些应用而言,改进幅度更大(最高可达 30%)
  • 应用启动期间的功耗降低:平均降低了 4.56%
  • 相机启动更快:热启动速度平均提高了 4.48%,冷启动速度平均提高了 6.60%
  • 缩短了系统启动时间:平均缩短了 8%(约 950 毫秒)

这些改进基于我们的初始测试,实际设备上的结果可能会有所不同。随着测试的继续进行,我们将进一步分析应用的潜在收益。

איך בודקים אם האפליקציה שלכם מושפעת

如果您的应用使用了任何原生代码,则应重新构建应用以支持 16 KB 设备。如果您不确定自己的应用是否使用了原生代码,可以使用 APK 分析器确定是否存在任何原生代码,然后检查您找到的任何共享库的 ELF 段对齐情况

如果您的应用仅使用以 Java 或 Kotlin 编程语言编写的代码(包括所有库或 SDK),则该应用已经支持 16 KB 设备。不过,我们建议您在 16 KB 环境中测试应用,以验证应用行为是否没有意外回归。

האם באפליקציה שלכם נעשה שימוש בקוד מקורי?

האפליקציה שלכם משתמשת בקוד מקורי אם מתקיים אחד מהמצבים הבאים:

  • האפליקציה שלכם משתמשת בקוד C/C++ (מקומי). אם האפליקציה שלכם משתמשת ב-Android NDK, היא משתמשת בקוד מקורי.
  • האפליקציה מקשרת לספריות מקומיות או יחסי תלות של צד שלישי (כמו ערכות SDK) שמשתמשים בהן.
  • האפליקציה שלכם נוצרה על ידי כלי לפיתוח אפליקציות של צד שלישי שמשתמש בספריות מקומיות במכשיר.

זיהוי ספריות מקוריות באמצעות הכלי לניתוח APK

APK Analyzer הוא כלי שמאפשר להעריך היבטים שונים של קובץ APK שנוצר. כדי לבדוק אם האפליקציה שלכם משתמשת בקוד מקורי (ללא קשר לכך שהיא תואמת לדפים בגודל 16KB):

  1. פותחים את Android Studio, לוחצים על File > Open (קובץ > פתיחה) ובוחרים פרויקט כלשהו.
  2. בסרגל התפריטים, לוחצים על Build‏ > Analyze APK…

    האפשרות בתפריט Studio Build להפעלת APK Analyzer

  3. בוחרים את קובץ ה-APK שרוצים לנתח.

  4. בודקים בתיקייה lib, שמארחת קבצים של אובייקטים משותפים (.so), אם יש כאלה. אם יש קבצים של אובייקטים משותפים, האפליקציה משתמשת בקוד מקורי. אם אין קובצי אובייקטים משותפים או שאין תיקייה lib, האפליקציה לא משתמשת בקוד מקורי.

    תצוגה של הכלי לניתוח APK שמראה שיש קבצים של אובייקטים משותפים

בדיקת ההתאמה של פלחי ELF בספריות משותפות

בכל ספרייה משותפת, צריך לוודא שהפלחים של ה-ELF בספריות המשותפות מותאמים בצורה נכונה באמצעות התאמה של 16 KB ELF. אם אתם מפתחים ב-Linux או ב-macOS, תוכלו להשתמש בסקריפט check_elf_alignment.sh כפי שמתואר בקטע הבא. אפשר גם להשתמש בכלי שורת הפקודה ישירות.

שימוש בסקריפט check_elf_alignment.sh (Linux או macOS)

כדי לבדוק את ההתאמה של פלחים של ELF באמצעות הסקריפט check_elf_alignment.sh:

  1. שומרים את הסקריפט check_elf_alignment.sh בקובץ.

  2. מריצים את הסקריפט בקובץ ה-APK של האפליקציה:

    check_elf_alignment.sh APK_NAME.apk
    

    הפלט של הסקריפט הוא ALIGNED או UNALIGNED לכל arm64-v8a הספריות המשותפות.

  3. אם ספריות משותפות מסוג arm64-v8a או x86_64 הן בגרסה UNALIGNED, תצטרכו לעדכן את האריזה של הספריות האלה, ואז לערוך קומפילציה מחדש של האפליקציה ולבדוק אותה מחדש לפי השלבים שמפורטים בקטע הזה.

שימוש בכלי שורת הפקודה ישירות

כדי לבדוק את ההתאמה של פלחי ELF באמצעות כלים ישירות בשורת הפקודה:

  1. מוודאים ש-Android SDK Build-Tools בגרסה 35.0.0 ואילך ו-Android NDK מותקנים באמצעות SDK Manager ב-Android Studio או באמצעות הכלי בשורת הפקודה sdkmanager.
  2. לחלץ את קובץ ה-APK של האפליקציה:

    Linux או macOS

    unzip APK_NAME.apk -d /tmp/my_apk_out
    

    Windows‏ (PowerShell)

    Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_out
    
  3. בספרייה הזמנית שאליה חילוץ את קובץ ה-APK, בודקים את התוכן של הספרייה lib כדי למצוא קבצים של אובייקטים משותפים (.so). אלה אותם קובצי אובייקטים משותפים שראיתם בזמן זיהוי ספריות מקומיות באמצעות APK Analyzer. מריצים את הפקודה הבאה בכל קובץ אובייקט משותף:

    Linux או macOS

    SDK_ROOT_LOCATION/Android/sdk/ndk/NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump -p SHARED_OBJECT_FILE.so | grep LOAD
    

    Windows‏ (PowerShell)

    SDK_ROOT_LOCATION\Android\sdk\ndk\NDK_VERSION\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-objdump.exe -p SHARED_OBJECT_FILE.so | Select-String -Pattern "LOAD"
    

    כאשר SDK_ROOT_LOCATION הוא הנתיב לספרייה שבה התקנתם את Android SDK, SHARED_OBJECT_FILE הוא שם קובץ האובייקט המשותף שאתם בודקים ו-NDK_VERSION הוא גרסת Android NDK שהותקנה (לדוגמה, 28.0.12433566). הפלט ייראה בערך כך לכל קובץ שתבדקו:

    LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**14
    LOAD off    0x0000000000042a90 vaddr 0x0000000000043a90 paddr 0x0000000000043a90 align 2**14
    LOAD off    0x0000000000046230 vaddr 0x0000000000048230 paddr 0x0000000000048230 align 2**14
    
  4. בודקים את שורות הפלט כדי לוודא שבקטעי העומס אין ערכים קטנים מ-2**14. אם יש קטעי עומס עם הערכים 2**13, 2**12 או ערכים נמוכים יותר, תצטרכו לעדכן את האריזה של הספריות האלה, ואז לערוך קומפילציה מחדש של האפליקציה ולבצע בדיקה חוזרת לפי השלבים שמפורטים בקטע הזה.

  5. בשלב הבא, מריצים את כלי שורת הפקודה zipalign בקובץ ה-APK של האפליקציה:

    Linux או macOS

    SDK_ROOT_LOCATION/Android/sdk/build-tools/35.0.0/zipalign -v -c -P 16 4 APK_NAME.apk
    

    Windows‏ (PowerShell)

    SDK_ROOT_LOCATION\Android\sdk\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 APK_NAME.apk
    

    כאשר SDK_ROOT_LOCATION הוא הנתיב לספרייה שבה התקנתם את Android SDK, ו-APK_NAME הוא שם קובץ ה-APK של האפליקציה. אם כל הספריות המשותפות מותאמות בצורה נכונה, בשורה האחרונה של הפלט יופיע הכיתוב 'Verification successful'.

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

פיתוח אפליקציה עם תמיכה במכשירים בנפח 16KB

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

  1. עדכון האריזה של הספריות המשותפות
  2. הדרכה ל-GCC: איך מקמפלים אפליקציות עם יישור ELF בגודל 16KB
  3. תיקון קוד ופתרון בעיות בסביבת זמן הריצה
  4. בדיקת ערכות SDK לתמיכה ב-16KB

עדכון האריזה של הספריות המשותפות

מומלץ לשדרג ל-AGP בגרסה 8.5.1 ואילך ולהשתמש בספריות משותפות לא דחוסות.

AGP מגרסה 8.5.1 ואילך

במכשירים עם 16KB, אפליקציות שכוללות ספריות משותפות לא דחוסות צריכות להתאים אותן לגבול של 16KB בפורמט zip. לשם כך, צריך לשדרג את Android Gradle Plugin‏ (AGP) לגרסה 8.5.1 ואילך. פרטים על תהליך השדרוג מופיעים בקטע Android Plugin Upgrade Assistant.

AGP מגרסה 8.5 ומטה

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

Groovy

מוסיפים את האפשרות הבאה לקובץ build.gradle:

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging true
      }
  }
}

Kotlin

מוסיפים את האפשרות הבאה לקובץ build.gradle.kts:

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging = true
      }
  }
}

איך מקמפלים את האפליקציה באמצעות התאמה של ELF בגודל 16KB

כדי שהאפליקציה תפעל במכשירים עם 16KB, צריך לבצע התאמה נכונה של קטעי ה-ELF בספריות המשותפות באמצעות התאמה של 16KB ELF.

למפתחי משחקים: אם המשחק שלכם פועל על מנוע המשחקים של Unity, תוכלו לעיין במדריך של Unity. אם המשחק שלכם פועל על גבי Unreal game engine, תוכלו לעיין במדריך של Unreal. למנועי משחקים מקומיים, ממשיכים במדריך הזה.

כדי לקמפל את האפליקציה באמצעות התאמה של ELF בגודל 16 KB, פועלים לפי השלבים שמפורטים באחד מהקטעים הבאים, בהתאם לגרסה של Android NDK שבה אתם משתמשים.

Android NDK r28 ואילך

ב-NDK מגרסה r28 ואילך, הידור מתבצע בהתאמה ל-16KB כברירת מחדל.

Android NDK r27

כדי לתמוך בתכנות של ספריות משותפות בגודל 16KB עם Android NDK בגרסה r27 ואילך, צריך לעדכן את הדגלים ndk-build,‏ build.gradle,‏ build.gradle.kts או את הדגלים של הקישור באופן הבא:

ndk-build

ב-Application.mk:

APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

Groovy

בקובץ 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")
      }
    }
  }
}

מערכות build אחרות

מציינים את הדגלים הבאים של הקישור:

-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")

תיקון קוד ופתרון בעיות בסביבת זמן הריצה

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

  1. מסירים יחסי תלות שמוגדרים בקוד ומפנים לקבוע PAGE_SIZE, או אירועים לוגיים בקוד שמניחים שגודל הדף של המכשיר הוא 4KB (4096).

    במקום זאת, צריך להשתמש ב-getpagesize() או ב-sysconf(_SC_PAGESIZE).

  2. מחפשים שימושים ב-mmap() ובממשקי API אחרים שדורשים ארגונו של ארגומנטים בהתאם לדף, ומחליפים אותם בחלופות במקרה הצורך.

במקרים מסוימים, אם באפליקציה נעשה שימוש ב-PAGE_SIZE כערך נוח שלא קשור לגודל הדף הבסיסי, הדבר לא יגרום לשגיאות באפליקציה כשמשתמשים בה במצב 16KB. עם זאת, אם הערך הזה מועבר לליבה עם mmap בלי MAP_FIXED, הליבה עדיין משתמשת בדף שלם, וכך מתבזבזת קצת זיכרון. לכן, הערך של PAGE_SIZE לא מוגדר כשמפעילים את המצב של 16KB ב-NDK בגרסה 27 ואילך.

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

בדיקת ערכות ה-SDK לתמיכה ב-16KB

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

בדיקת האפליקציה בסביבה של 16 KB

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

  1. מגדירים את Android 15 SDK.

  2. מגדירים אחת מסביבות הבדיקה הבאות:

  3. מפעילים את מכשיר הבדיקה ומריצים את הפקודה הבאה כדי לוודא שהוא משתמש בסביבה של 16 KB:

    adb shell getconf PAGE_SIZE
    

    הפקודה אמורה להחזיר את הערך 16384.

  4. מריצים את הפקודה הבאה zipalign כדי לוודא שהאפליקציה מותאמת ל-16KB, כאשר APK_NAME הוא השם של קובץ ה-APK של האפליקציה:

    zipalign -c -P 16 -v 4 APK_NAME.apk
    
  5. בודקים היטב את האפליקציה ומתמקדים באזורים שעשויים להיות מושפעים משינוי של מופעי קוד שמפנים לגדלים ספציפיים של דפים.

הגדרת Android Emulator באמצעות קובץ אימג' של מערכת Android 15 בגודל 16KB

כדי להגדיר סביבה של 16 KB באמצעות Android Emulator:

  1. קובצי אימג' של מערכת אמולטור של Android 15 בגודל 16KB תואמים ל-Android Studio Jellyfish | 2023.3.1 ואילך. עם זאת, כדי ליהנות מחוויית השימוש הטובה ביותר כשעובדים עם מכשירים בנפח 16KB, מומלץ להשתמש ב-Android Studio Ladybug | 2024.2.1 ואילך.

    אנחנו תמיד עובדים על תכונות חדשות, לכן מומלץ להוריד גרסאות חדשות יותר או את גרסת הבטא האחרונה של Android Studio כשהן זמינות.

    חשוב לזכור שאפשר להשאיר את הגרסה הקיימת של Android Studio מותקנת, כי אפשר להתקין כמה גרסאות במקביל.

  2. ב-Android Studio, לוחצים על Tools (כלים) > SDK Manager (מנהל SDK).

  3. בכרטיסייה SDK Platforms, מסמנים את התיבה Show Package Details, מרחיבים את הקטע Android VanillaIceCream ואילך ובוחרים אחת או את שתי קובצי האימג' של מערכת האמולטור הבאים, בהתאם למכשירים הווירטואליים שרוצים ליצור:

    • Google APIs Experimental 16 KB Page Size ARM 64 v8a System Image
    • Google APIs Experimental 16 KB Page Size Intel x86_64 Atom System Image

    הורדת קובצי אימג' של מערכת אמולטור בגודל 16KB באמצעות מנהל ה-SDK ב-Android Studio

  4. לוחצים על אישור > בסדר כדי להוריד את קובצי האימג' של המערכת שבחרתם.

  5. פועלים לפי השלבים להגדרת מכשיר וירטואלי ל-Android 15, וכשמופיעה בקשה לבחור קובץ אימג' של מערכת, בוחרים את קובץ האימג' בגודל 16KB שהורדתם. אם היא לא מומלצת באופן אוטומטי, תוכלו למצוא את קובץ האימג' של המערכת בגודל 16KB בכרטיסייה תמונות אחרות.

    מאתרים את קובץ האימג' של המהדר בגודל 16KB בכרטיסייה 'תמונות אחרות'.

שלבים נוספים לגרסאות מסוימות של מכונות וירטואליות ולתמונות מערכת

ב-Android Emulator בגרסאות 35.1.5 עד 35.1.20, ולפני גרסה 4 של קובצי האימג' של מערכת Android 15.0 עם דפים בגודל 16KB שמוצעים ב-SDK Manager, כדי לדמות סביבה של 16KB במערכות x86_64, צריך לבצע גם את השלבים הבאים. אין צורך לבצע את השלבים האלה אחרי גרסה 35.1.21, ובגרסה 4 ואילך של קובצי האימג' של מערכת Android 15.0 עם דפים בגודל 16KB.

  1. במנהל המכשירים, לוחצים על 3 הנקודות לצד התמונה בגודל 16KB ואז על הצגה בדיסק.
  2. בתיקייה הזו, מחפשים את הקובץ config.ini.
  3. מוסיפים את השורה הבאה לקובץ config.ini ושומרים את השינויים:

    kernel.parameters = androidboot.page_shift=14
    
  4. כדי לאמת את השינויים, מריצים את הפקודה הבאה, והיא אמורה להחזיר את הערך 16384:

    adb shell getconf PAGE_SIZE
    

הפעלת האמולטור

אחרי שמסיימים להגדיר את Android Emulator ואת המכשירים הווירטואליים, מפעילים את הסימולטור מתפריט המכשיר היעד או משורת הפקודה.

使用开发者选项在设备上启用 16 KB 模式

切换以 16KB 页面大小启动设备开发者选项,以便在 16 KB 模式下启动设备。

从 Android 15 QPR1 开始,您可以使用某些设备上提供的开发者选项,以 16 KB 模式启动设备并执行设备端测试。

此开发者选项适用于以下设备:

  • Pixel 8 和 Pixel 8 Pro(搭载 Android 15 QPR1 或更高版本)

    警告:由于 Android 15 QPR2 Beta 版 3 存在已知问题,在安装 Android 15 QPR2 Beta 版 3 并以 16 KB 模式启动设备后,Pixel 8 设备上的触摸屏无法正常使用。此问题不会影响 Pixel 8 Pro 设备。

  • Pixel 8a(搭载 Android 15 QPR1 或更高版本)

    警告:由于 Android 15 QPR2 Beta 版 3 存在已知问题,在安装 Android 15 QPR2 Beta 版 3 并以 16 KB 模式启动设备后,Pixel 8a 设备上的触摸屏无法正常使用。

  • Pixel 9、Pixel 9 Pro 和 Pixel 9 Pro XL(搭载 Android 15 QPR2 Beta 2 或更高版本)