Assim como nas versões anteriores, o Android 15 inclui mudanças de comportamento que podem afetar seu app. As mudanças de comportamento a seguir se aplicam exclusivamente a apps destinados ao Android 15 ou versões mais recentes. Caso seu app seja direcionado ao Android 15 ou a versões mais recentes, faça modificações para oferecer suporte a esses comportamentos de forma adequada, quando aplicável.
Consulte também a lista de mudanças de comportamento que afetam todos os apps
executados no Android 15, independente da targetSdkVersion do seu app.
Principal recurso
O Android 15 modifica ou expande vários recursos principais do sistema Android.
Mudanças nos serviços em primeiro plano
Estamos fazendo as seguintes mudanças nos serviços em primeiro plano com o Android 15.
- Comportamento de tempo limite do serviço em primeiro plano de sincronização de dados
- Novo tipo de serviço em primeiro plano de processamento de mídia
- Restrições para broadcast receivers
BOOT_COMPLETEDque iniciam serviços em primeiro plano - Restrições para iniciar serviços em primeiro plano enquanto um app tem a permissão
SYSTEM_ALERT_WINDOW
Comportamento de tempo limite do serviço em primeiro plano da sincronização de dados
O Android 15 introduz um novo comportamento de tempo limite no dataSync para apps destinados
ao Android 15 (nível 35 da API) ou versões mais recentes. Esse comportamento também se aplica ao novo
tipo de serviço em primeiro plano mediaProcessing.
O sistema permite que os serviços dataSync de um app sejam executados por um total de 6 horas
em um período de 24 horas. Depois disso, o sistema chama o método
Service.onTimeout(int, int) do serviço em execução (introduzido no Android
15). No momento, o serviço tem alguns segundos para chamar
Service.stopSelf(). Quando Service.onTimeout() é chamado, o
serviço não é mais considerado um serviço em primeiro plano. Se o serviço não
chamar Service.stopSelf(), o sistema vai gerar uma exceção interna. A
exceção é registrada no Logcat com a seguinte mensagem:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type dataSync did not stop within its timeout: [component name]"
Para evitar problemas com essa mudança de comportamento, faça uma ou mais das seguintes ações:
- Faça com que o serviço implemente o novo método
Service.onTimeout(int, int). Quando o app receber o callback, chamestopSelf()em alguns segundos. Se você não parar o app imediatamente, o sistema vai gerar uma falha. - Os serviços
dataSyncdo app não podem ser executados por mais de 6 horas em um período de 24 horas (a menos que o usuário interaja com o app, redefinindo o timer). - Só inicie serviços em primeiro plano
dataSynccomo resultado da interação direta do usuário. Como o app está em primeiro plano quando o serviço é iniciado, ele tem seis horas completas após o app ir para o segundo plano. - Em vez de usar um serviço em primeiro plano
dataSync, use uma API alternativa.
Se os serviços em primeiro plano dataSync do app tiverem sido executados por seis horas nas últimas
24 horas, não será possível iniciar outro serviço em primeiro plano dataSync a menos que o usuário
tenha trazido o app para o primeiro plano, o que redefine o timer. Se você tentar
iniciar outro serviço em primeiro plano dataSync, o sistema vai gerar
ForegroundServiceStartNotAllowedException
com uma mensagem de erro como "O limite de tempo já foi esgotado para o tipo de serviço em primeiro plano
dataSync".
Teste
Para testar o comportamento do app, ative os timeouts de sincronização de dados mesmo que o app
não esteja segmentado para o Android 15, desde que esteja sendo executado em um dispositivo
Android 15. Para ativar os tempos limite, execute o comando adb:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
Você também pode ajustar o período de tempo limite para facilitar o teste do comportamento
do app quando o limite for atingido. Para definir um novo período de tempo limite, execute o
seguinte comando adb:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
Novo tipo de serviço em primeiro plano de processamento de mídia
Android 15 introduces a new foreground service type, mediaProcessing. This
service type is appropriate for operations like transcoding media files. For
example, a media app might download an audio file and need to convert it to a
different format before playing it. You can use a mediaProcessing foreground
service to make sure the conversion continues even while the app is in the
background.
The system permits an app's mediaProcessing services to run for a total of 6
hours in a 24-hour period, after which the system calls the running service's
Service.onTimeout(int, int) method (introduced in Android
15). At this time, the service has a few seconds to call
Service.stopSelf(). If the service does not
call Service.stopSelf(), the system throws an internal exception. The
exception is logged in Logcat with the following message:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type mediaProcessing did not stop within its timeout: [component name]"
To avoid having the exception, you can do one of the following:
- Have your service implement the new
Service.onTimeout(int, int)method. When your app receives the callback, make sure to callstopSelf()within a few seconds. (If you don't stop the app right away, the system generates a failure.) - Make sure your app's
mediaProcessingservices don't run for more than a total of 6 hours in any 24-hour period (unless the user interacts with the app, resetting the timer). - Only start
mediaProcessingforeground services as a result of direct user interaction; since your app is in the foreground when the service starts, your service has the full six hours after the app goes to the background. - Instead of using a
mediaProcessingforeground service, use an alternative API, like WorkManager.
If your app's mediaProcessing foreground services have run for 6 hours in the
last 24, you cannot start another mediaProcessing foreground service unless
the user has brought your app to the foreground (which resets the timer). If you
try to start another mediaProcessing foreground service, the system throws
ForegroundServiceStartNotAllowedException
with an error message like "Time limit already exhausted for foreground service
type mediaProcessing".
For more information about the mediaProcessing service type, see Changes to
foreground service types for Android 15: Media processing.
Testing
To test your app's behavior, you can enable media processing timeouts even if
your app is not targeting Android 15 (as long as the app is running on an
Android 15 device). To enable timeouts, run the following adb command:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
You can also adjust the timeout period, to make it easier to test how your
app behaves when the limit is reached. To set a new timeout period, run the
following adb command:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds
Restrições em broadcast receivers BOOT_COMPLETED que iniciam serviços em primeiro plano
There are new restrictions on BOOT_COMPLETED broadcast receivers launching
foreground services. BOOT_COMPLETED receivers are not allowed to launch the
following types of foreground services:
dataSynccameramediaPlaybackphoneCallmediaProjectionmicrophone(this restriction has been in place formicrophonesince Android 14)
If a BOOT_COMPLETED receiver tries to launch any of those types of foreground
services, the system throws ForegroundServiceStartNotAllowedException.
Testing
To test your app's behavior, you can enable these new restrictions even if your
app is not targeting Android 15 (as long as the app is running on an Android 15
device). Run the following adb command:
adb shell am compat enable FGS_BOOT_COMPLETED_RESTRICTIONS your-package-name
To send a BOOT_COMPLETED broadcast without restarting the device,
run the following adb command:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED your-package-name
Restrições para iniciar serviços em primeiro plano enquanto um app tem a permissão SYSTEM_ALERT_WINDOW
Anteriormente, se um app tivesse a permissão SYSTEM_ALERT_WINDOW, ele poderia iniciar
um serviço em primeiro plano mesmo que estivesse em segundo plano (conforme
discutido em isenção de restrições de início em segundo plano).
Se um app for destinado ao Android 15, essa isenção será mais restrita. Agora o app precisa
ter a permissão SYSTEM_ALERT_WINDOW e também ter uma janela de sobreposição
visível. Ou seja, o app precisa primeiro abrir uma
janela TYPE_APPLICATION_OVERLAY e a janela
precisa estar visível antes de iniciar um serviço em primeiro plano.
Se o app tentar iniciar um serviço em primeiro plano em segundo plano sem
atender a esses novos requisitos (e não tiver outra isenção), o
sistema vai gerar uma ForegroundServiceStartNotAllowedException.
Se o app declarar a permissão SYSTEM_ALERT_WINDOW
e iniciar serviços em primeiro plano em segundo plano, ele poderá ser afetado por essa
mudança. Se o app receber uma ForegroundServiceStartNotAllowedException, verifique
a ordem das operações e verifique se ele já tem uma janela de sobreposição
ativa antes de tentar iniciar um serviço em primeiro plano em segundo
plano. Você pode conferir se a janela de sobreposição está visível
chamando View.getWindowVisibility() ou
substituir View.onWindowVisibilityChanged()
para receber uma notificação sempre que a visibilidade mudar.
Teste
Para testar o comportamento do app, ative essas novas restrições mesmo que ele
não seja direcionado ao Android 15, desde que esteja sendo executado em um dispositivo
Android 15. Para ativar essas novas restrições na inicialização de serviços em primeiro plano
em segundo plano, execute este comando adb:
adb shell am compat enable FGS_SAW_RESTRICTIONS your-package-name
Mudanças em quando os apps podem modificar o estado global do modo Não perturbe
Os apps direcionados ao Android 15 (nível 35 da API) e mais recentes não podem mais mudar o
estado global ou a política de Não perturbe (DND, na sigla em inglês) em um dispositivo, seja modificando
as configurações do usuário ou desativando o modo DND. Em vez disso, os apps precisam contribuir com um
AutomaticZenRule, que o sistema combina em uma política global com o
esquema de política mais restritiva. As chamadas para APIs que
afetam o estado global (setInterruptionFilter,
setNotificationPolicy) resultam na criação ou atualização de um
AutomaticZenRule implícito, que é ativado e desativado dependendo do ciclo de chamadas
dessas chamadas de API.
Essa mudança só afeta o comportamento observável se o app estiver chamando
setInterruptionFilter(INTERRUPTION_FILTER_ALL) e esperar que essa chamada desative uma AutomaticZenRule que foi ativada anteriormente pelos proprietários.
Mudanças na API OpenJDK
Android 15 continues the work of refreshing Android's core libraries to align with the features in the latest OpenJDK LTS releases.
Some of these changes can affect app compatibility for apps targeting Android 15 (API level 35):
Changes to string formatting APIs: Validation of argument index, flags, width, and precision are now more strict when using the following
String.format()andFormatter.format()APIs:String.format(String, Object[])String.format(Locale, String, Object[])Formatter.format(String, Object[])Formatter.format(Locale, String, Object[])
For example, the following exception is thrown when an argument index of 0 is used (
%0in the format string):IllegalFormatArgumentIndexException: Illegal format argument index = 0In this case, the issue can be fixed by using an argument index of 1 (
%1in the format string).Changes to component type of
Arrays.asList(...).toArray(): When usingArrays.asList(...).toArray(), the component type of the resulting array is now anObject—not the type of the underlying array's elements. So the following code throws aClassCastException:String[] elements = (String[]) Arrays.asList("one", "two").toArray();For this case, to preserve
Stringas the component type in the resulting array, you could useCollection.toArray(Object[])instead:String[] elements = Arrays.asList("two", "one").toArray(new String[0]);Changes to language code handling: When using the
LocaleAPI, language codes for Hebrew, Yiddish, and Indonesian are no longer converted to their obsolete forms (Hebrew:iw, Yiddish:ji, and Indonesian:in). When specifying the language code for one of these locales, use the codes from ISO 639-1 instead (Hebrew:he, Yiddish:yi, and Indonesian:id).Changes to random int sequences: Following the changes made in https://bugs.openjdk.org/browse/JDK-8301574, the following
Random.ints()methods now return a different sequence of numbers than theRandom.nextInt()methods do:Generally, this change shouldn't result in app-breaking behavior, but your code shouldn't expect the sequence generated from
Random.ints()methods to matchRandom.nextInt().
The new SequencedCollection API can affect your app's compatibility
after you update compileSdk in your app's build configuration to use
Android 15 (API level 35):
Collision with
MutableList.removeFirst()andMutableList.removeLast()extension functions inkotlin-stdlibThe
Listtype in Java is mapped to theMutableListtype in Kotlin. Because theList.removeFirst()andList.removeLast()APIs have been introduced in Android 15 (API level 35), the Kotlin compiler resolves function calls, for examplelist.removeFirst(), statically to the newListAPIs instead of to the extension functions inkotlin-stdlib.If an app is re-compiled with
compileSdkset to35andminSdkset to34or lower, and then the app is run on Android 14 and lower, a runtime error is thrown:java.lang.NoSuchMethodError: No virtual method removeFirst()Ljava/lang/Object; in class Ljava/util/ArrayList;The existing
NewApilint option in Android Gradle Plugin can catch these new API usages../gradlew lintMainActivity.kt:41: Error: Call requires API level 35 (current min is 34): java.util.List#removeFirst [NewApi] list.removeFirst()To fix the runtime exception and lint errors, the
removeFirst()andremoveLast()function calls can be replaced withremoveAt(0)andremoveAt(list.lastIndex)respectively in Kotlin. If you're using Android Studio Ladybug | 2024.1.3 or higher, it also provides a quick fix option for these errors.Consider removing
@SuppressLint("NewApi")andlintOptions { disable 'NewApi' }if the lint option has been disabled.Collision with other methods in Java
New methods have been added into the existing types, for example,
ListandDeque. These new methods might not be compatible with the methods with the same name and argument types in other interfaces and classes. In the case of a method signature collision with incompatibility, thejavaccompiler outputs a build-time error. For example:Example error 1:
javac MyList.javaMyList.java:135: error: removeLast() in MyList cannot implement removeLast() in List public void removeLast() { ^ return type void is not compatible with Object where E is a type-variable: E extends Object declared in interface ListExample error 2:
javac MyList.javaMyList.java:7: error: types Deque<Object> and List<Object> are incompatible; public class MyList implements List<Object>, Deque<Object> { both define reversed(), but with unrelated return types 1 errorExample error 3:
javac MyList.javaMyList.java:43: error: types List<E#1> and MyInterface<E#2> are incompatible; public static class MyList implements List<Object>, MyInterface<Object> { class MyList inherits unrelated defaults for getFirst() from types List and MyInterface where E#1,E#2 are type-variables: E#1 extends Object declared in interface List E#2 extends Object declared in interface MyInterface 1 errorTo fix these build errors, the class implementing these interfaces should override the method with a compatible return type. For example:
@Override public Object getFirst() { return List.super.getFirst(); }
Segurança
O Android 15 inclui mudanças que promovem a segurança do sistema para ajudar a proteger apps e usuários contra apps maliciosos.
Versões TLS restritas
O Android 15 restringe o uso das versões 1.0 e 1.1 do TLS. Essas versões foram descontinuadas no Android, mas agora não são mais permitidas para apps destinados ao Android 15.
Início de atividades em segundo plano seguras
Android 15 protects users from malicious apps and gives them more control over their devices by adding changes that prevent malicious background apps from bringing other apps to the foreground, elevating their privileges, and abusing user interaction. Background activity launches have been restricted since Android 10 (API level 29).
Other changes
- Change
PendingIntentcreators to block background activity launches by default. This helps prevent apps from accidentally creating aPendingIntentthat could be abused by malicious actors. - Don't bring an app to the foreground unless the
PendingIntentsender allows it. This change aims to prevent malicious apps from abusing the ability to start activities in the background. By default, apps are not allowed to bring the task stack to the foreground unless the creator allows background activity launch privileges or the sender has background activity launch privileges. - Control how the top activity of a task stack can finish its task. If the top activity finishes a task, Android will go back to whichever task was last active. Moreover, if a non-top activity finishes its task, Android will go back to the home screen; it won't block the finish of this non-top activity.
- Prevent launching arbitrary activities from other apps into your own task. This change prevents malicious apps from phishing users by creating activities that appear to be from other apps.
- Block non-visible windows from being considered for background activity launches. This helps prevent malicious apps from abusing background activity launches to display unwanted or malicious content to users.
Intents mais seguras
Android 15 introduces StrictMode for
intents.
In order to see detailed logs about Intent usage violations, use following
method:
Kotlin
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() .detectUnsafeIntentLaunch() .build() ) }
Java
public void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() .detectUnsafeIntentLaunch() .build()); }
Experiência do usuário e interface do sistema
O Android 15 inclui algumas mudanças que visam criar uma experiência do usuário mais consistente e intuitiva.
Mudanças no encarte da janela
Há duas mudanças relacionadas aos engastes de janela no Android 15: o engaste de borda a borda é forçado por padrão, e também há mudanças de configuração, como a configuração padrão das barras do sistema.
Aplicação de ponta a ponta
Os apps são de ponta a ponta por padrão em dispositivos com Android 15 se o app for destinado ao Android 15 (nível 35 da API).
Essa é uma mudança incompatível que pode afetar negativamente a interface do seu app. As mudanças afetam as seguintes áreas da interface:
- Barra de navegação com alça de gesto
- Transparente por padrão.
- O deslocamento da parte de baixo está desativado, então o conteúdo é mostrado por trás da barra de navegação do sistema, a menos que encartes sejam aplicados.
setNavigationBarColoreR.attr#navigationBarColorestão descontinuados e não afetam a navegação por gestos.setNavigationBarContrastEnforcedeR.attr#navigationBarContrastEnforcedcontinuam sem efeito na navegação por gestos.
- Navegação com três botões
- Opacidade definida como 80% por padrão, com a cor possivelmente correspondendo ao plano de fundo da janela.
- Deslocamento da parte de baixo desativado para que o conteúdo seja mostrado por trás da barra de navegação do sistema, a menos que encartes sejam aplicados.
setNavigationBarColoreR.attr#navigationBarColorsão definidos para corresponder ao plano de fundo da janela por padrão. O plano de fundo da janela precisa ser um drawable de cor para que esse padrão seja aplicado. Essa API está descontinuada, mas continua afetando a navegação com três botões.setNavigationBarContrastEnforcedeR.attr#navigationBarContrastEnforcedsão verdadeiros por padrão, o que adiciona um plano de fundo 80% opaco na navegação com três botões.
- Barra de status
- Transparente por padrão.
- O deslocamento da parte de cima é desativado, então o conteúdo é mostrado por trás da barra de status, a menos que encartes sejam aplicados.
setStatusBarColoreR.attr#statusBarColorforam descontinuados e não têm efeito no Android 15.setStatusBarContrastEnforcedeR.attr#statusBarContrastEnforcedforam descontinuados, mas ainda têm um efeito no Android 15.
- Corte da tela
- O
layoutInDisplayCutoutModede janelas não flutuantes precisa serLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS.SHORT_EDGES,NEVEReDEFAULTsão interpretados comoALWAYSpara que os usuários não vejam uma barra preta causada pelo corte da tela e apareçam de ponta a ponta.
- O
O exemplo a seguir mostra um app antes e depois de ser direcionado ao Android 15 (nível 35 da API) e antes e depois de aplicar encartes. Este exemplo não é abrangente e pode aparecer de maneira diferente no Android Auto.
O que verificar se o app já é de ponta a ponta
Se o app já for de ponta a ponta e aplicar encartes, você não será muito afetado, exceto nos seguintes cenários. No entanto, mesmo que você não acredite que seu app foi afetado, recomendamos que você o teste.
- Você tem uma janela não flutuante, como um
Activityque usaSHORT_EDGES,NEVERouDEFAULTem vez deLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS. Se o app falhar na inicialização, isso pode ser devido à tela de apresentação. Você pode fazer upgrade da dependência core splashscreen para 1.2.0-alpha01 ou uma versão mais recente ou definirwindow.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always. - Pode haver telas com menos tráfego e interface obstruída. Verifique se essas telas menos visitadas não têm uma interface obstruída. As telas com menos tráfego incluem:
- Telas de onboarding ou login
- Páginas de configurações
O que verificar se o app ainda não é de ponta a ponta
Se o app ainda não estiver de ponta a ponta, é provável que você seja afetado. Além dos cenários para apps que já são de ponta a ponta, considere o seguinte:
- Se o app usar componentes do Material 3 (
androidx.compose.material3) no Compose, comoTopAppBar,BottomAppBareNavigationBar, é provável que esses componentes não sejam afetados porque processam encartes automaticamente. - Se o app estiver usando componentes do Material 2 (
androidx.compose.material) no Compose, eles não vão processar encartes automaticamente. No entanto, você pode conseguir acesso aos encartes para fazer a aplicação manual. No androidx.compose.material 1.6.0 e versões mais recentes, use o parâmetrowindowInsetspara aplicar os encartes manualmente paraBottomAppBar,TopAppBar,BottomNavigationeNavigationRail. Da mesma forma, use o parâmetrocontentWindowInsetsparaScaffold. - Se o app usa views e componentes do Material Design
(
com.google.android.material), a maioria dos componentes do Material baseados em views, comoBottomNavigationView,BottomAppBar,NavigationRailViewouNavigationView, processa encartes e não exige mais trabalho. No entanto, você precisará adicionarandroid:fitsSystemWindows="true"se estiver usandoAppBarLayout. - Para elementos combináveis personalizados, aplique os encartes manualmente como padding. Se o conteúdo estiver em um
Scaffold, use os valores de padding Scaffoldpara consumir encartes. Caso contrário, aplique o padding usando um dosWindowInsets. - Se o app estiver usando visualizações e
BottomSheet,SideSheetou contêineres personalizados, aplique padding usandoViewCompat.setOnApplyWindowInsetsListener. ParaRecyclerView, aplique padding usando esse listener e também adicioneclipToPadding="false".
O que verificar se o app precisa oferecer proteção de plano de fundo personalizada
Se o app precisar oferecer proteção de plano de fundo personalizada para a navegação com três botões ou
a barra de status, ele deverá colocar um elemento combinável ou uma visualização atrás da barra de sistema
usando WindowInsets.Type#tappableElement() para receber a altura da barra de navegação
com três botões ou WindowInsets.Type#statusBars.
Outros recursos de ponta a ponta
Consulte os guias Visualizações de ponta a ponta e Compose de ponta a ponta para mais considerações sobre a aplicação de encartes.
APIs descontinuadas
As APIs a seguir estão descontinuadas, mas não desativadas:
R.attr#enforceStatusBarContrastR.attr#navigationBarColor(para navegação com três botões, com alfa de 80%)Window#isStatusBarContrastEnforcedWindow#setNavigationBarColor(para navegação com três botões, com alfa de 80%)Window#setStatusBarContrastEnforced
As seguintes APIs estão desativadas:
R.attr#navigationBarColor(para navegação por gestos)R.attr#navigationBarDividerColorR.attr#statusBarColorWindow#setDecorFitsSystemWindowsWindow#getNavigationBarColorWindow#getNavigationBarDividerColorWindow#getStatusBarColorWindow#setNavigationBarColor(para navegação por gestos)Window#setNavigationBarDividerColorWindow#setStatusBarColor
Configuração estável
Se o app for direcionado ao Android 15 (API de nível 35) ou versões mais recentes, Configuration não vai mais excluir as barras de sistema. Se você usar o tamanho da tela na classe Configuration para cálculo de layout, substitua por alternativas melhores, como um ViewGroup, WindowInsets ou WindowMetricsCalculator adequado, dependendo da sua necessidade.
O Configuration está disponível desde a API 1. Normalmente, ele é obtido de
Activity.onConfigurationChanged. Ele fornece informações como densidade,
orientação e tamanhos da janela. Uma característica importante sobre os tamanhos de janela
retornados de Configuration é que ele excluía as barras de sistema.
O tamanho da configuração é usado normalmente para seleção de recursos, como
/res/layout-h500dp, e ainda é um caso de uso válido. No entanto, o uso para cálculo de layout sempre foi desencorajado. Se você estiver fazendo isso, pare agora. Substitua o uso de Configuration por algo mais adequado, dependendo do seu caso de uso.
Se você usar para calcular o layout, use um ViewGroup adequado, como
CoordinatorLayout ou ConstraintLayout. Se você usar para determinar a altura
da barra de navegação do sistema, use WindowInsets. Se quiser saber o tamanho atual
da janela do app, use computeCurrentWindowMetrics.
A lista a seguir descreve os campos afetados por essa mudança:
- Os tamanhos
Configuration.screenWidthDpescreenHeightDpnão excluem mais as barras de sistema. Configuration.smallestScreenWidthDpé afetado indiretamente por mudanças emscreenWidthDpescreenHeightDp.- O
Configuration.orientationé afetado indiretamente por mudanças noscreenWidthDpe noscreenHeightDpem dispositivos quase quadrados. Display.getSize(Point)é afetado indiretamente pelas mudanças emConfiguration. Esse recurso foi descontinuado a partir do nível 30 da API.- O
Display.getMetrics()já funciona assim desde o nível 33 da API.
O atributo "elegantTextHeight" tem como padrão o valor "true".
For apps targeting Android 15 (API level 35), the
elegantTextHeight TextView attribute
becomes true by default, replacing the compact font used by default with some
scripts that have large vertical metrics with one that is much more readable.
The compact font was introduced to prevent breaking layouts; Android 13 (API
level 33) prevents many of these breakages by allowing the text layout to
stretch the vertical height utilizing the fallbackLineSpacing
attribute.
In Android 15, the compact font still remains in the system, so your app can set
elegantTextHeight to false to get the same behavior as before, but it is
unlikely to be supported in upcoming releases. So, if your app supports the
following scripts: Arabic, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam,
Odia, Telugu or Thai, test your app by setting elegantTextHeight to true.
elegantTextHeight behavior for apps targeting Android 14 (API level 34) and lower.
elegantTextHeight behavior for apps targeting Android 15.Mudanças na largura da TextView para formas de letras complexas
In previous versions of Android, some cursive fonts or languages that have
complex shaping might draw the letters in the previous or next character's area.
In some cases, such letters were clipped at the beginning or ending position.
Starting in Android 15, a TextView allocates width for drawing enough space
for such letters and allows apps to request extra paddings to the left to
prevent clipping.
Because this change affects how a TextView decides the width, TextView
allocates more width by default if the app targets Android 15 (API level 35) or
higher. You can enable or disable this behavior by calling the
setUseBoundsForWidth API on TextView.
Because adding left padding might cause a misalignment for existing layouts, the
padding is not added by default even for apps that target Android 15 or higher.
However, you can add extra padding to preventing clipping by calling
setShiftDrawingOffsetForStartOverhang.
The following examples show how these changes can improve text layout for some fonts and languages.
<TextView android:fontFamily="cursive" android:text="java" />
<TextView android:fontFamily="cursive" android:text="java" android:useBoundsForWidth="true" android:shiftDrawingOffsetForStartOverhang="true" />
<TextView android:text="คอมพิวเตอร์" />
<TextView android:text="คอมพิวเตอร์" android:useBoundsForWidth="true" android:shiftDrawingOffsetForStartOverhang="true" />
Altura da linha padrão sensível à localidade para EditText
In previous versions of Android, the text layout stretched the height of the
text to meet the line height of the font that matched the current locale. For
example, if the content was in Japanese, because the line height of the Japanese
font is slightly larger than the one of a Latin font, the height of the text
became slightly larger. However, despite these differences in line heights, the
EditText element was sized uniformly, regardless
of the locale being used, as illustrated in the following image:
EditText elements that
can contain text from English (en), Japanese (ja), and Burmese (my). The
height of the EditText is the same, even though these languages
have different line heights from each other.For apps targeting Android 15 (API level 35), a minimum line height is now
reserved for EditText to match the reference font for the specified Locale, as
shown in the following image:
EditText elements that
can contain text from English (en), Japanese (ja), and Burmese (my). The
height of the EditText now includes space to accommodate the
default line height for these languages' fonts.If needed, your app can restore the previous behavior by specifying the
useLocalePreferredLineHeightForMinimum attribute
to false, and your app can set custom minimum vertical metrics using the
setMinimumFontMetrics API in Kotlin and Java.
Câmera e mídia
O Android 15 faz as seguintes mudanças no comportamento de mídia e câmera para apps direcionados ao Android 15 ou versões mais recentes.
Restrições ao solicitar a seleção de áudio
Apps that target Android 15 (API level 35) must be the top app or running a
foreground service in order to request audio focus. If an app
attempts to request focus when it does not meet one of these requirements, the
call returns AUDIOFOCUS_REQUEST_FAILED.
You can learn more about audio focus at Manage audio focus.
Atualização das restrições não SDK
O Android 15 inclui listas atualizadas de interfaces não SDK restritas com base na colaboração com desenvolvedores Android e nos testes internos mais recentes. Antes de restringirmos interfaces não SDK, sempre que possível, garantimos que haja alternativas públicas disponíveis.
Caso seu app não seja destinado ao Android 15, é possível que algumas dessas mudanças não afetem você imediatamente. No entanto, embora seja possível que seu app acesse algumas interfaces não SDK dependendo do nível da API de destino do app, o uso de qualquer método ou campo não SDK sempre apresenta um alto risco de corromper o app.
Se você não souber se seu app usa interfaces não SDK, poderá testá-lo para descobrir. Se ele depende de interfaces não SDK, comece a planejar uma migração para alternativas SDK. No entanto, entendemos que alguns apps têm casos de uso válidos para interfaces não SDK. Se você não encontrar uma alternativa para deixar de usar uma interface não SDK em um recurso no seu app, solicite uma nova API pública.
Para saber mais sobre as mudanças dessa versão do Android, consulte Atualizações para restrições de interfaces não SDK no Android 15. Para saber mais sobre interfaces não SDK em geral, consulte Restrições para interfaces não SDK.