Wie bei früheren Versionen enthält Android 17 Verhaltensänderungen, die sich auf deine App auswirken können. Die folgenden Verhaltensänderungen gelten ausschließlich für Apps, die auf Android 17 oder höher ausgerichtet sind. Wenn deine App auf Android 17 oder höher ausgerichtet ist, solltest du sie gegebenenfalls so ändern, dass sie diese Verhaltensweisen unterstützt.
Sieh dir auch die Liste der Verhaltensänderungen an, die sich auf alle Apps auswirken, die unter Android 17 ausgeführt werden, unabhängig von der targetSdkVersion deiner App.
Hauptfunktion
Android 17 enthält die folgenden Änderungen, die verschiedene Kernfunktionen des Android-Systems ändern oder erweitern.
Neue sperrfreie Implementierung von MessageQueue
Ab Android 17 erhalten Apps, die auf Android 17 (API-Level 37) oder höher ausgerichtet sind, eine neue sperrenfreie Implementierung von android.os.MessageQueue. Die neue Implementierung verbessert die Leistung und reduziert fehlende Frames, kann aber Clients beeinträchtigen, die private Felder und Methoden von MessageQueue verwenden.
Weitere Informationen, einschließlich Strategien zur Risikominderung, finden Sie unter Leitfaden zur Verhaltensänderung von MessageQueue.
Statische finale Felder sind jetzt nicht mehr änderbar
Apps, die unter Android 17 oder höher ausgeführt werden und auf Android 17 (API‑Level 37) oder höher ausgerichtet sind, können static final-Felder nicht ändern. Wenn eine App versucht, ein static final-Feld mithilfe von Reflection zu ändern, führt dies zu einem IllegalAccessException. Wenn Sie versuchen, eines dieser Felder über JNI-APIs (z. B. SetStaticLongField()) zu ändern, stürzt die App ab.
Bedienungshilfen
In Android 17 wurden die folgenden Änderungen vorgenommen, um die Bedienungshilfen zu verbessern.
Unterstützung von Bedienungshilfen für die Eingabe über komplexe IME-Tastaturen
Mit dieser Funktion werden die neuen AccessibilityEvent und TextAttribute
APIs eingeführt, um die Sprachausgabe von Screenreadern für die Eingabe in CJKV-Sprachen zu verbessern. CJKV-IME-Apps können jetzt signalisieren, ob während der Texterstellung ein Kandidat für die Textkonvertierung ausgewählt wurde. Apps mit Bearbeitungsfeldern können beim Senden von Ereignissen zur Barrierefreiheit für geänderten Text Textänderungstypen angeben.
Apps können beispielsweise angeben, dass eine Textänderung während der Texterstellung erfolgt ist oder dass eine Textänderung durch einen Commit verursacht wurde.
Dadurch können Bedienungshilfen wie Screenreader genaueres Feedback geben, das auf der Art der Textänderung basiert.
App-Akzeptanz
IME-Apps:Beim Erstellen von Text in Bearbeitungsfeldern können IMEs mit
TextAttribute.Builder.setTextSuggestionSelected()angeben, ob ein bestimmter Konvertierungskandidat ausgewählt wurde.Apps mit Bearbeitungsfeldern:Apps, die eine benutzerdefinierte
InputConnectionverwalten, können Kandidatenauswahldaten mitTextAttribute.isTextSuggestionSelected()abrufen. Diese Apps sollten dannAccessibilityEvent.setTextChangeTypes()aufrufen, wenn sieTYPE_VIEW_TEXT_CHANGED-Ereignisse senden. Bei Apps, die auf Android 17 (API-Level 37) ausgerichtet sind und die StandardklasseTextViewverwenden, ist diese Funktion standardmäßig aktiviert. Das bedeutet, dassTextViewdas Abrufen von Daten aus der IME und das Festlegen von Textänderungstypen beim Senden von Ereignissen an Bedienungshilfen übernimmt.Bedienungshilfen:Bedienungshilfen, die
TYPE_VIEW_TEXT_CHANGED-Ereignisse verarbeiten, könnenAccessibilityEvent.getTextChangeTypes()aufrufen, um die Art der Änderung zu ermitteln und ihre Feedbackstrategien entsprechend anzupassen.
Datenschutz
Android 17 enthält die folgenden Änderungen, um den Datenschutz für Nutzer zu verbessern.
ECH (Encrypted Client Hello) aktiviert
Android 17 引入了对加密客户端问候 (ECH) 的平台支持。ECH 是一种 TLS 扩展,可通过加密 TLS 握手中的服务器名称指示 (SNI) 来增强用户隐私保护。这种加密有助于防止网络观察者轻松识别您的应用所连接的特定网域。
对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,ECH 用于 TLS 连接。只有当应用使用的网络库(例如 HttpEngine、WebView 或 OkHttp)已集成 ECH 支持,并且远程服务器也支持 ECH 协议时,ECH 才会处于活跃状态。如果无法协商 ECH,客户端会发送一个包含随机内容的 ECH 扩展(一种称为 ECH GREASE 的机制)。如需详细了解 ECH GREASE 的工作原理,请参阅 RFC 9849。
为了让应用能够自定义此行为,Android 17 向网络安全配置文件添加了一个新的
<domainEncryption> 元素。
开发者可以在 <base-config> 或
<domain-config> 标记中使用 <domainEncryption>,以全局或按网域的方式选择 ECH 模式(例如
"enabled" 或 "disabled")。
如需了解详情,请参阅加密客户端问候文档。
Berechtigung für lokales Netzwerk für Apps, die auf Android 17 ausgerichtet sind, erforderlich
In Android 17 wird die ACCESS_LOCAL_NETWORK Laufzeitberechtigung
eingeführt, um Nutzer vor unbefugtem Zugriff auf das lokale Netzwerk zu schützen. Da diese Berechtigung zur vorhandenen Berechtigungsgruppe NEARBY_DEVICES gehört, werden Nutzer, die bereits andere NEARBY_DEVICES-Berechtigungen erteilt haben, nicht noch einmal aufgefordert. Diese neue Anforderung verhindert, dass schädliche Apps uneingeschränkten Zugriff auf das lokale Netzwerk nutzen, um Nutzer-Tracking und Fingerprinting heimlich durchzuführen. Wenn Sie diese Berechtigung deklarieren und anfordern, kann Ihre App Geräte im lokalen Netzwerk (LAN) erkennen und eine Verbindung zu ihnen herstellen, z. B. Smart-Home-Geräte oder Streaming-Empfänger.
Apps, die auf Android 17 (API-Level 37) oder höher ausgerichtet sind, haben jetzt zwei Möglichkeiten, die Kommunikation mit LAN-Geräten aufrechtzuerhalten: Sie können datenschutzfreundliche Geräteauswahlen verwenden, die vom System vermittelt werden, um die Berechtigungsaufforderung zu überspringen, oder diese neue Berechtigung explizit zur Laufzeit anfordern, um die Kommunikation über das lokale Netzwerk aufrechtzuerhalten.
Weitere Informationen finden Sie in der Dokumentation zur Berechtigung für das lokale Netzwerk.
Passwörter auf physischen Geräten ausblenden
Wenn eine App auf Android 17 (API‑Level 37) oder höher ausgerichtet ist und der Nutzer ein physisches Eingabegerät (z. B. eine externe Tastatur) verwendet, wendet das Android-Betriebssystem die neue show_passwords_physical-Einstellung auf alle Zeichen im Passwortfeld an. Standardmäßig werden alle Passwortzeichen ausgeblendet.
Das Android-System zeigt das zuletzt eingegebene Passwortzeichen an, damit der Nutzer sehen kann, ob er das Passwort falsch eingegeben hat. Bei größeren externen Tastaturen ist dies jedoch viel weniger notwendig. Außerdem haben Geräte mit externen Tastaturen oft größere Displays, was die Gefahr erhöht, dass jemand das eingegebene Passwort sieht.
Wenn der Nutzer den Touchscreen des Geräts verwendet, wendet das System die neue Einstellung show_passwords_touch an.
OTP-Schutz für Standard-SMS-Nachrichten
Ab Android 17 wird der SMS-OTP-Schutz von Android auf Standard-SMS-Nachrichten ausgeweitet (SMS-Nachrichten, die ein OTP enthalten und nicht das WebOTP- oder SMS Retriever-Format verwenden). Bei den meisten Apps, die auf Android 17 (API‑Level 37) oder höher ausgerichtet sind, sind diese SMS erst drei Stunden nach Erhalt verfügbar. Diese Verzögerung soll dazu beitragen, das Abfangen von Einmalpasswörtern zu verhindern. Während dieser dreistündigen Verzögerung wird die SMS_RECEIVED_ACTION-Übertragung zurückgehalten und die Datenbankabfragen des SMS-Anbieters werden gefiltert. Die SMS ist nach der Verzögerung für diese Apps verfügbar.
Bestimmte Apps wie die standardmäßige SMS-Assistenten-App oder Companion-Apps für verbundene Geräte sind von dieser Verzögerung ausgenommen. Alle Apps, die zum Extrahieren von Einmalpasswörtern auf das Lesen von SMS angewiesen sind, sollten auf die APIs SMS Retriever oder SMS User Consent umgestellt werden, um die Funktionalität aufrechtzuerhalten.
Sicherheit
In Android 17 wurden die folgenden Verbesserungen an der Geräte- und App-Sicherheit vorgenommen.
Aktivitätssicherheit
In Android 17 wird die Plattform weiterhin in Richtung einer „Secure-by-Default“-Architektur verschoben. Es werden eine Reihe von Verbesserungen eingeführt, die darauf ausgelegt sind, Exploits mit hohem Schweregrad wie Phishing, Interaction Hijacking und Confused Deputy-Angriffe zu minimieren. Mit diesem Update müssen Entwickler neue Sicherheitsstandards explizit aktivieren, um die App-Kompatibilität und den Nutzerschutz aufrechtzuerhalten.
Wichtige Auswirkungen für Entwickler:
- BAL-Härtung und verbesserte Einwilligung: Wir optimieren die Einschränkungen für den Start von Hintergrundaktivitäten (Background Activity Launch, BAL), indem wir den Schutz auf
IntentSenderausweiten. Entwickler müssen die alteMODE_BACKGROUND_ACTIVITY_START_ALLOWED-Konstante migrieren. Stattdessen sollten Sie detaillierte Steuerelemente wieMODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLEverwenden, die den Start von Aktivitäten auf Szenarien beschränken, in denen die aufrufende App sichtbar ist. Dadurch wird die Angriffsfläche erheblich verringert. - Tools zur Einführung:Entwickler sollten den Strict-Modus und aktualisierte Lint-Prüfungen verwenden, um Legacy-Muster zu identifizieren und die Einhaltung zukünftiger Anforderungen an das Ziel-SDK sicherzustellen.
CT standardmäßig aktivieren
Wenn eine App auf Android 17 (API-Level 37) oder höher ausgerichtet ist, die Zertifikattransparenz (Certificate Transparency, CT) ist standardmäßig aktiviert. Unter Android 16 ist CT verfügbar, aber Apps mussten sich dafür anmelden.
Sicherere native DCL—C
Wenn Ihre App auf Android 17 (API-Level 37) oder höher ausgerichtet ist, gilt der in Android 14 eingeführte Schutz für sichereres dynamisches Laden von Code (Dynamic Code Loading, DCL) für DEX- und JAR-Dateien jetzt auch für native Bibliotheken.
Alle nativen Dateien, die mit System.load() geladen werden, müssen als schreibgeschützt markiert werden.
Andernfalls wird UnsatisfiedLinkError ausgegeben.
Wir empfehlen, dass Apps nach Möglichkeit keinen Code dynamisch laden, da dies das Risiko, dass eine App durch Code-Injection oder Manipulation von Code kompromittiert wird, erheblich erhöht.
Felder mit personenbezogenen Daten in der CP2-Datenansicht einschränken
Bei Apps, die auf Android 17 (API-Level 37) und höher ausgerichtet sind, werden in Contacts Provider 2 (CP2) bestimmte Spalten mit personenidentifizierbaren Informationen aus der Datenansicht entfernt. Wenn diese Änderung aktiviert ist, werden diese Spalten aus der Datenansicht entfernt, um den Datenschutz der Nutzer zu verbessern. Die eingeschränkten Spalten sind:
Apps, die diese Spalten aus ContactsContract.Data verwenden, können sie stattdessen aus ContactsContract.RawContacts extrahieren, indem sie mit RAW_CONTACT_ID verknüpft werden.
Strikte SQL-Prüfungen in CP2 erzwingen
Bei Apps, die auf Android 17 (API-Level 37) und
höher ausgerichtet sind, erzwingt der Kontakteanbieter 2 (Contacts Provider 2, CP2) eine strenge SQL-Abfragevalidierung, wenn
auf die Tabelle ContactsContract.Data ohne die Berechtigung
READ_CONTACTS zugegriffen wird.
Wenn eine App nicht die READ_CONTACTS
Berechtigung hat, werden mit dieser Änderung die StrictColumns und
StrictGrammar Optionen festgelegt, wenn
die ContactsContract.Data Tabelle abgefragt wird. Wenn eine Abfrage ein Muster verwendet, das mit diesen Optionen nicht kompatibel ist, wird sie abgelehnt und es wird eine Ausnahme ausgelöst.
Medien
Android 17 enthält die folgenden Änderungen am Medienverhalten.
Härtung von Audio im Hintergrund
Ab Android 17 werden im Audio-Framework Einschränkungen für Audiointeraktionen im Hintergrund erzwungen, darunter Audiowiedergabe, Audiofokus-Anfragen und APIs für Lautstärkeänderungen. So soll sichergestellt werden, dass diese Änderungen vom Nutzer initiiert werden.
Für alle Apps gelten bestimmte Audioeinschränkungen. Die Einschränkungen sind jedoch strenger, wenn eine App auf Android 17 (API‑Level 37) ausgerichtet ist. Wenn eine dieser Apps im Hintergrund mit Audio interagiert, muss ein Vordergrunddienst ausgeführt werden. Außerdem muss die App eine oder beide der folgenden Anforderungen erfüllen:
- Der Dienst im Vordergrund muss die Zugriffsberechtigung „Während der Nutzung“ (While-in-Use, WIU) haben.
- Die App muss die Berechtigung exact alarm haben und mit
USAGE_ALARM-Audiostreams interagieren.
Weitere Informationen, einschließlich der Strategien zur Risikominderung, finden Sie unter Härtung von Hintergrundaudio.
Formfaktoren von Geräten
Android 17 enthält die folgenden Änderungen, um die Nutzerfreundlichkeit auf einer Reihe von Geräten mit unterschiedlichen Größen und Formfaktoren zu verbessern.
Änderungen an der Plattform-API, um Einschränkungen für Ausrichtung, Größenänderung und Seitenverhältnis auf großen Displays (sw>=600dp) zu ignorieren
In Android 16 haben wir Änderungen an der Plattform-API eingeführt, um Einschränkungen für Ausrichtung, Seitenverhältnis und Größenänderung auf großen Bildschirmen (sw >= 600 dp) zu ignorieren für Apps, die auf API-Level 36 oder höher ausgerichtet sind. Entwickler haben die Möglichkeit, diese Änderungen mit SDK 36 zu deaktivieren. Diese Deaktivierung ist jedoch nicht mehr für Apps verfügbar, die auf Android 17 (API-Level 37) oder höher ausgerichtet sind.
Weitere Informationen finden Sie unter Einschränkungen für Ausrichtung und Größenänderung werden ignoriert.
Konnektivität
In Android 17 wurde die folgende Änderung eingeführt, um die Konsistenz zu verbessern und das Verhalten von Bluetooth-RFCOMM-Sockets an das Standardverhalten von InputStream in Java anzugleichen.
Konsistentes Verhalten von BluetoothSocket read() für RFCOMM
对于以 Android 17(API 级别 37)为目标平台的应用,
read() 方法从InputStream 获取的
基于 RFCOMM 的 BluetoothSocket 现在会在
套接字关闭或连接断开时返回 -1。
此更改使 RFCOMM 套接字行为与 LE CoC 套接字保持一致,并与标准 InputStream.read()
文档保持一致,该文档指出,当到达流的末尾时,系统会返回 -1。
仅依赖于捕获 IOException 以跳出读取循环的应用可能会受到此更改的影响,并且应更新 BluetoothSocket 读取循环以明确检查返回值 -1。这可确保在远程设备断开连接或套接字关闭时,循环正确终止。如需查看推荐的实现示例,请参阅传输蓝牙数据指南中的代码段。