מטמון APK

מסמך זה מתאר עיצוב של פתרון אחסון APK להתקנה מהירה של אפליקציות טעונות מראש במכשיר התומך במחיצות A/B.

יצרני OEM יכולים למקם טעינות מראש ואפליקציות פופולריות במטמון ה-APK המאוחסן במחיצת B הריקה ברובה במכשירים חדשים עם מחיצות A/B מבלי להשפיע על מרחב נתונים הפונה למשתמש. על ידי זיכרון מטמון APK זמין במכשיר, התקנים חדשים או לאחרונה איפוס להגדרות היצרן מוכנים לשימוש כמעט מיד, ללא צורך בהורדת קבצי APK מ-Google Play.

מקרי שימוש

  • אחסן אפליקציות שנטענו מראש במחיצת B להגדרה מהירה יותר
  • אחסן אפליקציות פופולריות במחיצת B לשיחזור מהיר יותר

דרישות מוקדמות

כדי להשתמש בתכונה זו, המכשיר צריך:

  • מהדורת אנדרואיד 8.1 (O MR1) מותקנת
  • מימוש מחיצת A/B

ניתן להעתיק תוכן שנטען מראש רק במהלך האתחול הראשון. הסיבה לכך היא שבמכשירים התומכים בעדכוני מערכת A/B, מחיצת B לא מאחסנת למעשה קבצי תמונת מערכת, אלא תוכן נטען מראש כמו משאבי הדגמה קמעונאיים, קבצי OAT ומטמון APK. לאחר העתקת המשאבים למחיצת /data (זה קורה באתחול הראשון), מחיצת B תשמש בעדכוני אויר (OTA) להורדת גרסאות מעודכנות של תמונת המערכת.

לכן, לא ניתן לעדכן את מטמון ה-APK דרך OTA; ניתן להטעין אותו מראש רק במפעל. איפוס להגדרות היצרן משפיע רק על מחיצת /data. למחיצת מערכת B עדיין יש את התוכן הנטען מראש עד שתמונת ה-OTA תוורד. לאחר איפוס היצרן, המערכת תעבור שוב אתחול ראשון. פירוש הדבר שאחסון ה-APK במטמון אינו זמין אם תמונת OTA יורדת למחיצת B, ואז המכשיר מאופס להגדרות היצרן.

יישום

גישה 1. תוכן במחיצת system_other

יתרונות : תוכן שנטען מראש לא הולך לאיבוד לאחר איפוס היצרן - הוא יועתק ממחיצת B לאחר אתחול מחדש.

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

על מנת שהטעינות מראש יועתקו במהלך האתחול הראשון, המערכת קוראת לסקריפט ב- /system/bin/preloads_copy.sh . הסקריפט נקרא עם ארגומנט בודד (נתיב לנקודת הטעינה לקריאה בלבד עבור מחיצת system_b ):

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

  1. הוסף את הסקריפט שעושה את ההעתקה לקובץ device-common.mk (במקרה זה, device/google/marlin/device-common.mk ), כך:
    # Script that copies preloads directory from system_other to data partition
    PRODUCT_COPY_FILES += \
        device/google/marlin/preloads_copy.sh:system/bin/preloads_copy.sh
    
    מצא מקור סקריפט לדוגמה בכתובת: device/google/marlin /preloads_copy.sh
  2. ערוך את הקובץ init.common.rc כדי שייצור את ספריית /data/preloads וספריות המשנה הנדרשות:
    mkdir /data/preloads 0775 system system
    mkdir /data/preloads/media 0775 system system
    mkdir /data/preloads/demo 0775 system system
    
    מצא מקור קובץ init לדוגמה בכתובת: device/google/marlin/init.common.rc
  3. הגדר דומיין SELinux חדש בקובץ preloads_copy.te :
    type preloads_copy, domain, coredomain;
    type preloads_copy_exec, exec_type, vendor_file_type, file_type;
    
    init_daemon_domain(preloads_copy)
    
    allow preloads_copy shell_exec:file rx_file_perms;
    allow preloads_copy toolbox_exec:file rx_file_perms;
    allow preloads_copy preloads_data_file:dir create_dir_perms;
    allow preloads_copy preloads_data_file:file create_file_perms;
    allow preloads_copy preloads_media_file:dir create_dir_perms;
    allow preloads_copy preloads_media_file:file create_file_perms;
    
    # Allow to copy from /postinstall
    allow preloads_copy system_file:dir r_dir_perms;
    
    מצא קובץ דומיין SELinux לדוגמה בכתובת: /device/google/marlin/+/main/sepolicy/preloads_copy.te
  4. רשום את הדומיין בחדש /sepolicy/file_contexts file:
    /system/bin/preloads_copy\.sh     u:object_r:preloads_copy_exec:s0
    
    מצא דוגמה לקובץ הקשרים של SELinux בכתובת: device/google/marlin/sepolicy/preloads_copy.te
  5. בזמן הבנייה, יש להעתיק את הספרייה עם תוכן שנטען מראש למחיצת system_other :
    # Copy contents of preloads directory to system_other partition
    PRODUCT_COPY_FILES += \
        $(call find-copy-subdir-files,*,vendor/google_devices/marlin/preloads,system_other/preloads)
    
    זוהי דוגמה לשינוי ב-Makefile המאפשר העתקת משאבי מטמון APK ממאגר Git של הספק (במקרה שלנו זה היה vendor/google_devices/ marlin/preloads) למיקום במחיצת system_other שתועתק מאוחר יותר ל-/data/preloads כאשר המכשיר יופעל בפעם הראשונה. סקריפט זה פועל בזמן הבנייה כדי להכין תמונת system_other. הוא מצפה שתוכן נטען מראש יהיה זמין בספק/google_devices/marlin/preloads. OEM חופשי לבחור את שם/הנתיב האמיתי של המאגר.
  6. מטמון ה-APK ממוקם ב- /data/preloads/file_cache ובעל הפריסה הבאה:
    /data/preloads/file_cache/
        app.package.name.1/
              file1
              fileN
        app.package.name.N/
    
    זהו מבנה הספריות הסופי במכשירים. יצרני OEM חופשיים לבחור כל גישת יישום כל עוד מבנה הקובץ הסופי משכפל את זה שתואר לעיל.

גישה 2. תוכן על תמונת נתוני משתמש הבהב במפעל

גישה חלופית זו מניחה שתוכן שנטען מראש כבר כלול בספריית /data/preloads במחיצת /data .

יתרונות : עובד מחוץ לקופסה - אין צורך לבצע התאמות מכשיר להעתקת קבצים באתחול הראשון. התוכן כבר נמצא במחיצת /data .

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

שיטת @SystemApi חדשה, getPreloadsFileCache() , נוספה ל- android.content.Context . הוא מחזיר נתיב מוחלט לספרייה ספציפית ליישום במטמון הנטען מראש.

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

הכנת אפליקציה

רק יישומים מורשים יכולים לגשת לספריית המטמון הטעינה מראש. עבור גישה זו, יש להתקין אפליקציות בספריית /system/priv-app .

מַתַן תוֹקֵף

  • לאחר האתחול הראשון, למכשיר אמור להיות תוכן בספריית /data/preloads/file_cache .
  • יש למחוק את התוכן בספריית file_cache/ אם נפח האחסון במכשיר נמוך.

השתמש באפליקציית ApkCacheTest לדוגמה לבדיקת מטמון APK.

  1. בנה את האפליקציה על ידי הפעלת הפקודה הזו מספריית הבסיס:
    make ApkCacheTest
    
  2. התקן את האפליקציה כאפליקציה מועדפת. (זכור, רק אפליקציות מורשות יכולות לגשת למטמון ה-APK.) זה דורש מכשיר שורשי:
    adb root && adb remount
    adb shell mkdir /system/priv-app/ApkCacheTest
    adb push $ANDROID_PRODUCT_OUT/data/app/ApkCacheTest/ApkCacheTest.apk /system/priv-app/ApkCacheTest/
    adb shell stop && adb shell start
    
  3. הדמיית את ספריית המטמון של הקבצים ואת תוכנו במידת הצורך (דורשת גם הרשאות בסיס):
    adb shell mkdir -p /data/preloads/file_cache/com.android.apkcachetest
    adb shell restorecon -r /data/preloads
    adb shell "echo "Test File" > /data/preloads/file_cache/com.android.apkcachetest/test.txt"
    
  4. בדוק את האפליקציה. לאחר התקנת האפליקציה ויצירת ספריית test file_cache , פתח את אפליקציית ApkCacheTest. זה אמור להראות קובץ אחד test.txt ואת תוכנו. ראה צילום מסך זה כדי לראות כיצד תוצאות אלו מופיעות בממשק המשתמש.

    איור 1. תוצאות ApkCacheTest