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 introduce limiti di memoria delle app basati sulla RAM totale del dispositivo per creare un ambiente più stabile e deterministico per le tue applicazioni e gli utenti Android. In Android 17, i limiti sono impostati in modo conservativo per stabilire le baseline di sistema, prendendo di mira perdite di memoria estreme e altri valori anomali prima che causino instabilità a livello di sistema, con conseguenti scatti dell'interfaccia utente, consumo eccessivo della batteria e chiusura delle app. Sebbene prevediamo un impatto minimo sulla stragrande maggioranza delle sessioni delle app, consigliamo le seguenti best practice per la memoria, inclusa la definizione di una baseline per la memoria.

Puoi determinare se la sessione della tua app è stata interessata chiamando getDescription in ApplicationExitInfo; se la tua app è stata interessata, il motivo di uscita sarà REASON_OTHER e la descrizione conterrà la stringa "MemoryLimiter:AnonSwap" insieme ad altre informazioni. Puoi anche utilizzare la profilazione basata su trigger con TRIGGER_TYPE_ANOMALY per ottenere dump dell'heap raccolti quando viene raggiunto il limite di memoria.

L'attività LeakCanary nel Profiler di Android Studio.

Per aiutarti a trovare le perdite di memoria, Android Studio Panda aggiunge l'integrazione di LeakCanary direttamente nel Profiler di Android Studio come attività dedicata, contestualizzata all'interno dell'IDE e completamente integrata con il codice sorgente.

Privacy

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

Protezione OTP via SMS

Beginning with Android 17, Android is expanding its protection for SMS messages containing one-time passwords (OTP).

In previous versions of Android, this protection was primarily focused on the SMS Retriever format. Delivery of messages containing an SMS retriever hash was delayed for most apps for three hours. However, certain certain apps (like the default SMS handler) were exempt from the delay, and the app that owned the hash was also exempted.

Beginning with Android 17, the protection is also applied to WebOTP format messages. If an app has permission to read SMS messages but is not the intended recipient of a WebOTP message (as determined by domain verification), the message is not accessible to the app until three hours after the message's receipt. This change is intended to improve user security by ensuring that only apps associated with the domain mentioned in the message can programmatically read the verification code.

During this three hour delay, the SMS_RECEIVED_ACTION broadcast is withheld and SMS provider database queries are filtered. The SMS message is available to these apps after the delay. This change applies to all apps, regardless of their target API level.

Certain apps such as the default SMS assistant app, connected device companion apps, etc., are exempted from this delay. All apps that rely on reading SMS messages for OTP extraction should transition to using SMS Retriever or SMS User Consent APIs to ensure continued functionality.

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

目前,如果应用启动的 intent 具有 URI,且该 URI 具有操作 ACTION_SENDACTION_SEND_MULTIPLEACTION_IMAGE_CAPTURE,则系统会自动向目标应用授予读取和 写入 URI 权限。从 Android 18 开始,系统将 不再自动授予这些权限。因此,我们建议应用明确授予相关 URI 权限,而不是依赖系统授予这些权限。

如需检测应用中这些 intent 的使用情况,请将 StrictModedetectImplicitUriPermissionGrant() 结合使用,以触发违规行为:

Kotlin

val policy = StrictMode.VmPolicy.Builder()
    .detectImplicitUriPermissionGrant()
    .penaltyLog()
    .build()
StrictMode.setVmPolicy(policy)

Java

StrictMode.VmPolicy policy = new StrictMode.VmPolicy.Builder()
    .detectImplicitUriPermissionGrant()
    .penaltyLog()
    .build();
StrictMode.setVmPolicy(policy);

或者,您也可以监控包含消息 Please set the grant explicitly in the app 的已记录异常,该消息会在系统隐式设置授予时显示。您可以使用以下 adb 命令监控这些日志:

adb logcat | grep "Please set the grant explicitly in the app"

如需明确授予必要的权限,请将 FLAG_GRANT_READ_URI_PERMISSION标志添加到ACTION_SENDACTION_SEND_MULTIPLEintent:

Kotlin

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

Java

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

对于 ACTION_IMAGE_CAPTURE intent,请同时添加FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION 标志:

Kotlin

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)

Java

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

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

Beginning with Android 17, when the device's configuration changes (for example, through rotation), and this is not handled by the app itself, the previous IME visibility is not restored.

If your app undergoes a configuration change that it does not handle, and the app needs the keyboard to be visible after the change, you must explicitly request this. You can make this request in one of the following ways:

  • Set the android:windowSoftInputMode attribute to stateAlwaysVisible.
  • Programmatically request the soft keyboard in your activity's onCreate() method, or add the onConfigurationChanged() method.

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

A partire da Android 17, il framework audio applica restrizioni alle interazioni audio in background, tra cui la riproduzione audio, le richieste di focus audio e le API di modifica del volume, per garantire che queste modifiche vengano avviate intenzionalmente dall'utente.

Se l'app tenta di chiamare le API audio mentre non si trova in un ciclo di vita valido, le API di riproduzione audio e di modifica del volume non riescono in modo silenzioso senza generare un'eccezione o fornire un messaggio di errore. L'API di focus audio non riesce con il codice risultato AUDIOFOCUS_REQUEST_FAILED.

Per ulteriori informazioni, incluse le strategie di mitigazione, consulta Protezione dell'audio in background .

Connettività

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

Riaccoppiamento autonomo per le perdite di associazione Bluetooth

Android 17 引入了自主重新配对功能,这是一项系统级增强功能,旨在自动解决蓝牙配对信息丢失问题。

以前,如果配对信息丢失,用户必须手动前往“设置”取消配对,然后重新配对外围设备。此功能以 Android 16 的安全改进为基础,允许系统在后台重新建立配对信息,而无需用户手动前往“设置”取消配对并重新配对外围设备。

虽然大多数应用不需要更改代码,但开发者应注意蓝牙堆栈中的以下行为变更:

  • 新的配对上下文ACTION_PAIRING_REQUEST 现在包含 EXTRA_PAIRING_CONTEXT extra,允许应用区分 标准配对请求和自主系统发起的重新配对尝试。
  • 有条件的密钥更新:只有在重新配对成功且新连接达到或超过之前配对信息的安全级别时,才会替换现有安全密钥。
  • 修改后的 intent 时间:现在,只有在自主重新配对尝试失败时,才会广播 ACTION_KEY_MISSING intent。如果系统在后台成功恢复配对信息,则可以减少应用中不必要的错误处理。
  • 用户通知:系统通过新的界面通知和对话框管理重新配对。系统会提示用户确认重新配对尝试,以确保用户了解重新连接。

外围设备制造商和配套应用开发者应验证硬件和应用是否能妥善处理配对信息转换。如需测试此行为,请使用以下任一方法模拟远程配对信息丢失:

  • 从外围设备中手动移除配对信息
  • 在“设置”>“已连接的设备”中手动取消配对设备