תכונות וממשקי API ב-Android 9

ב-Android 9 (רמת API‏ 28) הוספנו תכונות ויכולות חדשות ושימושיות למשתמשים ולמפתחים. במסמך הזה מפורטות התכונות החדשות למפתחים.

כדי לקרוא על ממשקי ה-API החדשים, אפשר לעיין בדוח ההבדלים בין ממשקי ה-API או להיכנס להפניה ל-Android API. כדאי גם לעיין במאמר שינויים בהתנהגות ב-Android 9 כדי לקבל מידע על תחומים שבהם שינויים בפלטפורמה עשויים להשפיע על האפליקציות שלכם.

מיקום בתוך מבנה באמצעות Wi-Fi RTT

ממשקי API חדשים של 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, מאפשר לאפליקציה לפרוס את התוכן שלה סביב החלקים החסרים במסך של המכשיר. אפשר להגדיר במאפיין הזה את אחד מהערכים הבאים:

אפשר לדמות חיתוך מסך בכל מכשיר או אמולטור עם Android 9 באופן הבא:

  1. מפעילים את האפשרויות למפתחים.
  2. במסך אפשרויות למפתחים, גוללים למטה לקטע ציור ובוחרים באפשרות הדמיה של מסך עם מגרעת.
  3. בוחרים את גודל החיתוך.

התראות

ב-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 יש שלוש קטגוריות חדשות של עדיפות למצב 'נא לא להפריע':

  • ב-NotificationManager.Policy יש גם שבעה קבועים חדשים של 'נא לא להפריע' שאפשר להשתמש בהם כדי למנוע הפרעות חזותיות:

תמיכה במספר מצלמות ועדכונים למצלמה

במכשירים עם 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 באמצעות סוד מצד הלקוח. התמיכה הזו מופעלת באופן אוטומטי כשמתקיימים התנאים הבאים:

כשאמצעי הפרטיות הזה מופעל, צריך להזין את קוד האימות, קו ביטול הנעילה או הסיסמה של המכשיר כדי לשחזר נתונים מהגיבויים שנוצרו במכשיר של המשתמש. מידע נוסף על הטכנולוגיה שמאחורי התכונה הזו זמין במסמך המידע 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.

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

מידע נוסף על הכלי הזה