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 delle app
Android 17 introduces app memory limits based on the device's total RAM to create a more stable and deterministic environment for your apps and Android users. These limits focus on memory leaks and other outliers before they trigger system-wide instability resulting in UI stuttering, higher battery drain, and apps being killed. While we anticipate minimal impact on the vast majority of app sessions, we recommend the following memory best practices, including establishing a baseline for memory.
You can determine if your app session was impacted by calling
getDescription in ApplicationExitInfo; if your app was
affected, the exit reason will be REASON_OTHER and
the description will contain the string "MemoryLimiter:AnonSwap" along with
other information. You can also use trigger-based profiling with
TRIGGER_TYPE_ANOMALY to get heap dumps that are collected when the
memory limit is hit.
The Manage your app's memory documentation gives information to help you diagnose your app's memory issues and optimize its resource consumption.
Test your app's behavior under the memory constraints
You can use Android Debug Bridge (adb) to adjust or disable the
memory limits on any device that imposes them. The shell command am
provides three subcommands to adjust the memory limits. (These commands have
no effect on a device which does not impose memory limits.)
am memory-limiter ignore <uid>|none|allam memory-limiter manual <pid> <limit>|max|noneam memory-limiter status
ignoreInstructs the memory limiter to ignore some or all processes. Passing a UID (Android User ID) instructs the memory limiter to ignore enforcement on all processes associated with that UID. You can also pass
all(ignore all apps) ornone(do not ignore any apps). Passingnoneoverrides any previous calls toam memory-limiter ignore.If you instruct the memory limiter to ignore a UID, you can still apply a manual memory limit to a process within the app by calling
am memory-limiter manual.manualInstructs the system to impose a memory constraint on the process with the specified PID (Process ID). The memory constraint is specified as an integer number of MB; for example, passing
30specifies that the process is limited to 30 MB of memory. Passingmaxremoves all memory limits on that process. Passingnoneremoves any manual limits set on the process, restoring the system's default limit (if any).statusReports the current status of the memory limiter. The status includes the memory limits imposed on visible and non-visible processes.
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 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
In una versione futura, prevediamo di ritirare l'elemento usesCleartextTraffic.
Le app che devono effettuare connessioni non criptate (HTTP) devono eseguire la migrazione all'utilizzo di un file di configurazione della sicurezza di rete, che consente di specificare a quali domini la tua app deve effettuare connessioni in testo non criptato.
Tieni presente che i file di configurazione della sicurezza di rete sono supportati solo sui livelli API 24 e successivi. Se la tua app ha un livello API minimo inferiore a 24, devi fare entrambe le seguenti operazioni:
- Imposta l'attributo
usesCleartextTrafficsutrue - Utilizzare un file di configurazione di rete
Se il livello API minimo della tua app è 24 o superiore, puoi utilizzare un file di configurazione di rete e non devi impostare usesCleartextTraffic.
Limita le concessioni implicite di URI
Currently, if an app launches an intent with a URI that has the action
ACTION_SEND, ACTION_SEND_MULTIPLE, or
ACTION_IMAGE_CAPTURE, the system automatically grants the read and
write URI permissions to the target app. Starting in Android 18, the system will
no longer automatically grant these permissions. For this reason, we recommend
that apps explicitly grant the
relevant URI permissions instead of relying on the system to grant them.
To detect the usage of these intents in your app, use StrictMode with
detectImplicitUriPermissionGrant() to trigger a violation:
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);
Alternatively, you can monitor for logged exceptions containing the message
Please set the grant explicitly in the app that appears when system implicitly
sets the grant. You can monitor for these logs
using the following adb command:
adb logcat | grep "Please set the grant explicitly in the app"
To explicitly grant the necessary permissions, add the
FLAG_GRANT_READ_URI_PERMISSION flag to ACTION_SEND and
ACTION_SEND_MULTIPLE intents:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Include both FLAG_GRANT_READ_URI_PERMISSION and
FLAG_GRANT_WRITE_URI_PERMISSION flags for
ACTION_IMAGE_CAPTURE intents:
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
Apps should avoid creating excessive numbers of keys in Android Keystore, because it is a shared resource for all apps on the device. Beginning with Android 17, the system enforces a limit on the number of keys an app can own. The limit is 50,000 keys for non-system apps targeting Android 17 (API level 37) or higher, and 200,000 keys for all other apps. System apps have a limit of 200,000 keys, regardless of which API level they target.
If an app attempts to create keys beyond the limit, the creation fails with a
KeyStoreException. The exception's message string contains information
about the key limit. If the app calls getNumericErrorCode() on the
exception, the return value depends on what API level the app targets:
- Apps targeting Android 17 (API level 37) or higher:
getNumericErrorCode()returns the newERROR_TOO_MANY_KEYSvalue. - All other apps:
getNumericErrorCode()returnsERROR_INCORRECT_USAGE.
Bloccare il traffico di loopback tra profili
Beginning with Android 17, cross-profile loopback traffic is no longer permitted by default. Loopback traffic within the same profile is not affected. This change applies to all apps running on Android 17 or higher, regardless of what API level the app targets.
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, a causa della rotazione) e questa modifica non viene gestita dall'app stessa, la visibilità della tastiera IME precedente non viene ripristinata.
Se la tua app subisce una modifica alla configurazione che non gestisce e deve visualizzare la tastiera dopo la modifica, devi richiederlo esplicitamente. Puoi effettuare questa richiesta in uno dei seguenti modi:
- Imposta l'attributo
android:windowSoftInputModesustateAlwaysVisible. - Richiedi la tastiera su schermo a livello di programmazione nel metodo
onCreate()dell'attività o aggiungi il metodoonConfigurationChanged().
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 relativa a View.POINTER_CAPTURE_MODE_RELATIVE.
In precedenza, il sistema non tentava di riconoscere i gesti dal touchpad
e inviava invece le posizioni assolute e non elaborate delle dita all'app in un formato simile
ai tocchi del 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
Beginning with Android 17, the audio framework enforces restrictions on background audio interactions including audio playback, audio focus requests, and volume change APIs to ensure that these changes are started intentionally by the user.
If the app tries to call audio APIs while the app is not in a valid lifecycle,
the audio playback and volume change APIs fail silently without throwing an
exception or providing a failure message. The audio focus API fails with the
result code AUDIOFOCUS_REQUEST_FAILED.
For more information, including mitigation strategies, see Background audio hardening.
Connettività
Android 17 include le seguenti modifiche per migliorare la connettività dei dispositivi.
Riaccoppiamento autonomo per le perdite di associazione Bluetooth
Android 17 introduce l'accoppiamento autonomo, un miglioramento a livello di sistema progettato per risolvere automaticamente la perdita dell'associazione Bluetooth.
In precedenza, se un accessorio si perdeva, gli utenti dovevano andare manualmente in Impostazioni per disaccoppiarlo e poi accoppiarlo di nuovo. Questa funzionalità si basa sul miglioramento della sicurezza di Android 16 consentendo al sistema di ristabilire le connessioni in background senza richiedere agli utenti di accedere manualmente alle Impostazioni per disaccoppiare e accoppiare nuovamente le periferiche.
Sebbene la maggior parte delle app non richieda modifiche al codice, gli sviluppatori devono essere a conoscenza delle seguenti modifiche al comportamento nello stack Bluetooth:
- Nuovo contesto di accoppiamento:l'intent
ACTION_PAIRING_REQUESTora include l'extraEXTRA_PAIRING_CONTEXT, che consente alle app di distinguere tra una richiesta di accoppiamento standard e un tentativo di riaccoppiamento avviato dal sistema autonomo. - Aggiornamenti condizionali delle chiavi:i token di sicurezza esistenti verranno sostituiti solo se l'accoppiamento viene eseguito correttamente e la nuova connessione soddisfa o supera il livello di sicurezza dell'associazione precedente.
- Tempistica dell'intent modificata: l'intent
ACTION_KEY_MISSINGviene ora trasmesso solo se il tentativo di riaccoppiamento autonomo non va a buon fine. In questo modo si riduce la gestione degli errori non necessari nell'app se il sistema recupera correttamente l'associazione in background. - Notifica utente: il sistema gestisce l'accoppiamento tramite nuove notifiche e finestre di dialogo dell'interfaccia utente. Agli utenti verrà chiesto di confermare il tentativo di riaccoppiamento 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 accoppiamento. Per testare questo comportamento, simula una perdita di accoppiamento remoto utilizzando uno dei seguenti metodi:
- Rimuovere manualmente le informazioni di accoppiamento dalla periferica
- Disaccoppia manualmente il dispositivo in Impostazioni > Dispositivi connessi