מודול MediaProvider

מודול MediaProvider מבצע אופטימיזציה של מטא-נתונים שנוספו לאינדקס (אודיו, וידאו ותמונות מכרטיסי SD והתקני USB), והופך את הנתונים לזמינים לאפליקציות באמצעות ממשקי ה-API הציבוריים של MediaStore. כדי לשמור על פרטיות המשתמשים, המודול של MediaProvider אוכף את מודל האבטחה של אחסון בהיקף שהושק ב-Android 10, כולל צנזור מטא-נתונים רגישים של המיקום. ניתן לעדכן את המודול הזה כדי לאפשר ל-Android להגיב מהר יותר לבעיות אבטחה (שמירה על הגנה על נתוני משתמש רגישים) ולהוסיף פורמטים חדשים של מדיה מהר יותר (כדי לשמור על עקביות גם למשתמשים וגם למפתחים).

שינויים ב-Android 10

ב-Android 10 נוספו כמה שיפורים שקשורים לזיהוי ולחילוץ נתונים מקובצי מדיה, באופן ספציפי:

  • קביעת סוג התוכן של הקובץ באמצעות החלק הראשון של סוג MIME של הקובץ. לדוגמה, מערכת ההפעלה יודעת שגם image/png וגם image/x-newly-invented-format הם תמונות, ולכן היא יכולה לתאר במדויק את ההרשאות הרלוונטיות למשתמש הקצה.

  • קובעים את סוג ה-MIME רק באמצעות סיומת הקובץ (ובלי להשתמש בהסתת תוכן (sniffing) כדי למנוע בעיות אבטחה).

  • קביעת סוג ה-MIME של קובץ שרירותי באמצעות שילוב של מיפויי upstream Debian Linux ו-Android.

  • החזרת נתונים רלוונטיים מקובצי video/* ו-audio/* (דרך MediaMetadataRetriever) ומ-image/* קבצים (באמצעות ExifInterface).

שינויים ב-Android 11

ב-Android 11, המודול של MediaProvider מתבסס על השינויים שבוצעו ב-Android 10 וכולל את השיפורים הבאים:

  • שיפורים בהוספה לאינדקס. עכשיו המודול של MediaProvider מוסיף מטא-נתונים לאינדקס על ידי התאמה של המטא-נתונים הזמינים לממשקי ה-API הציבוריים של MediaStore. השינויים כוללים:

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

    • מטא-נתונים של מרחב צבעים באינדקס.

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

    • ממשקי API חדשים שמאפשרים שינוי בכמות גדולה של פריטים מרובים באמצעות בקשה לדו-שיח עם משתמש יחיד, כולל createDeleteRequest(), createFavoriteRequest(), createTrashRequest() ו-createWriteRequest().

    • עמודות GENERATION_ADDED ו-GENERATION_MODIFIED חדשות לשימוש לזיהוי מהיר ואמין של שינויים שהתרחשו מאז נקודת הסנכרון הקודמת.

    • API ציבורי חדש מסוג GROUP BY לשימוש עם עמודות מטא-נתונים נוספות שלא הוזכרו למעלה.

  • שיפור ב-ExifInterface לחילוץ מטא-נתונים מקונטיינרים של PNG ו-WebP.

  • שיפורים ב-SystemUI לכתיבת מטא-נתונים של DateTimeOriginal בצילומי מסך.

בנוסף, עכשיו אפשר להתאים אישית את MediaProvider על ידי הוספת פורמטים חדשים של מדיה, סימון התקני אחסון שרוצים להוסיף לאינדקס ואפילו להחליף את מקבץ ה-MTP. מידע נוסף מופיע בקטע התאמה אישית.

גבולות המודול

מערכת Android 11 מעבירה את כל הקוד שב-packages/providers/MediaProvider למיקום חדש, חוץ מהלוגיקה שקשורה ל-MTP. בנוסף, frameworks/base/core/java/android/provider/MediaStore.java נמצא עכשיו בתוך גבולות המודול ב-packages/providers/MediaProvider.

פורמט החבילה

מודול MediaProvider הוא בפורמט APK-in-APEX.

יחסי תלות

יחסי התלות של MediaProvider קשורים להתאמות אישיות (כלומר, אם מתאימים אישית את MediaProvider, צריך לוודא שההטמעה עומדת בתלות שמשויכת להתאמה אישית).

  • כשמשתמשים בפורמטים מותאמים אישית או לא סטנדרטיים של קובצי מדיה (למשל, פורמט שנוצר על ידי אפליקציית מצלמה ספציפית לספק), צריך לרשום כל אחד מהפורמטים המותאמים אישית ב-MimeUtils ובמודול Media חלץ כדי לאפשר הוספה לאינדקס על ידי MediaProvider.

  • כדי להבטיח ש-MediaProvider יוסיף לאינדקס קבוצה מותאמת אישית של מכשירי אחסון (כמו חריצים לכרטיס SD ויציאות USB) שנעשה בהם שימוש בהטמעה של StorageManagerService, מגדירים את הדגל VolumeInfo.MOUNT_FLAG_INDEXABLE.

  • כשמשתמשים בהטמעת MTP בהתאמה אישית (לא AOSP), חשוב לוודא שההטמעה מסתמכת רק על ממשקי API ציבוריים והמערכת כדי לאפשר ליישום אינטראקציה עם MediaStore.

התאמה אישית

עכשיו אפשר להוסיף פורמטים חדשים של מדיה, להשפיע על מכשירי האחסון שיתווספו לאינדקס ולהחליף את סטאק ה-MTP.

  • פורמטים מותאמים אישית של מדיה. לכל פורמט מדיה מותאם אישית חדש, צריך לספק מיפוי מסיומת הקובץ הייחודית לסוג MIME. מומלץ מאוד לפעול לפי תהליך הרישום של IANA.

    • אי אפשר להגדיר מחדש תוסף או סוג MIME שכבר מוגדרים ב-AOSP.

    • לגבי קבצים מסוג video/* ו-audio/*, MediaProvider ממשיך להתייעץ עם MediaMetadataRetriever. אפשר להשתמש בכלי החילוץ של מדיה ב-Android 10 כדי להחזיר מטא-נתונים של פורמטים מותאמים אישית.

    • בקובצי image/*, MediaProvider ממשיך לבצע סטנדרטיזציה של Exif למטא-נתונים. אפשר להרחיב את android.media.ExifInterface כדי לחלץ ולהחזיר את המטא-נתונים Exif לכל פורמט תמונה מותאם אישית.

  • סימון הוספה לאינדקס של מכשירי אחסון. MediaProvider יוצר אינדקס לכל נפחי האחסון שהוחזרו על ידי StorageManager.getStorageVolumes(), כאשר StorageVolume.getMediaStoreVolumeName() הוא לא null. אפשר להתאים אישית את רשימת הנפחים שהוחזרו כדי להשפיע על התוכן שנוסף לאינדקס, אבל לא מומלץ לכלול נפחי אחסון זמניים (כמו כונני USB מסוג OTG).

  • החלפת סטאק MTP. מערכת Android 11 מציבה את מקבץ ה-MTP לגמרי מחוץ לגבולות המודול, ומבטיחה שהוא יפעל מול ממשקי API ציבוריים.

בדיקה

אפשר לאמת את הפונקציונליות של MediaProvider באמצעות הבדיקות הבאות:

  • כדי לאמת את הפונקציונליות של ממשקי ה-API הציבוריים של MediaStore, השתמשו בבדיקות שבחבילה CtsProviderTestCases של Android Compliance Test Suite (CTS).

  • כדי לאמת את הפונקציונליות של MediaProvider Internals, משתמשים בבדיקות ב-MediaProviderTests.

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

atest --test-mapping packages/providers/MediaProvider