שינויים בהתנהגות: אפליקציות שמטרגטות את Android מגרסה 17 ואילך

בדומה לגרסאות קודמות, Android 17 כולל שינויים בהתנהגות שעשויים להשפיע על האפליקציה שלכם. שינויי ההתנהגות הבאים רלוונטיים רק לאפליקציות שמטרגטות את Android 17 ואילך. אם האפליקציה שלכם מטרגטת את Android מגרסה 17 ואילך, אתם צריכים לשנות את האפליקציה כדי שהיא תתמוך בהתנהגויות האלה, במקרים הרלוונטיים.

חשוב גם לבדוק את רשימת השינויים בהתנהגות שמשפיעים על כל האפליקציות שפועלות ב-Android 17, בלי קשר ל-targetSdkVersion של האפליקציה.

פונקציונליות עיקרית

‫Android 17 כוללת את השינויים הבאים, שמשנים או מרחיבים יכולות ליבה שונות של מערכת Android.

הטמעה חדשה של MessageQueue שלא דורשת נעילה

החל מ-Android 17, אפליקציות שמטרגטות את Android 17 (רמת API 37) או גרסאות חדשות יותר מקבלות הטמעה חדשה ללא נעילה של android.os.MessageQueue. ההטמעה החדשה משפרת את הביצועים ומפחיתה את מספר הפריימים החסרים, אבל היא עלולה לגרום לשיבוש בלקוחות שמשקפים שדות ושיטות פרטיים.MessageQueue

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

שדות סופיים סטטיים לא ניתנים לשינוי

באפליקציות שפועלות ב-Android 17 ומעלה ומטרגטות ל-Android 17 (רמת API 37) ומעלה, אי אפשר לשנות שדות static final. אם אפליקציה מנסה לשנות שדה static final באמצעות רפלקציה, היא תגרום ל-IllegalAccessException. ניסיון לשנות אחד מהשדות האלה באמצעות ממשקי JNI API (כמו SetStaticLongField()) יגרום לקריסת האפליקציה.

נגישות

ב-Android 17 בוצעו השינויים הבאים כדי לשפר את הנגישות.

תמיכה בנגישות של הקלדה במקלדת פיזית ב-IME מורכב

התכונה הזו כוללת ממשקי API חדשים של AccessibilityEvent ו-TextAttribute שמשפרים את קורא המסך הקולי לקלט בשפות CJKV. אפליקציות של CJKV IME יכולות עכשיו לסמן אם נבחר מועמד להמרת טקסט במהלך כתיבת הטקסט. אפליקציות עם שדות עריכה יכולות לציין סוגים של שינויי טקסט כששולחים אירועי נגישות של שינוי טקסט. לדוגמה, אפליקציות יכולות לציין ששינוי בטקסט התרחש במהלך כתיבת הטקסט, או ששינוי בטקסט נבע מביצוע commit. הפעולה הזו מאפשרת לשירותי נגישות כמו קוראי מסך לספק משוב מדויק יותר על סמך אופי השינוי בטקסט.

אימוץ האפליקציה

  • אפליקציות IME: כשמגדירים כתיבת טקסט בשדות עריכה, אפליקציות IME יכולות להשתמש ב-TextAttribute.Builder.setTextSuggestionSelected() כדי לציין אם נבחר מועמד ספציפי להמרה.

  • אפליקציות עם עריכת שדות: אפליקציות ששומרות InputConnection מותאם אישית יכולות לאחזר נתונים של בחירת מועמדים על ידי קריאה ל-TextAttribute.isTextSuggestionSelected(). האפליקציות האלה צריכות לקרוא ל-AccessibilityEvent.setTextChangeTypes() כששולחים אירועי TYPE_VIEW_TEXT_CHANGED. באפליקציות שמטרגטות ל-Android 17 (רמת API 37) ומשתמשות ב-TextView הרגיל, התכונה הזו מופעלת כברירת מחדל. (כלומר, TextView יטפל באחזור נתונים מ-IME ובהגדרת סוגי שינויים בטקסט כששולחים אירועים לשירותי נגישות).

  • שירותי נגישות: שירותי נגישות שמבצעים עיבוד של אירועי TYPE_VIEW_TEXT_CHANGED יכולים לבצע קריאה ל-AccessibilityEvent.getTextChangeTypes() כדי לזהות את אופי השינוי ולהתאים את אסטרטגיות המשוב שלהם בהתאם.

פרטיות

‫Android 17 כוללת את השינויים הבאים לשיפור הפרטיות של המשתמשים.

ההגדרה ECH (הצפנת Client Hello) מופעלת

ב-Android 17 נוספה תמיכה בפלטפורמה בהצפנת ClientHello‏ (ECH), תוסף ל-TLS (אבטחת שכבת התעבורה) שמשפר את פרטיות המשתמשים על ידי הצפנת חיווי שם השרת (SNI) בלחיצת היד של TLS. ההצפנה הזו עוזרת למנוע מצופים ברשת לזהות בקלות את הדומיין הספציפי שאליו האפליקציה מתחברת.

באפליקציות שמטרגטות ל-Android 17 (רמת API 37) ומעלה, נעשה שימוש ב-ECH לחיבורי TLS. ה-ECH פעיל רק אם ספריית הרשת שבה נעשה שימוש באפליקציה (לדוגמה, HttpEngine, ‏ WebView או OkHttp) כוללת תמיכה משולבת ב-ECH, וגם השרת המרוחק תומך בפרוטוקול ECH. אם אי אפשר להגיע להסכמה על ECH, הלקוח שולח תוסף ECH עם תוכן אקראי (מנגנון שנקרא ECH GREASE). מידע נוסף על אופן הפעולה של ECH GREASE זמין ב-RFC 9849.

כדי לאפשר לאפליקציות להתאים אישית את ההתנהגות הזו, ב-Android 17 נוסף רכיב <domainEncryption> חדש לקובץ הגדרות אבטחת הרשת. מפתחים יכולים להשתמש בתג <domainEncryption> בתוך התגים <base-config> או <domain-config> כדי לבחור מצב ECH (לדוגמה, "enabled" או "disabled") באופן גלובלי או לכל דומיין.

מידע נוסף זמין במאמר בנושא הצפנה של Client Hello.

נדרשת הרשאה לגישה לרשת המקומית לאפליקציות שמיועדות ל-Android 17

ב-Android 17 נוספה הרשאת זמן הריצה ACCESS_LOCAL_NETWORK כדי להגן על המשתמשים מפני גישה לא מורשית לרשת המקומית. ההרשאה הזו נכללת בקבוצת ההרשאות הקיימת NEARBY_DEVICES, ולכן משתמשים שכבר העניקו הרשאות אחרות של NEARBY_DEVICES לא יתבקשו לאשר אותה שוב. הדרישה החדשה הזו מונעת מאפליקציות זדוניות לנצל גישה בלתי מוגבלת לרשת המקומית כדי לעקוב אחרי משתמשים ולזהות אותם ללא ידיעתם. הצהרה על ההרשאה הזו ובקשתה מאפשרות לאפליקציה לגלות מכשירים ברשת המקומית (LAN) ולהתחבר אליהם, כמו מכשירים לבית חכם או מכשירים לקבלת תוכן ב-Cast.

באפליקציות שמטרגטות ל-Android 17 (רמת API 37) ומעלה, יש עכשיו שתי דרכים לשמור על תקשורת עם מכשירים ברשת מקומית: שימוש בכלי לבחירת מכשירים שמופעל על ידי המערכת ושומר על הפרטיות כדי לדלג על בקשת ההרשאה, או בקשה מפורשת של ההרשאה החדשה הזו בזמן הריצה כדי לשמור על תקשורת ברשת המקומית.

מידע נוסף זמין במאמר בנושא הרשאה לגישה לרשת המקומית.

הסתרת סיסמאות ממכשירים פיזיים

אם אפליקציה מיועדת ל-Android 17 (רמת API 37) ומעלה, והמשתמש משתמש במכשיר קלט פיזי (לדוגמה, מקלדת חיצונית), מערכת ההפעלה של Android מחילה את ההגדרה החדשה show_passwords_physical על כל התווים בשדה הסיסמה. כברירת מחדל, ההגדרה הזו מסתירה את כל התווים של הסיסמה.

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

אם המשתמש משתמש במסך המגע של המכשיר, המערכת מחילה את ההגדרה החדשה show_passwords_touch.

הגנה על OTP בהודעות SMS רגילות

从 Android 17 开始,Android 将扩展其短信 OTP 保护功能,以适用于标准短信(包含 OTP 但不使用 WebOTP 或 SMS Retriever 格式的短信)。对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,这些短信在收到后三小时才会可用。此延迟旨在帮助防止 OTP 劫持。在这三小时的延迟期间, SMS_RECEIVED_ACTION广播会被保留,并且短信提供商数据库 查询会被过滤。延迟结束后,这些应用即可使用短信。

某些应用(例如默认短信助理应用、已连接的设备配套应用等)不受此延迟限制。所有依赖于读取短信以提取动态密码的应用都应改用 SMS Retriever 或 SMS 用户同意 API,以确保功能持续可用。

אבטחה

ב-Android 17 בוצעו השיפורים הבאים באבטחת המכשירים והאפליקציות.

אבטחת פעילות

在 Android 17 中,平台继续向“默认安全”架构转变,引入了一系列旨在缓解网络钓鱼、互动劫持和混淆代理攻击等高严重性漏洞的增强功能。此更新要求开发者明确选择启用新的安全标准,以保持应用兼容性和用户保护。

对开发者的主要影响包括:

  • BAL 安全加固和改进的选择启用: 我们正在优化后台活动启动 (BAL) 限制,方法是将保护范围扩展到 IntentSender。开发者必须从旧版 MODE_BACKGROUND_ACTIVITY_START_ALLOWED 常量迁移。相反,您应 采用精细控制,例如 MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE,它将 活动启动限制为调用应用可见的场景,从而显著 缩小攻击面。
  • 采用工具: 开发者应利用严格模式和更新后的 lint 检查来识别旧版模式,并确保为未来的目标 SDK 要求做好准备。

הפעלה של CT כברירת מחדל

אם אפליקציה מטרגטת ל-Android 17 (רמת API 37) או לגרסה מתקדמת יותר, שקיפות האישורים (CT) מופעלת כברירת מחדל. (ב-Android 16, התכונה CT זמינה, אבל האפליקציות צריכות להצטרף אליה).

‫DCL מקורי מאובטח יותר – C

אם האפליקציה מטרגטת ל-Android 17 (רמת API 37) או לגרסה מתקדמת יותר, ההגנה על טעינה דינמית (DCL) של קוד, שהוצגה ב-Android 14 לקובצי DEX ו-JAR, חלה עכשיו גם על ספריות Native.

כל הקבצים המקוריים שנטענו באמצעות System.load() צריכים להיות מסומנים כקריאה בלבד. אחרת, המערכת תציג את השגיאה UnsatisfiedLinkError.

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

הגבלת שדות של פרטים אישיים מזהים בתצוגת הנתונים של CP2

באפליקציות שמיועדות ל-Android 17 (API ברמה Android 17 (API ברמה 37)) ומעלה, ניהול אנשי הקשר 2 (CP2) מגביל את הגישה לכמה עמודות שמכילות פרטים אישיים מזהים (PII) בתצוגת הנתונים. כשהשינוי הזה מופעל, העמודות האלה מוסרות מתצוגת הנתונים כדי לשפר את הפרטיות של המשתמשים. העמודות המוגבלות כוללות:

אפליקציות שמשתמשות בעמודות האלה מ-ContactsContract.Data יכולות לחלץ אותן מ-ContactsContract.RawContacts במקום זאת, על ידי הצטרפות ל-RAW_CONTACT_ID.

אכיפה של בדיקות SQL מחמירות ב-CP2

באפליקציות שמיועדות ל-Android 17 (רמת API‏ Android 17 (רמת API 37)) ומעלה, ניהול אנשי הקשר 2 (CP2) אוכף אימות קפדני של שאילתות SQL כשמנסים לגשת לטבלה ContactsContract.Data בלי הרשאה READ_CONTACTS.

בעקבות השינוי הזה, אם לאפליקציה אין הרשאה לREAD_CONTACTS, האפשרויות StrictColumns וStrictGrammar מוגדרות כשמבצעים שאילתה בטבלה ContactsContract.Data. אם שאילתה משתמשת בתבנית שלא תואמת לאלה, היא תידחה ותגרום להפעלת חריגה.

מדיה

‫Android 17 כוללת את השינויים הבאים בהתנהגות של מדיה.

חיזוק האבטחה של אודיו ברקע

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

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

  • לשירות שפועל בחזית צריכות להיות יכולות של while-in-use (WIU).
  • לאפליקציה צריכה להיות הרשאת התראה מדויקת והיא צריכה להיות באינטראקציה עם זרמי אודיו של USAGE_ALARM.

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

גורמי צורה של מכשירים

‫Android 17 כוללת את השינויים הבאים לשיפור חוויית המשתמש במגוון גדלים וסוגים של מכשירים.

שינויים ב-API של הפלטפורמה שגורמים להתעלמות מהגבלות על כיוון, שינוי גודל ויחס גובה-רוחב במסכים גדולים (sw>=600dp)

הוספנו שינויים ב-API של הפלטפורמה ב-Android 16 כדי להתעלם מהגבלות על כיוון, יחס גובה-רוחב ושינוי גודל במסכים גדולים (sw ‏ >= 600dp) באפליקציות שמטרגטות לרמת API 36 ומעלה. מפתחים יכולים להשבית את השינויים האלה ב-SDK 36, אבל האפשרות הזו לא תהיה זמינה יותר לאפליקציות שמיועדות ל-Android 17 (רמת API 37) ומעלה.

מידע נוסף זמין במאמר בנושא התעלמות מהגבלות על כיוון ושינוי גודל.

קישוריות

ב-Android 17 בוצע השינוי הבא כדי לשפר את העקביות ולהתאים להתנהגות הרגילה של Java InputStream עבור שקעי RFCOMM ב-Bluetooth.

התנהגות עקבית של read() ב-BluetoothSocket עבור RFCOMM

באפליקציות שמטרגטות ל-Android 17 (רמת API 37), השיטה read() של InputStream שמתקבלת מ-BluetoothSocket מבוסס RFCOMM מחזירה עכשיו -1 כשהסוקט סגור או כשהחיבור נותק.

השינוי הזה גורם להתנהגות של שקע RFCOMM להיות עקבית עם שקעי LE CoC, ומתאים למסמכי התיעוד של התקן InputStream.read(), שבהם מצוין שהערך -1 מוחזר כשמגיעים לסוף הזרם.

אפליקציות שמסתמכות רק על תפיסה של IOException כדי לצאת מלולאת קריאה עשויות להיות מושפעות מהשינוי הזה, ולכן צריך לעדכן את לולאות הקריאה של BluetoothSocket כדי לבדוק באופן מפורש אם ערך ההחזרה הוא -1. כך מבטיחים שהלולאה תסתיים בצורה נכונה כשהמכשיר שמחובר לרשת אחרת מתנתק או כשהשקע נסגר. דוגמה להטמעה המומלצת מופיעה בקטע קוד במדריך העברת נתונים באמצעות Bluetooth.