Modifiche al comportamento: tutte le app

La piattaforma Android 17 include modifiche al comportamento che potrebbero influire sulla tua app. Le seguenti modifiche al comportamento si applicano a tutte le app quando vengono eseguite su Android 17, indipendentemente dal targetSdkVersion. Devi testare la tua app e poi modificarla in base alle necessità per supportare queste modifiche, ove applicabile.

Assicurati di esaminare anche l'elenco delle modifiche al comportamento che interessano solo le app che hanno come target Android 17.

Funzionalità di base

Android 17 (livello API 37) include le seguenti modifiche che modificano o espandono varie funzionalità di base del sistema Android.

Limiti di memoria per le app

Android 17 引入了基于设备总 RAM 的应用内存限制,旨在为您的应用和 Android 用户打造更稳定、更具确定性的环境。在 Android 17 中,限制设置得较为保守,目的是建立系统基准,在极端内存泄漏和其他异常情况触发系统范围的不稳定性(导致界面卡顿、耗电过快和应用被终止)之前,先针对这些情况。虽然我们预计对绝大多数 应用会话的影响很小,但我们建议遵循以下内存最佳实践, 包括建立内存基准。

您可以通过在 ApplicationExitInfo 中调用 getDescription 来确定应用会话是否受到影响;如果您的应用受到 影响,退出原因将为 REASON_OTHER 并且 说明将包含字符串 "MemoryLimiter:AnonSwap" 以及 其他信息。您还可以使用 基于触发器的分析(使用 TRIGGER_TYPE_ANOMALY)来获取在达到 内存限制时收集的堆转储。

Android Studio 性能分析器中的 LeakCanary 任务。

为了帮助您查找内存泄漏,Android Studio Panda 直接在 Android Studio 性能分析器中添加了 LeakCanary 集成,作为 IDE 中特定任务,并与您的源代码完全集成。

Privacy

Android 17 include le seguenti modifiche per migliorare la privacy degli utenti.

Protezione OTP via SMS

从 Android 17 开始,Android 将扩大对包含一次性密码 (OTP) 的短信的保护范围。

在之前的 Android 版本中,此保护主要侧重于 SMS Retriever 格式。对于大多数应用,包含 SMS Retriever 哈希的消息的递送延迟了 3 小时。不过,某些特定应用(例如默认短信处理程序)不受此延迟的影响,拥有哈希的应用也不受此延迟的影响。

从 Android 17 开始,此保护也适用于 WebOTP 格式的消息。如果应用有权读取短信,但不是 WebOTP 消息的预期接收者(由网域验证确定),则该应用在收到消息后 3 小时内无法访问该消息。此变更旨在提高用户安全性,确保只有与消息中提及的网域关联的应用才能以程序化方式读取验证码。

在这 3 小时的延迟期间,系统会保留 SMS_RECEIVED_ACTION 广播,并过滤 短信提供商 数据库查询。延迟结束后,这些应用即可使用短信。此变更适用于 所有应用,无论其目标 API 级别如何。

某些应用(例如默认短信辅助应用、已连接设备配套应用等)不受此延迟的影响。所有依赖于读取短信 来提取 动态密码 的应用都应过渡到使用 SMS RetrieverSMS User Consent API,以确保功能持续可用。

Sicurezza

Android 17 include i seguenti miglioramenti alla sicurezza di app e dispositivi.

Piano di ritiro di usesClearTraffic

我们计划在未来的版本中弃用 usesCleartextTraffic 元素。需要建立未加密 (HTTP) 连接的应用应迁移为使用网络安全配置文件,该文件可让您指定应用需要与哪些网域建立明文连接。

请注意,网络安全配置文件仅在 API 级别 24 及更高版本中受支持。如果您的应用的最低 API 级别低于 24,您应执行以下两项操作:

  • usesCleartextTraffic 属性设置为 true
  • 使用网络配置文件

如果应用的最低 API 级别为 24 或更高,您可以使用网络配置文件,而无需设置 usesCleartextTraffic

Limita le concessioni implicite di URI

目前,如果应用使用具有操作 ACTION_SENDSEND_MULTIPLE、 或 ACTION_IMAGE_CAPTURE的 URI 启动 intent,系统会自动向目标应用授予读取和 写入 URI 权限。我们计划在 Android 18 中更改此行为。因此,我们建议应用显式授予相关 URI 权限,而不是依赖系统来授予这些权限。

Limiti del keystore per app

Le app devono evitare di creare un numero eccessivo di chiavi in Android Keystore, perché è una risorsa condivisa per tutte le app sul dispositivo. A partire da Android 17, il sistema impone un limite al numero di chiavi che un'app può possedere. Il limite è di 50.000 chiavi per le app non di sistema che hanno come target Android 17 (livello API 37) o versioni successive e di 200.000 chiavi per tutte le altre app. Le app di sistema hanno un limite di 200.000 chiavi, indipendentemente dal livello API a cui fanno riferimento.

Se un'app tenta di creare chiavi oltre il limite, la creazione non riesce e viene restituito un KeyStoreException. La stringa del messaggio dell'eccezione contiene informazioni sul limite di chiavi. Se l'app chiama getNumericErrorCode() sull'eccezione, il valore restituito dipende dal livello API a cui è destinata l'app:

  • App che hanno come target Android 17 (livello API 37) o versioni successive: getNumericErrorCode() restituisce il nuovo valore ERROR_TOO_MANY_KEYS.
  • Tutte le altre app: getNumericErrorCode() restituisce ERROR_INCORRECT_USAGE.

Bloccare il traffico di loopback tra profili

从 Android 17 开始,默认情况下不再允许跨个人资料环回流量。同一个人资料内的环回流量不受影响。 此项变更适用于在 Android 17 或更高版本上运行的所有应用,无论应用以哪个 API 级别为目标平台。

Esperienza utente e UI di sistema

Android 17 include le seguenti modifiche volte a creare un'esperienza utente più coerente e intuitiva.

Ripristino della visibilità predefinita dell'IME dopo la rotazione

A partire da Android 17, quando la configurazione del dispositivo cambia (ad esempio tramite la rotazione) e questo non viene gestito dall'app stessa, la visibilità della tastiera virtuale precedente non viene ripristinata.

Se la tua app subisce una modifica della configurazione che non gestisce e ha bisogno che la tastiera sia visibile dopo la modifica, devi richiederlo esplicitamente. Puoi effettuare questa richiesta in uno dei seguenti modi:

  • Imposta l'attributo android:windowSoftInputMode su stateAlwaysVisible.
  • Richiedi la tastiera su schermo a livello di programmazione nel metodo onCreate() dell'attività o aggiungi il metodo onConfigurationChanged().

Input umano

Android 17 include le seguenti modifiche che influiscono sul modo in cui le app interagiscono con i dispositivi di input umani come tastiere e touchpad.

I touchpad forniscono eventi relativi per impostazione predefinita durante l'acquisizione del puntatore

A partire da Android 17, se un'app richiede l'acquisizione del puntatore utilizzando View.requestPointerCapture() e l'utente utilizza un touchpad, il sistema riconosce il movimento del puntatore e i gesti di scorrimento dai tocchi dell'utente e li segnala all'app nello stesso modo in cui vengono segnalati i movimenti del puntatore e della rotellina di scorrimento di un mouse acquisito. Nella maggior parte dei casi, in questo modo non è più necessario che le app che supportano i mouse acquisiti aggiungano una logica di gestione speciale per i touchpad. Per maggiori dettagli, consulta la documentazione di View.POINTER_CAPTURE_MODE_RELATIVE.

In precedenza, il sistema non tentava di riconoscere i gesti dal touchpad e inviava invece all'app le posizioni assolute e non elaborate delle dita in un formato simile a quello dei tocchi sullo schermo touchscreen. Se un'app richiede ancora questi dati assoluti, deve chiamare il nuovo metodo View.requestPointerCapture(int) con View.POINTER_CAPTURE_MODE_ABSOLUTE.

Media

Android 17 include le seguenti modifiche al comportamento dei contenuti multimediali.

Protezione dell'audio in background

从 Android 17 开始,音频框架会对后台音频互动(包括音频播放、音频焦点请求和音量更改 API)强制执行限制,以确保这些更改是由用户有意发起的。

如果应用尝试在应用未处于有效生命周期时调用音频 API,则音频播放和音量更改 API 会以静默方式失败,而不会抛出异常或提供失败消息。音频焦点 API 会失败,并返回结果代码 AUDIOFOCUS_REQUEST_FAILED

如需了解详情(包括缓解措施),请参阅后台音频安全加固

Connettività

Android 17 include le seguenti modifiche per migliorare la connettività del dispositivo.

Riaccoppiamento autonomo per le perdite di associazione Bluetooth

Android 17 introduce l'accoppiamento automatico, un miglioramento a livello di sistema progettato per risolvere automaticamente la perdita dell'associazione Bluetooth.

In precedenza, se un'associazione veniva persa, gli utenti dovevano andare manualmente in Impostazioni per annullare l'accoppiamento e poi accoppiare di nuovo la periferica. Questa funzionalità si basa sul miglioramento della sicurezza di Android 16, consentendo al sistema di ristabilire le associazioni in background senza che gli utenti debbano andare manualmente in Impostazioni per annullare l'accoppiamento e accoppiare di nuovo le periferiche.

Sebbene la maggior parte delle app non richieda modifiche al codice, gli sviluppatori devono essere a conoscenza delle seguenti modifiche al comportamento dello stack Bluetooth:

  • Nuovo contesto di accoppiamento: ACTION_PAIRING_REQUEST ora include l'extra EXTRA_PAIRING_CONTEXT, che consente alle app di distinguere tra una richiesta di accoppiamento standard e un tentativo di accoppiamento automatico avviato dal sistema.
  • Aggiornamenti delle chiavi condizionali: le chiavi di sicurezza esistenti verranno sostituite solo se l'accoppiamento automatico va a buon fine e la nuova connessione soddisfa o supera il livello di sicurezza dell'associazione precedente.
  • Tempistica degli intent modificata: l'intent ACTION_KEY_MISSING viene ora trasmesso solo se il tentativo di accoppiamento automatico non va a buon fine. In questo modo si riduce la gestione degli errori non necessaria nell'app se il sistema recupera correttamente l'associazione in background.
  • Notifica utente: il sistema gestisce l'accoppiamento automatico tramite nuove notifiche e finestre di dialogo dell'interfaccia utente. Agli utenti verrà chiesto di confermare il tentativo di accoppiamento automatico per assicurarsi che siano a conoscenza della riconnessione.

I produttori di dispositivi periferici e gli sviluppatori di app complementari devono verificare che l'hardware e l'app gestiscano correttamente le transizioni di associazione. Per testare questo comportamento, simula una perdita di associazione remota utilizzando uno dei seguenti metodi:

  • Rimuovi manualmente le informazioni sull'associazione dal dispositivo periferico
  • Annulla manualmente l'accoppiamento del dispositivo in: Impostazioni > Dispositivi collegati