ב-Android מגרסה 10 ואילך יש כמה רכיבי מדיה שניתנים לעדכון ומאפשרים לעדכן רכיבי framework דרך התשתית של חנות Google Play או באמצעות מנגנון אלחוטי (OTA). רכיבי המדיה נארזים יחד במודולים שמאפשרים לספק עדכוני אבטחה ועדכוני תכונות בלי צורך בעדכון מלא של קובץ האימג' של המערכת.
רכיבי המדיה שניתנים לעדכון קיימים במודולים הבאים.
Media המודול הזה כולל כלים לחילוץ מדיה, ממשקי API של
MediaSession2
וממשקי API שלMediaParser
.קודקי מדיה. המודול הזה כולל רכיבי Codec2 של תוכנת updatable.
MediaProvider. המודול הזה מבצע אופטימיזציה של מטא-נתונים שנוספו לאינדקס (אודיו, וידאו ותמונות מכרטיסי SD ומהתקני USB), ומאפשר לאפליקציות לגשת לנתונים האלה דרך MediaStore public API.
פרטים על הוספת חילוצים ומפענחים מותאמים אישית זמינים במאמר התאמה אישית של רכיבי מדיה.
כלי חילוץ מדיה
ב-Android 9 ובגרסאות מוקדמות יותר, כלי החילוץ מורכבים לקובץ libstagefright.so
אחד. ב-Android 10 ואילך, כלי חילוץ המדיה הם רכיבים נפרדים. לכל כלי חילוץ יש קובץ .so
משלו עם נקודת כניסה שמספקת פונקציית sniffer כדי לקבוע אם המחלץ יכול לטפל בקובץ המדיה הנתון, ופונקציית מפעל שיוצרת מכונה של כלי החילוץ בשביל קובץ המדיה הנתון. לכל מחלץ שם (כדי לעזור בניפוי באגים) יש גרסה וגרסה כדי לציין איזה מחלץ הוא החדש ביותר.
מסגרת המדיה טוענת באופן אוטומטי את כל קובצי .so
הזמינים לחילוץ, כך שתוכלו ליצור כלי חילוץ משלכם על ידי הוספת קובץ .so
חדש ללא צורך בשינוי של libstagefright
או בספריות מדיה אחרות. תוכלו גם לוודא שיש עדיפות לחילוץ מותאם אישית על פני כלי החילוץ ש-Google מספקת.
MediaSession2 API
ה-API של MediaSession2 מאפשר לאפליקציות מדיה לחשוף את אמצעי הבקרה להעברה שלהן ולהפעיל את המידע על תהליכים אחרים, כמו ה-framework של Android ואפליקציות אחרות. אי אפשר להתאים אישית את הרכיב הזה.
MediaParser API
ה-API של MediaParser מאפשר ל-ExoPlayer להשתמש ביעילות במנתחי קונטיינרים של מדיה של framework כדי לחלץ דגימות מדיה מקונטיינרים של מדיה. MediaParser כולל את השינויים הבאים בגבולות של קוד המקור:
frameworks/base/apex/media/framework/java/android/media/MediaParser.java
. API והטמעה של שכבה דקה.external/exoplayer/
. מקורות של Exoplayer שמהם MediaParser נוצר.
אי אפשר להתאים אישית את MediaParser API. כדי לבדוק את MediaParser, השתמשו בבדיקות של cts/tests/tests/mediaparser/
.
קודק מדיה
המודול של Media Codecs כולל רכיבי Codec2 של תוכנה שניתן לעדכן. התמיכה בהתאמה אישית משתנה בין הגרסאות:
ב-Android 11 ואילך (במיוחד ב-עדכון המערכת של Google Play v292100200), אפשר להתאים אישית את הפרמטרים להקצאת זיכרון ION (פרטים בהמשך).
ב-Android מגרסה 9 ומטה, אי אפשר לעדכן את ה-API של קודק OMX, אבל עדיין אפשר להשתמש בו במחיצת הספק.
הקצאת זיכרון ION
ב-Android מגרסה 11 ואילך ובעדכון מערכת של Google Play מגרסה 292100200 ואילך, אפשר להתאים אישית את הפרמטרים הבאים להקצאת זיכרון ION.
פרמטר | ערך ברירת מחדל | תיאור |
---|---|---|
heapMask |
0xFFFFFFFF |
כל סוגי הערימה (heap) מותרים. |
allocFlags |
0 |
לא הוגדרו פריטים לדיווח. |
minAlignment |
0 |
אין יישור. |
כדי לשנות את הפרמטרים:
רושמים שירות ברירת מחדל של
android.hardware.media.c2
ומספקים פרמטרים מותאמים אישית של שימוש ב-ION.כדי ליצור שירות חדש, מעתיקים את הקובץ frameworks/av/media/codec2/hidl/services/vendor.cpp למאגר, ואז משנים את
StoreImpl::Interface::SetIonUsage()
לפי הצורך.כדי לעשות שימוש חוזר בתהליך
media.codec
(OMX), מעתיקים ומרשמים את הכיתהStoreImpl
מ-frameworks/av/media/codec2/hidl/services/vendor.cpp לקובץmediacodec
הקיים (frameworks/av/services/mediacodec/main_codecservice.cpp).
צריך להוסיף את הקוד הבא למכשיר
manifest.xml
.<hal format="hidl"> <name>android.hardware.media.c2</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IComponentStore</name> <instance>default</instance> </interface> </hal>
פורמט ותלות
מודול המדיה (com.android.media
) ומודול Media Codec (com.android.media.swcodec
) הוא בפורמט APEX. רכיבי המדיה הכלולים מסתמכים רק על ממשקי API של NDK.
עדכונים
במהלך העדכון, רכיבי ה-framework במכשיר טוענים חבילת APEX שמכילה Java וקוד נייטיב.
איור 1. תהליך העדכון של רכיב המדיה
אחרי שהמסגרת מתקינה את חבילת APEX, המכשיר מופעל מחדש ומטעין את התמונה של הדיסק ואת תהליכי מערכת המדיה (media.extractor
ו-media.codec
) שמטעינים את המודולים המעודכנים מנקודת הטעינה.