ב-Android 9 (רמת API 28) הוספנו תכונות ויכולות חדשות ושימושיות למשתמשים ולמפתחים. במסמך הזה מפורטות התכונות החדשות למפתחים.
כדי לקרוא על ממשקי ה-API החדשים, אפשר לעיין בדוח ההבדלים בין ממשקי ה-API או להיכנס להפניה ל-Android API. כדאי גם לעיין במאמר שינויים בהתנהגות ב-Android 9 כדי לקבל מידע על תחומים שבהם שינויים בפלטפורמה עשויים להשפיע על האפליקציות שלכם.
מיקום בתוך מבנה באמצעות Wi-Fi RTT

ב-Android 9 נוספה תמיכה בפלטפורמה בפרוטוקול Wi-Fi IEEE 802.11-2016 – שנקרא גם Wi-Fi Round-Trip-Time (RTT) – כדי שתוכלו ליהנות ממיקום בתוך מבנים באפליקציות שלכם.
במכשירים עם Android 9 שכוללים תמיכה בחומרה, האפליקציות יכולות להשתמש ב-RTT APIs כדי למדוד את המרחק מנקודות גישה (APs) ל-Wi-Fi בקרבת מקום שתומכות ב-RTT. במכשיר צריך להפעיל את שירותי המיקום ואת סריקת ה-Wi-Fi (בקטע הגדרות > מיקום), ובאפליקציה צריכה להיות ההרשאה ACCESS_FINE_LOCATION
. כדי להשתמש ב-RTT, המכשיר לא צריך להתחבר לנקודות הגישה.
כדי לשמור על הפרטיות, רק הטלפון יכול לקבוע את המרחק מנקודת הגישה. נקודות הגישה לא מקבלות את המידע הזה.
אם המכשיר שלכם מודד את המרחק ל-3 נקודות גישה או יותר, אתם יכולים להשתמש באלגוריתם מולטילטרציה כדי להעריך את מיקום המכשיר שמתאים הכי טוב למדידות האלה. בדרך כלל התוצאה מדויקת בטווח של מטר עד שני מטרים.
הדיוק הזה מאפשר לכם ליצור חוויות חדשות, כמו ניווט בתוך בניין ושירותים מבוססי-מיקום ברמת דיוק גבוהה, למשל שליטה קולית ללא דו-משמעות (לדוגמה, "הפעל את האור הזה") ומידע מבוסס-מיקום (לדוגמה, "יש מבצעים מיוחדים על המוצר הזה?").
אפשר לראות את השימוש ב-WiFi RTT API באפליקציית ההדגמה Android WifiRttScan.
מידע נוסף זמין במאמר מיקום באמצעות Wi-Fi: מדידת מרחק באמצעות RTT.
תמיכה במגרעת במסך

בדיקת מגרעת במסך באמצעות אמולטור
Android 9 מציע תמיכה במסכים העדכניים ביותר מקצה לקצה, שכוללים חיתוכי תצוגה למצלמות ולרמקולים. המחלקות
DisplayCutout
מאפשרות לכם לגלות את המיקום והצורה של האזורים הלא פונקציונליים שבהם התוכן לא אמור להיות מוצג. כדי לקבוע את קיומם של אזורי החיתוך האלה ואת המיקום שלהם, משתמשים ב-method getDisplayCutout()
.
מאפיין חדש של פריסת חלון, layoutInDisplayCutoutMode
, מאפשר לאפליקציה לפרוס את התוכן שלה סביב החלקים החסרים במסך של המכשיר. אפשר להגדיר במאפיין הזה את אחד מהערכים הבאים:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
אפשר לדמות חיתוך מסך בכל מכשיר או אמולטור עם Android 9 באופן הבא:
- מפעילים את האפשרויות למפתחים.
- במסך אפשרויות למפתחים, גוללים למטה לקטע ציור ובוחרים באפשרות הדמיה של מסך עם מגרעת.
- בוחרים את גודל החיתוך.
התראות
ב-Android 9 נוספו כמה שיפורים להתראות, וכולם זמינים למפתחים שמטרגטים API ברמה 28 ומעלה.

MessagingStyle עם תמונה מצורפת.

MessagingStyle עם תשובות ושיחה.
דוגמאות לקוד שמשתמש בהתראות, כולל תכונות של Android 9, אפשר למצוא בדוגמה של People.
חוויה משופרת של העברת הודעות
החל מ-Android 7.0 (רמת API 24), אפשר להוסיף פעולה כדי להשיב להודעות או להזין טקסט אחר ישירות מההתראה. ב-Android 9, התכונה הזו משופרת באמצעות השיפורים הבאים:
תמיכה פשוטה יותר במשתתפים בשיחה: המחלקה
Person
משמשת לזיהוי אנשים שמעורבים בשיחה, כולל האווטרים וה-URI שלהם. הרבה ממשקי API אחרים, כמוaddMessage()
, מסתמכים עכשיו על המחלקהPerson
במקום עלCharSequence
. המחלקותPerson
תומכות גם בתבנית העיצוב Builder.תמיכה בתמונות: ב-Android 9 מוצגות עכשיו תמונות בהתראות על הודעות בטלפונים. אפשר להשתמש ב-
setData()
בהודעה כדי להציג תמונה. בקטע הקוד הבא מוצגות דוגמאות ליצירתPerson
ולהודעה שמכילה תמונה.
Kotlin
// Create new Person. val sender = Person() .setName(name) .setUri(uri) .setIcon(null) .build() // Create image message. val message = Message("Picture", time, sender) .setData("image/", imageUri) val style = Notification.MessagingStyle(getUser()) .addMessage("Check this out!", 0, sender) .addMessage(message)
Java
// Create new Person. Person sender = new Person() .setName(name) .setUri(uri) .setIcon(null) .build(); // Create image message. Message message = new Message("Picture", time, sender) .setData("image/", imageUri); Notification.MessagingStyle style = new Notification.MessagingStyle(getUser()) .addMessage("Check this out!", 0, sender) .addMessage(message);
שמירת תשובות כטיוטות: האפליקציה יכולה לאחזר את הנתונים של
EXTRA_REMOTE_INPUT_DRAFT
שנשלחו על ידי המערכת כשמשתמש סוגר בטעות התראה על הודעה. אתם יכולים להשתמש בתוספת הזו כדי לאכלס מראש שדות טקסט באפליקציה, כך שהמשתמשים יוכלו לסיים את התשובה שלהם.לזהות אם שיחה היא שיחה קבוצתית: אפשר להשתמש ב-
setGroupConversation()
כדי לזהות שיחה כשיחה קבוצתית או לא קבוצתית.הגדרת פעולה סמנטית לכוונת משתמש: השיטה
setSemanticAction()
מאפשרת לתת משמעות סמנטית לפעולה, כמו 'סימון ש'כבר קראתי'', 'מחיקה', 'תגובה' וכו'.תשובות חכמות: מערכת Android 9 תומכת באותן תשובות מוצעות שזמינות באפליקציית ההודעות שלכם. אפשר להשתמש ב-
RemoteInput.setChoices()
כדי לספק למשתמש מערך של תשובות סטנדרטיות.
הגדרות הערוץ, שידורים והמצב 'נא לא להפריע'
ב-Android 8.0 הוצגו ערוצי התראות, שמאפשרים ליצור ערוץ שניתן להתאמה אישית על ידי המשתמש לכל סוג של התראה שרוצים להציג. ב-Android 9, הגדרות ערוצי ההתראות פשוטות יותר, עם השינויים הבאים:
חסימת קבוצות של ערוצים: המשתמשים יכולים עכשיו לחסום קבוצות שלמות של ערוצים בהגדרות ההתראות של האפליקציה. אפשר להשתמש בשיטה
isBlocked()
כדי לזהות מתי קבוצה נחסמת, וכתוצאה מכך לא לשלוח התראות לגבי ערוצים בקבוצה הזו.בנוסף, האפליקציה יכולה לשלוח שאילתה לגבי ההגדרות הנוכחיות של קבוצת הערוצים באמצעות השיטה החדשה
getNotificationChannelGroup()
.סוגים חדשים של כוונות שידור: מערכת Android שולחת עכשיו כוונות שידור כשמצב החסימה של ערוצי התראות וקבוצות ערוצים משתנה. האפליקציה שבבעלותה הערוץ או הקבוצה החסומים יכולה להאזין לכוונות האלה ולהגיב בהתאם. מידע נוסף על פעולות ועל תוספים של כוונות זמין ברשימת הקבועים המעודכנת במאמר בנושא
NotificationManager
. מידע על תגובה ל-broadcast intents זמין במאמר בנושא שידורים.
NotificationManager.Policy
יש שלוש קטגוריות חדשות של עדיפות למצב 'נא לא להפריע':PRIORITY_CATEGORY_ALARMS
נותנת עדיפות לשעונים מעוררים.PRIORITY_CATEGORY_MEDIA
נותנת עדיפות לצלילים ממקורות מדיה, כמו מדיה וניווט קולי.PRIORITY_CATEGORY_SYSTEM
נותנת עדיפות לצלילי המערכת.
ב-
NotificationManager.Policy
יש גם שבעה קבועים חדשים של 'נא לא להפריע' שאפשר להשתמש בהם כדי למנוע הפרעות חזותיות:-
SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
מונעת את הפעלת ההתראה כפעילות במסך מלא. -
SUPPRESSED_EFFECT_LIGHTS
חוסם את נוריות ההתראה. SUPPRESSED_EFFECT_PEEK
מונעת את ההצגה של ההתראות בחלק העליון של המסך (הצצה).-
SUPPRESSED_EFFECT_STATUS_BAR
מונעת את הצגת ההתראות בשורת הסטטוס במכשירים שתומכים בשורות סטטוס. -
SUPPRESSED_EFFECT_BADGE
חוסם תגים במכשירים שתומכים בתיוג. מידע נוסף זמין במאמר בנושא שינוי תג התראה. SUPPRESSED_EFFECT_AMBIENT
חוסמת התראות במכשירים שתומכים בתצוגת אווירה.SUPPRESSED_EFFECT_NOTIFICATION_LIST
מונעת את הצגת ההתראות בתצוגת הרשימה במכשירים שתומכים בתצוגת רשימה, כמו תריס ההתראות או מסך הנעילה.
-
תמיכה במספר מצלמות ועדכונים למצלמה
במכשירים עם Android מגרסה 9, אפשר לגשת לסטרימינג בו-זמנית משתי מצלמות פיזיות או יותר. במכשירים עם שתי מצלמות קדמיות או שתי מצלמות אחוריות, אפשר ליצור תכונות חדשניות שלא ניתן ליצור עם מצלמה אחת בלבד, כמו זום חלק, אפקט בוקה וראייה סטריאו. ה-API מאפשר גם להפעיל שידור ממצלמה לוגית או ממצלמה משולבת, שמעבירה את השידור באופן אוטומטי בין שתי מצלמות או יותר.
שיפורים נוספים במצלמה כוללים פרמטרים נוספים של סשן שעוזרים לצמצם את העיכובים במהלך הצילום הראשוני, ושיתוף של משטח שמאפשר ללקוחות המצלמה לטפל בתרחישי שימוש שונים בלי צורך להפסיק ולהתחיל את הסטרימינג של המצלמה. הוספנו גם ממשקי API לתמיכה בפלאש מבוסס-תצוגה וגישה לחותמות זמן של OIS לייצוב תמונה ואפקטים מיוחדים ברמת האפליקציה.
ב-Android 9, multi-camera API תומך במצלמות שחור-לבן במכשירים עם יכולת FULL
או LIMITED
.
כדי לקבל פלט בשחור-לבן, צריך להשתמש בפורמט YUV_420_888
עם Y כגווני אפור, U (Cb) כ-128 ו-V (Cr) כ-128.
ב-Android 9 יש גם תמיכה במצלמות חיצוניות מסוג USB/UVC במכשירים נתמכים.
ImageDecoder לציורים ולמפות ביטמפ
ב-Android 9 הוצג המחלקה ImageDecoder
, שמספקת גישה מודרנית לפענוח תמונות. במקום זאת, משתמשים במחלקה הזו במקום בממשקי ה-API BitmapFactory
ו-BitmapFactory.Options
.
ImageDecoder
מאפשר ליצור Drawable
או Bitmap
ממאגר נתונים זמני של בייטים, מקובץ או מ-URI. כדי לפענח תמונה, קודם קוראים ל-createSource()
עם המקור של התמונה המקודדת. לאחר מכן, קוראים ל-decodeDrawable()
או ל-decodeBitmap()
על ידי העברת האובייקט ImageDecoder.Source
כדי ליצור Drawable
או Bitmap
. כדי לשנות את הגדרות ברירת המחדל, מעבירים את OnHeaderDecodedListener
אל decodeDrawable()
או אל decodeBitmap()
. ImageDecoder
calls
onHeaderDecoded()
with the image's default width and height, once they are known.
אם התמונה המקודדת היא GIF או WebP עם אנימציה, הפונקציה decodeDrawable()
מחזירה Drawable
שהוא מופע של המחלקה AnimatedImageDrawable
.
יש שיטות שונות להגדרת מאפייני התמונה:
- כדי לשנות את הגודל של התמונה המפוענחת לגודל מדויק, מעבירים את מידות היעד אל
setTargetSize()
. אפשר גם לשנות את גודל התמונות באמצעות גודל דגימה. מעבירים את גודל המדגם ישירות אלsetTargetSampleSize()
. - כדי לחתוך תמונה בטווח של התמונה המוקטנת, קוראים ל-
setCrop()
. - כדי ליצור מפת סיביות שניתן לשנות, מעבירים את
true
אלsetMutableRequired()
.
ImageDecoder
מאפשר גם להוסיף לתמונה אפקטים מותאמים אישית ומורכבים, כמו פינות מעוגלות או מסכות עגולות. משתמשים בפקודה setPostProcessor()
עם מופע של המחלקה PostProcessor
כדי להפעיל את פקודות הציור הרצויות.
אנימציה
ב-Android 9 הוצג המחלקה
AnimatedImageDrawable
לציור ולהצגה של תמונות מונפשות בפורמטים GIF ו-WebP.
האנימציות של AnimatedImageDrawable
מונעות על ידי השרשור של הרינדור, בדומה ל-AnimatedVectorDrawable
.AnimatedImageDrawable
שרשור העיבוד משתמש גם בשרשור עובד כדי לפענח, כך שהפענוח לא יפריע לפעולות אחרות בשרשור העיבוד. ההטמעה הזו מאפשרת לאפליקציה להציג תמונה מונפשת בלי לנהל את העדכונים שלה או להפריע לאירועים אחרים בשרשור של ממשק המשתמש של האפליקציה.
אפשר לפענח AnimatedImageDrawable
באמצעות מופע של ImageDecoder
. קטע הקוד הבא מראה איך להשתמש ב-ImageDecoder
כדי לפענח את AnimatedImageDrawable
:
Kotlin
@Throws(IOException::class) private fun decodeImage() { val decodedAnimation = ImageDecoder.decodeDrawable( ImageDecoder.createSource(resources, R.drawable.my_drawable)) // Prior to start(), the first frame is displayed. (decodedAnimation as? AnimatedImageDrawable)?.start() }
Java
private void decodeImage() throws IOException { Drawable decodedAnimation = ImageDecoder.decodeDrawable( ImageDecoder.createSource(getResources(), R.drawable.my_drawable)); if (decodedAnimation instanceof AnimatedImageDrawable) { // Prior to start(), the first frame is displayed. ((AnimatedImageDrawable) decodedAnimation).start(); } }
ImageDecoder
יש כמה שיטות שמאפשרות לשנות את התמונה.
לדוגמה, אפשר להשתמש בשיטה setPostProcessor()
כדי לשנות את המראה של התמונה, כמו החלת מסכת עיגול או פינות מעוגלות.
סרטון HDR VP9, דחיסת תמונות HEIF וממשקי API של מדיה
Android 9 מספק תמיכה מובנית ב-VP9 Profile 2 בטווח דינמי גבוה (HDR), כך שאתם יכולים לספק למשתמשים סרטים עם HDR מ-YouTube, מ-Play Movies וממקורות אחרים במכשירים שתומכים ב-HDR.
ב-Android 9 נוספה גם תמיכה בקידוד תמונות באמצעות פורמט קובץ התמונה היעיל (HEIF או HEIC), שמשפר את הדחיסה ומצמצם את השימוש במקום אחסון ובנתוני הרשת. יש תמיכה בדוגמאות של תמונות סטילס בפורמט HEIF במחלקות MediaMuxer
ו-MediaExtractor
. התמיכה בפלטפורמה במכשירי Android 9 מאפשרת לשלוח תמונות HEIF משרת הקצה העורפי ולהשתמש בהן בקלות. אחרי שמוודאים שהאפליקציה תואמת לפורמט הנתונים הזה לשיתוף ולהצגה, אפשר לנסות להשתמש ב-HEIF כפורמט לאחסון תמונות באפליקציה. אפשר לבצע המרה מ-JPEG ל-HEIC באמצעות ImageDecoder
או BitmapFactory
(שמקבל מפת סיביות מקובץ JPEG). אחר כך אפשר להשתמש ב-HeifWriter
כדי לכתוב תמונות סטילס בפורמט HEIF ממאגרי בייטים של YUV, או ממופעים של Surface
או של Bitmap
.
מדדי המדיה זמינים גם במחלקות AudioTrack
, AudioRecord
ו-MediaDrm
.
ב-Android 9 נוספו שיטות למחלקה MediaDRM
כדי לקבל מדדים, רמות HDCP, רמות אבטחה ומספר סשנים, וכדי להוסיף שליטה נוספת ברמות האבטחה ובעצירות מאובטחות. פרטים נוספים זמינים בדוח API Diff.
ב-Android 9, AAudio API מוסיף תמיכה בכמה מאפיינים נוספים של AAudioStream, כולל שימוש, סוג תוכן והגדרות קבועות מראש של קלט. באמצעות המאפיינים האלה, אפשר ליצור סטרימינג שמותאם לאפליקציות של VoIP או מצלמות וידאו. אפשר גם להגדיר את מזהה הסשן כדי לשייך מקור AAudio לנתונים של מיקס משני שיכול לכלול אפקטים. משתמשים ב-API AudioEffect
כדי לשלוט באפקטים.
ב-Android מגרסה 9 מוצג AudioEffect
API לעיבוד דינמי.
באמצעות המחלקה הזו, אפשר ליצור אפקטים של אודיו מבוססי-ערוץ – כולל איזון, דחיסה רב-פסית ומגביל – בכמה שלבים. אפשר להגדיר את מספר הפסים והשלבים הפעילים, ואפשר לשלוט ברוב הפרמטרים בזמן אמת.
רגישות לעלויות נתונים ב-JobScheduler
החל מ-Android 9, JobScheduler
יכול להשתמש באותות של סטטוס הרשת שסופקו על ידי ספקי הסלולר כדי לשפר את הטיפול במשימות שקשורות לרשת.
משימות יכולות להצהיר על גודל הנתונים המשוער שלהן, לסמן אחזור מראש ולציין דרישות מפורטות של הרשת. JobScheduler
מנהל את העבודה בהתאם לסטטוס הרשת. לדוגמה, כשהאותות מהרשת מצביעים על עומס, יכול להיות ש-JobScheduler
ידחה בקשות גדולות מהרשת. כשמשתמשים ברשת ללא הגבלת נפח, JobScheduler
יכול להריץ משימות של אחזור מראש כדי לשפר את חוויית המשתמש, למשל על ידי אחזור מראש של כותרות.
כשמוסיפים משימות, חשוב להשתמש ב-setEstimatedNetworkBytes()
, setPrefetch()
ו-setRequiredNetwork()
כשמתאים, כדי לעזור ל-JobScheduler
לטפל בעבודה בצורה נכונה. כשמריצים את העבודה, חשוב להשתמש באובייקט Network
שמוחזר על ידי JobParameters.getNetwork()
.
אחרת, תשתמשו ברשת ברירת המחדל של המכשיר, שלא בהכרח תעמוד בדרישות שלכם, וייגרם שימוש לא מכוון בנתונים.
Neural Networks API 1.1
Neural Networks API (ממשק API של רשתות עצביות) הוצג ב-Android 8.1 (API ברמה 27) כדי להאיץ את למידת המכונה במכשיר ב-Android. ב-Android 9, ממשק ה-API הורחב ושופר, והתווספה לו תמיכה בתשע פעולות חדשות:
- פעולות מתמטיות ברמת הרכיב:
- פעולות על מערכים:
בעיה ידועה: כשמעבירים טנסורים של ANEURALNETWORKS_TENSOR_QUANT8_ASYMM
לפעולה ANEURALNETWORKS_PAD
, שזמינה ב-Android 9 ואילך, יכול להיות שהפלט מ-NNAPI לא יהיה זהה לפלט ממסגרות למידת מכונה ברמה גבוהה יותר, כמו TensorFlow Lite. במקום זאת, צריך להעביר רק את
ANEURALNETWORKS_TENSOR_FLOAT32
עד שהבעיה תיפתר.
בנוסף, ה-API כולל גם פונקציה חדשה, ANeuralNetworksModel_relaxComputationFloat32toFloat16()
, שמאפשרת לציין אם לחשב את ANEURALNETWORKS_TENSOR_FLOAT32
עם טווח ודיוק נמוכים כמו אלה של פורמט הנקודה הצפה של IEEE 754 16-bit.
מסגרת למילוי אוטומטי
ב-Android 9 הוספנו כמה שיפורים שאפשר להטמיע בשירותים של מילוי אוטומטי כדי לשפר עוד יותר את חוויית המשתמש במילוי טפסים. מידע נוסף על שימוש בתכונות של מילוי אוטומטי באפליקציה זמין במדריך בנושא מסגרת מילוי אוטומטי.
שיפורים באבטחה
ב-Android 9 הוצגו מספר תכונות אבטחה, שמסוכמות בקטעים הבאים:
אישור מאובטח של Android
במכשירים נתמכים שפועלת בהם מערכת Android מגרסה 9 ואילך, אפשר להשתמש באישור מוגן של Android. כשמשתמשים בתהליך העבודה הזה, האפליקציה מציגה למשתמש בקשה לאישור הצהרה קצרה. ההצהרה הזו מאפשרת לאפליקציה לאשר מחדש שהמשתמש רוצה להשלים עסקה רגישה, כמו ביצוע תשלום.
אם המשתמש מאשר את ההצהרה, Android Keystore מקבל וחוסך חתימה מוצפנת שמוגנת על ידי קוד אימות הודעה עם גיבוב מפתח (HMAC). אחרי ש-Android Keystore מאשר את התוקף של ההודעה, האפליקציה יכולה להשתמש במפתח שנוצר מ-trustedConfirmationRequired
בסביבת הביצוע המהימנה (TEE) כדי לחתום על ההודעה שהמשתמש אישר. החתימה מציינת, ברמת סבירות גבוהה מאוד, שהמשתמש ראה את ההצהרה והסכים לה.
זהירות: האישור המוגן ב-Android לא מספק למשתמש ערוץ מידע מאובטח. האפליקציה שלך לא יכולה להניח שיש ערבויות לשמירה על סודיות מעבר לאלה שמציעה פלטפורמת Android. בפרט, אל תשתמשו בתהליך העבודה הזה כדי להציג מידע רגיש שבדרך כלל לא מוצג במכשיר של המשתמש.
הוראות להוספת תמיכה באישור מוגן ב-Android מופיעות במדריך בנושא אישור מוגן ב-Android.
תיבת דו-שיח מאוחדת לאימות ביומטרי
ב-Android 9, המערכת מספקת תיבות דו-שיח לאימות ביומטרי בשם האפליקציה. הפונקציונליות הזו יוצרת מראה, תחושה ומיקום סטנדרטיים לתיבת הדו-שיח, וכך המשתמשים יכולים להיות בטוחים שהם עוברים אימות מול בודק אמין של פרטי כניסה ביומטריים.
אם האפליקציה שלכם משתמשת ב-FingerprintManager
כדי להציג למשתמשים תיבת דו-שיח לאימות טביעת אצבע, צריך לעבור לשימוש ב-BiometricPrompt
במקום זאת. BiometricPrompt
מסתמך על המערכת להצגת תיבת הדו-שיח של האימות. בנוסף, אופן הפעולה של התג משתנה בהתאם לסוג האימות הביומטרי שהמשתמש בחר.
מודול אבטחה לחומרה
מכשירים נתמכים עם Android בגרסה 9 ואילך יכולים לכלול StrongBox KeyMint (לשעבר Keymaster), הטמעה של KeyMint (לשעבר Keymaster) HAL שנמצא במודול אבטחת חומרה. המודול מכיל את הרכיבים הבאים:
- מעבד משלו.
- אחסון מאובטח.
- מחולל מספרים אקראיים אמיתי.
- מנגנונים נוספים למניעת שיבוש חבילות והתקנה לא מורשית של אפליקציות ממקורות לא רשמיים.
כשבודקים מפתחות שמאוחסנים ב-KeyMint של StrongBox, המערכת מאמתת את תקינות המפתח באמצעות סביבת מחשוב אמינה (TEE).
מידע נוסף על השימוש ב-StrongBox KeyMint זמין במאמר בנושא מודול אבטחה פיזי.
ייבוא מאובטח של מפתחות ל-Keystore
Android 9 מספק אבטחה נוספת לפענוח מפתחות על ידי הוספת האפשרות לייבא מפתחות מוצפנים בצורה מאובטחת אל Keystore באמצעות פורמט מפתח עם קידוד ASN.1. לאחר מכן, KeyMint מפענח את המפתחות ב-Keystore, כך שהתוכן של המפתחות אף פעם לא מופיע כטקסט רגיל בזיכרון המארח של המכשיר.
מידע נוסף על ייבוא מוצפן של מפתחות
סכמת חתימה של APK עם רוטציית מפתחות
ב-Android 9 נוספה תמיכה ב-APK Signature Scheme v3. בסכימה הזו יש אפשרות לכלול רשומה של הוכחת רוטציה בבלוק החתימה של כל אישור חתימה. היכולת הזו מאפשרת לחתום על האפליקציה באמצעות אישור חתימה חדש, על ידי קישור אישורי החתימה הקודמים של קובץ ה-APK לאישור שמשמש לחתימה עכשיו.
מידע נוסף על החלפת מפתחות באמצעות apksigner
אפשרות לאפשר פענוח מפתח רק במכשירים לא נעולים
ב-Android 9 נוסף unlockedDeviceRequired
. האפשרות הזו קובעת אם צריך לבטל את הנעילה של מסך המכשיר כדי לאפשר פענוח של נתונים שנמצאים בתהליך העברה או נתונים מאוחסנים באמצעות המפתח שצוין. סוגי המפתחות האלה מתאימים להצפנה של נתונים רגישים לאחסון בדיסק, כמו נתונים רפואיים או נתונים של ארגונים. הדגל מספק למשתמשים רמת ביטחון גבוהה יותר לכך שלא ניתן לפענח את הנתונים בזמן שהמכשיר נעול, אם הטלפון אבד או נגנב.
כדי לשמור על מפתח מפני פענוח בזמן שהמכשיר נעול, צריך להעביר את true
לשיטה setUnlockedDeviceRequired()
כדי להפעיל את הדגל. אחרי השלמת השלב הזה, כשמסך המשתמש נעול, כל ניסיון לפענח או לחתום על נתונים באמצעות המפתח הזה ייכשל. כדי לגשת למכשיר נעול, צריך להזין קוד אימות, סיסמה, טביעת אצבע או אמצעי מהימן אחר.
תמיכה בהצפנה מדור קודם
מכשירי Android 9 שמופץ עם Keymaster 4 תומכים באלגוריתם Triple Data Encryption, או Triple DES. אם האפליקציה שלכם פועלת בשילוב עם מערכות מדור קודם שדורשות Triple DES, השתמשו בסוג ההצפנה הזה כשמצפינים פרטי כניסה רגישים.
מידע נוסף על שיפור האבטחה באפליקציה זמין במאמר אבטחה למפתחי Android.
הוצאה משימוש של WPS
התצורה המוגנת של Wi-Fi (WPS) הוצאה משימוש מטעמי אבטחה.
גיבויים ל-Android
ב-Android 9 נוספו פונקציונליות חדשה ואפשרויות חדשות למפתחים שקשורות לגיבוי ולשחזור. פרטים על השינויים האלה מופיעים בקטעים הבאים.
גיבויים של הצפנה מצד הלקוח
ב-Android 9 נוספה תמיכה בהצפנת גיבויים של Android באמצעות סוד מצד הלקוח. התמיכה הזו מופעלת באופן אוטומטי כשמתקיימים התנאים הבאים:
- המשתמש הפעיל גיבוי באמצעות Android מגרסה 9 ואילך.
- המשתמש הגדיר במכשיר שיטה לביטול הנעילה שדורשת קוד אימות, קו ביטול נעילה או סיסמה.
כשאמצעי הפרטיות הזה מופעל, צריך להזין את קוד האימות, קו ביטול הנעילה או הסיסמה של המכשיר כדי לשחזר נתונים מהגיבויים שנוצרו במכשיר של המשתמש. מידע נוסף על הטכנולוגיה שמאחורי התכונה הזו זמין במסמך המידע Google Cloud Key Vault Service.
הגדרת תנאי מכשיר שנדרשים לגיבוי
אם נתוני האפליקציה כוללים מידע או העדפות רגישים, ב-Android 9 אפשר להגדיר את התנאים במכשיר שבהם נתוני האפליקציה נכללים בגיבוי של המשתמש, למשל כשמופעלת הצפנה בצד הלקוח או כשמתבצעת העברה מקומית ממכשיר למכשיר.
מידע נוסף על גיבוי נתונים במכשירי Android זמין במאמר סקירה כללית על גיבוי נתונים.
נגישות
ב-Android 9, שיפרנו את מסגרת הנגישות כדי שיהיה קל יותר לספק חוויה טובה עוד יותר למשתמשים באפליקציה.
סמנטיקה של ניווט
מאפיינים שנוספו ב-Android 9 מקלים על הגדרת האופן שבו שירותי נגישות, במיוחד קוראי מסך, עוברים מחלק אחד של המסך לחלק אחר. המאפיינים האלה יכולים לעזור למשתמשים לקויי ראייה לנווט במהירות בין הטקסטים בממשק המשתמש של האפליקציה ולבחור אפשרות.
לדוגמה, באפליקציית קניות, קורא מסך יכול לעזור למשתמשים לנווט ישירות מקטגוריה אחת של מבצעים לקטגוריה הבאה, בלי שקורא המסך יצטרך לקרוא את כל הפריטים בקטגוריה לפני שהוא עובר לקטגוריה הבאה.
שמות החלוניות של הנגישות
ב-Android 8.1 (רמת API 27) ובגרסאות קודמות, שירותי הנגישות לא תמיד יכולים לקבוע מתי חלו עדכונים בחלונית מסוימת במסך, למשל כשפעילות מחליפה פרגמנט אחד בפרגמנט אחר. החלוניות מורכבות מרכיבי ממשק משתמש שקשורים זה לזה מבחינה ויזואלית ומקובצים יחד באופן הגיוני, ובדרך כלל הן כוללות קטע.
ב-Android 9, אפשר לספק כותרות לחלונית הנגישות או כותרות שניתן לזהות בנפרד עבור החלוניות האלה. אם לחלונית יש כותרת של חלונית נגישות, שירותי הנגישות מקבלים מידע מפורט יותר כשהחלונית משתנה. היכולת הזו מאפשרת לשירותים לספק למשתמש מידע מפורט יותר על השינויים בממשק המשתמש.
כדי לציין את השם של חלונית, משתמשים במאפיין
android:accessibilityPaneTitle
. אפשר גם לעדכן את הכותרת של חלונית בממשק המשתמש שמוחלפת בזמן ריצה באמצעות setAccessibilityPaneTitle()
.
לדוגמה, אפשר לספק שם לאזור התוכן של אובייקט Fragment
.
ניווט שמבוסס על כותרות
אם באפליקציה מוצג תוכן טקסטואלי שכולל כותרות לוגיות, צריך להגדיר את מאפיין android:accessibilityHeading
כ-true
עבור המקרים של View
שמייצגים את הכותרות האלה. הוספת הכותרות האלה מאפשרת לשירותי נגישות לעזור למשתמשים לנווט ישירות מכותרת אחת לכותרת הבאה. כל שירות נגישות יכול להשתמש ביכולת הזו כדי לשפר את חוויית הניווט בממשק המשתמש של המשתמשים.
ניווט ופלט בקבוצה
באופן מסורתי, קוראי מסך משתמשים במאפיין android:focusable
כדי לקבוע מתי הם צריכים לקרוא ViewGroup
או אוסף של אובייקטים מסוג View
כיחידה אחת. כך המשתמשים יוכלו להבין שהתצוגות קשורות זו לזו באופן הגיוני.
ב-Android מגרסה 8.1 ומטה, צריך לסמן כל אובייקט View
בתוך ViewGroup
כלא ניתן להתמקדות, ואת ViewGroup
עצמו כניתן להתמקדות. הסידור הזה גרם לכך שחלק מהמקרים של View
סומנו כאלמנטים שאפשר להתמקד בהם, באופן שהקשה על הניווט באמצעות המקלדת.
החל מ-Android 9, אפשר להשתמש במאפיין android:screenReaderFocusable
במקום במאפיין android:focusable
במצבים שבהם הפיכת אובייקט View
לניתן להתמקדות גורמת לתוצאות לא רצויות. קוראי מסך ממקדים את כל הרכיבים שהוגדרו עם android:screenReaderFocusable
או android:focusable
ל-true
.
פעולות נוחות
ב-Android 9 נוספה תמיכה בביצוע פעולות נוחות בשם המשתמשים:
- אינטראקציה עם תיאורי כלים
- תכונות נוספות במסגרת הנגישות מאפשרות לכם לגשת להסברים קצרים בממשק המשתמש של האפליקציה. משתמשים ב-
getTooltipText()
כדי לקרוא את הטקסט של תיאור הכלי, וב-ACTION_SHOW_TOOLTIP
וב-ACTION_HIDE_TOOLTIP
כדי להנחות מופעים שלView
להציג או להסתיר את תיאורי הכלים שלהם. - הוספת פעולות גלובליות
- Android 9 כולל תמיכה בשתי פעולות נוספות במכשיר במחלקה
AccessibilityService
. השירות שלכם יכול לעזור למשתמשים לנעול את המכשירים ולצלם צילומי מסך באמצעות הפעולותGLOBAL_ACTION_LOCK_SCREEN
ו-GLOBAL_ACTION_TAKE_SCREENSHOT
, בהתאמה.
פרטים על שינוי החלון
ב-Android 9 קל יותר לעקוב אחרי עדכונים בחלונות של אפליקציה כשהאפליקציה מציירת מחדש כמה חלונות בו-זמנית. כשמתרחש אירוע TYPE_WINDOWS_CHANGED
, משתמשים ב-API getWindowChanges()
כדי לקבוע איך חלונות ההמרות השתנו. במהלך עדכון של חלונות מרובים, כל חלון יוצר קבוצה משלו של אירועים.
ה-method getSource()
מחזירה את תצוגת הבסיס של החלון שמשויך לכל אירוע.
אם באפליקציה מוגדרים שמות של חלוניות נגישות לאובייקטים של View
, השירות יכול לזהות מתי ממשק המשתמש של האפליקציה מתעדכן. כשמתרחש אירוע TYPE_WINDOW_STATE_CHANGED
, משתמשים בסוגים שמוחזרים על ידי getContentChangeTypes()
כדי לקבוע איך החלון השתנה. לדוגמה, אפשר להשתמש במסגרת כדי לזהות מתי לחלונית יש כותרת חדשה או מתי חלונית נעלמה.
סיבוב
כדי למנוע סיבובים לא מכוונים, הוספנו מצב שנועל את הכיוון הנוכחי גם אם משנים את מיקום המכשיר. המשתמשים יכולים להפעיל את הסיבוב באופן ידני כשצריך, בלחיצה על לחצן בסרגל המערכת.
ברוב המקרים, ההשפעה על התאימות של האפליקציות היא מינימלית. עם זאת, אם לאפליקציה שלכם יש התנהגות סיבוב מותאמת אישית או שהיא משתמשת בהגדרות לא רגילות של כיוון המסך, יכול להיות שתיתקלו בבעיות שלא הייתם מבחינים בהן קודם, כשהעדפת הסיבוב של המשתמש תמיד הייתה מוגדרת לאורך. מומלץ לבדוק את התנהגות הסיבוב בכל הפעילויות המרכזיות באפליקציה ולוודא שכל הגדרות כיוון המסך עדיין מספקות את החוויה האופטימלית.
פרטים נוספים זמינים במאמר בנושא שינויים בהתנהגות.

מצב סיבוב חדש מאפשר למשתמשים להפעיל סיבוב באופן ידני כשצריך באמצעות לחצן בסרגל המערכת.
טקסט
ב-Android 9 נוספו לפלטפורמה התכונות הבאות שקשורות לטקסט:
טקסט שעבר חישוב מראש: המחלקה
PrecomputedText
משפרת את הביצועים של עיבוד הטקסט, כי היא מאפשרת לחשב ולשמור במטמון את המידע הנדרש מראש. הוא גם מאפשר לאפליקציה לבצע פריסת טקסט מחוץ ל-thread הראשי.זכוכית מגדלת: המחלקה
Magnifier
היא ווידג'ט של פלטפורמה שמספק API של זכוכית מגדלת, ומאפשר חוויה עקבית של תכונת הזכוכית המגדלת בכל האפליקציות.הפיכת טקסט לקישור חכם: ב-Android 9 יש שיפורים במחלקה
TextClassifier
, שמסתמכת על למידת מכונה כדי לזהות ישויות מסוימות בטקסט שנבחר ולהציע פעולות. לדוגמה,TextClassifier
יכול לאפשר לאפליקציה לזהות שהמשתמש בחר מספר טלפון. לאחר מכן, האפליקציה יכולה להציע למשתמש להתקשר באמצעות המספר הזה. התכונות ב-TextClassifier
מחליפות את הפונקציונליות של המחלקהLinkify
.פריסת טקסט: כמה שיטות ומאפיינים נוחים מקלים על הטמעת עיצוב ממשק המשתמש. פרטים נוספים מופיעים במאמרי העזרה בנושא
TextView
.
המרת קובצי DEX מראש (AOT) ב-ART
במכשירים עם Android 9 ואילך, מהדר ה-Android Runtime (ART) ahead-of-time מבצע אופטימיזציה נוספת לקבצים דחוסים בפורמט Dalvik Executable (DEX) על ידי המרת קובצי ה-DEX בחבילת אפליקציה לייצוג קומפקטי יותר. השינוי הזה מאפשר לאפליקציה להתחיל לפעול מהר יותר ולצרוך פחות שטח דיסק וזיכרון RAM.
השיפור הזה מועיל במיוחד למכשירים ברמה נמוכה עם מהירויות קלט/פלט איטיות יותר בכונן.
תיעוד עקבות המערכת במכשיר
ב-Android 9 אפשר להקליט עקבות של המערכת מהמכשיר, ואז לשתף דוח של ההקלטות האלה עם צוות הפיתוח. הדוח הזה תומך בכמה פורמטים, כולל HTML.
איסוף העקבות האלה מאפשר לתעד נתוני תזמון שקשורים לתהליכים ולשרשורים של האפליקציה, ולצפות בסוגים אחרים של מצבי מכשיר בעלי משמעות גלובלית.