Android 14, önceki sürümlerde olduğu gibi uygulamanızı etkileyebilecek davranış değişiklikleri içerir. Aşağıdaki davranış değişiklikleri yalnızca Android 14 (API düzeyi 34) veya sonraki sürümleri hedefleyen uygulamalar için geçerlidir. Uygulamanız Android 14 veya sonraki sürümleri hedefliyorsa geçerli durumlarda bu davranışları düzgün şekilde destekleyecek şekilde değiştirmeniz gerekir.
Uygulamanın targetSdkVersion değerinden bağımsız olarak, Android 14'te çalışan tüm uygulamaları etkileyen davranış değişikliklerinin listesini de inceleyin.
Temel işlevler
Ön plan hizmeti türleri zorunludur
If your app targets Android 14 (API level 34) or higher, it must specify at least one foreground service type for each foreground service within your app. You should choose a foreground service type that represents your app's use case. The system expects foreground services that have a particular type to satisfy a particular use case.
If a use case in your app isn't associated with any of these types, it's strongly recommended that you migrate your logic to use WorkManager or user-initiated data transfer jobs.
BluetoothAdapter'da BLUETOOTH_CONNECT izninin zorunlu kılınması
Android 14, Android 14 (API düzeyi 34) veya sonraki sürümleri hedefleyen uygulamalar için BluetoothAdapter getProfileConnectionState() yöntemi çağrılırken BLUETOOTH_CONNECT iznini zorunlu kılar.
Bu yöntem için BLUETOOTH_CONNECT izni zaten gerekliydi ancak bu şart uygulanmadı. Uygulamanızın, aşağıdaki snippet'te gösterildiği gibi BLUETOOTH_CONNECT öğesini uygulamanızın AndroidManifest.xml dosyasında beyan ettiğinden emin olun ve getProfileConnectionState öğesini çağırmadan önce kullanıcının izin verip vermediğini kontrol edin.
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
OpenJDK 17 güncellemeleri
Android 14 continues the work of refreshing Android's core libraries to align with the features in the latest OpenJDK LTS releases, including both library updates and Java 17 language support for app and platform developers.
A few of these changes can affect app compatibility:
- Changes to regular expressions: Invalid group references are now
disallowed to more closely follow the semantics of OpenJDK. You might see
new cases where an
IllegalArgumentExceptionis thrown by thejava.util.regex.Matcherclass, so make sure to test your app for areas that use regular expressions. To enable or disable this change while testing, toggle theDISALLOW_INVALID_GROUP_REFERENCEflag using the compatibility framework tools. - UUID handling: The
java.util.UUID.fromString()method now does more strict checks when validating the input argument, so you might see anIllegalArgumentExceptionduring deserialization. To enable or disable this change while testing, toggle theENABLE_STRICT_VALIDATIONflag using the compatibility framework tools. - ProGuard issues: In some cases, the addition of the
java.lang.ClassValueclass causes an issue if you try to shrink, obfuscate, and optimize your app using ProGuard. The problem originates with a Kotlin library that changes runtime behaviour based on whetherClass.forName("java.lang.ClassValue")returns a class or not. If your app was developed against an older version of the runtime without thejava.lang.ClassValueclass available, then these optimizations might remove thecomputeValuemethod from classes derived fromjava.lang.ClassValue.
JobScheduler, geri çağırma ve ağ davranışını güçlendirir
Job Scheduler, kullanıma sunulduğu andan itibaren uygulamanızın
Birkaç saniye içinde onStartJob veya onStopJob. Android 14'ten önce
bir iş çok uzun süre çalışırsa iş durdurulur ve sessizce başarısız olur.
Uygulamanız Android 14 (API düzeyi 34) veya sonraki sürümleri hedefliyorsa ve ana iş parçacığında izin verilen süreyi aşıyorsa "onStartJob için yanıt yok" veya "onStopJob için yanıt yok" hata mesajıyla bir ANR tetikler.
Bu ANR, 2 senaryoya bağlı olabilir:
1. Ana iş parçacığını engelleyen ve geri çağırmaları engelleyen bir iş var (onStartJob)
veya onStopJob beklenen süre sınırı içinde yürütülmesini ve tamamlanmasını engeller.
2. Geliştirici, JobScheduler içinde engelleme çalışmasını çalıştırıyor
onStartJob veya onStopJob geri çağırması, geri çağırmanın önüne geçer.
beklenen süre aşılmadan
tamamlanmasıdır.
1. sorunu gidermek için ANR oluştuğunda ana iş parçacığının ne tarafından engellendiğini daha ayrıntılı bir şekilde hata ayıklamanız gerekir. ANR oluştuğunda tombstone izlemeyi almak için ApplicationExitInfo#getTraceInputStream()'i kullanarak bunu yapabilirsiniz. ANR'yi manuel olarak yeniden oluşturabiliyorsanız
sistem izleme kaydedebilir ve
Android Studio veya Perfetto ile hangi uygulamaların yüklü olduğunu daha iyi anlayın
ANR gerçekleştiğinde ana iş parçacığı.
Bunun doğrudan JobScheduler API'yi kullanırken olabileceğini unutmayın
veya androidx kitaplığını kullanabilirsiniz.
2. sorunu gidermek için onStartJob veya onStopJob'deki tüm işlemleri asenkron bir iş parçacığında sarmalama desteği sunan WorkManager'a geçiş yapabilirsiniz.
JobScheduler, setRequiredNetworkType veya setRequiredNetwork kısıtlaması kullanılıyorsa ACCESS_NETWORK_STATE iznini beyan etme şartını da getirir. Uygulamanız
İşi planlarken ACCESS_NETWORK_STATE izni
Android 14 veya sonraki sürümlerde SecurityException oluşur.
Tiles launch API
For apps targeting 14 and higher,
TileService#startActivityAndCollapse(Intent) is deprecated and now throws
an exception when called. If your app launches activities from tiles, use
TileService#startActivityAndCollapse(PendingIntent) instead.
Gizlilik
Fotoğraflara ve videolara kısmi erişim
Android 14 introduces Selected Photos Access, which allows users to grant apps access to specific images and videos in their library, rather than granting access to all media of a given type.
This change is only enabled if your app targets Android 14 (API level 34) or higher. If you don't use the photo picker yet, we recommend implementing it in your app to provide a consistent experience for selecting images and videos that also enhances user privacy without having to request any storage permissions.
If you maintain your own gallery picker using storage permissions and need to
maintain full control over your implementation, adapt your implementation
to use the new READ_MEDIA_VISUAL_USER_SELECTED permission. If your app
doesn't use the new permission, the system runs your app in a compatibility
mode.
Kullanıcı deneyimi
Güvenli tam ekran intent bildirimleri
With Android 11 (API level 30), it was possible for any app to use
Notification.Builder.setFullScreenIntent to send full-screen
intents while the phone is locked. You could auto-grant this on app install by
declaring USE_FULL_SCREEN_INTENT permission in the
AndroidManifest.
Full-screen intent notifications are designed for extremely high-priority
notifications demanding the user's immediate attention, such as an incoming
phone call or alarm clock settings configured by the user. For apps targeting
Android 14 (API level 34) or higher, apps that are allowed to use this
permission are limited to those that provide calling and alarms only. The Google
Play Store revokes default USE_FULL_SCREEN_INTENT permissions for any apps
that don't fit this profile. The deadline for these policy changes is May 31,
2024.
This permission remains enabled for apps installed on the phone before the user updates to Android 14. Users can turn this permission on and off.
You can use the new API
NotificationManager.canUseFullScreenIntent to check if your app
has the permission; if not, your app can use the new intent
ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT to launch the settings
page where users can grant the permission.
Güvenlik
Örtülü ve bekleyen amaçlarla ilgili kısıtlamalar
For apps targeting Android 14 (API level 34) or higher, Android restricts apps from sending implicit intents to internal app components in the following ways:
- Implicit intents are only delivered to exported components. Apps must either use an explicit intent to deliver to unexported components, or mark the component as exported.
- If an app creates a mutable pending intent with an intent that doesn't specify a component or package, the system throws an exception.
These changes prevent malicious apps from intercepting implicit intents that are intended for use by an app's internal components.
For example, here is an intent filter that could be declared in your app's manifest file:
<activity
android:name=".AppActivity"
android:exported="false">
<intent-filter>
<action android:name="com.example.action.APP_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
If your app tried to launch this activity using an implicit intent, an
ActivityNotFoundException exception would be thrown:
Kotlin
// Throws an ActivityNotFoundException exception when targeting Android 14. context.startActivity(Intent("com.example.action.APP_ACTION"))
Java
// Throws an ActivityNotFoundException exception when targeting Android 14. context.startActivity(new Intent("com.example.action.APP_ACTION"));
To launch the non-exported activity, your app should use an explicit intent instead:
Kotlin
// This makes the intent explicit. val explicitIntent = Intent("com.example.action.APP_ACTION") explicitIntent.apply { package = context.packageName } context.startActivity(explicitIntent)
Java
// This makes the intent explicit. Intent explicitIntent = new Intent("com.example.action.APP_ACTION") explicitIntent.setPackage(context.getPackageName()); context.startActivity(explicitIntent);
Çalışma zamanında kaydedilen yayın alıcılar, dışa aktarma davranışını belirtmelidir
Android 14 (API düzeyi 34) veya sonraki sürümleri hedefleyen ve bağlama kayıtlı alıcıları kullanan uygulamaların ve hizmetlerin, alıcının cihazdaki diğer tüm uygulamalara aktarılıp aktarılmayacağını belirtmek için bir işaret belirtmesi gerekir: sırasıyla RECEIVER_EXPORTED veya RECEIVER_NOT_EXPORTED.
Bu şart, Android 13'te kullanıma sunulan bu alıcılara yönelik özelliklerden yararlanarak uygulamaları güvenlik açıklarına karşı korumaya yardımcı olur.
Yalnızca sistem yayınları alan alıcılar için istisna
Uygulamanız, Context#registerReceiver() gibi Context#registerReceiveryöntemleri kullanarak yalnızca sistem yayınları için alıcı kaydediyorsa alıcıyı kaydederken bir işaret belirtmemelidir.
Daha güvenli dinamik kod yükleme
Uygulamanız Android 14 (API düzeyi 34) veya sonraki sürümleri hedefliyorsa ve Dinamik Kod kullanıyorsa Yükleniyor (DCL) durumunda, dinamik olarak yüklenen tüm dosyalar salt okunur olarak işaretlenmelidir. Aksi takdirde, sistem bir istisna uygular. Uygulamalardan Kodu dinamik olarak yükleme Çünkü böyle yapmak, uygulamanızın tekrar gözden geçirilmesi riskini veya başkasının eline geçer.
Kodu dinamik olarak yüklemeniz gerekiyorsa dinamik olarak yüklenen dosyayı (ör. DEX, JAR veya APK dosyası) açıldıktan hemen sonra ve herhangi bir içerik yazılmadan önce salt okunur olarak ayarlamak için aşağıdaki yaklaşımı kullanın:
Kotlin
val jar = File("DYNAMICALLY_LOADED_FILE.jar") val os = FileOutputStream(jar) os.use { // Set the file to read-only first to prevent race conditions jar.setReadOnly() // Then write the actual file content } val cl = PathClassLoader(jar, parentClassLoader)
Java
File jar = new File("DYNAMICALLY_LOADED_FILE.jar"); try (FileOutputStream os = new FileOutputStream(jar)) { // Set the file to read-only first to prevent race conditions jar.setReadOnly(); // Then write the actual file content } catch (IOException e) { ... } PathClassLoader cl = new PathClassLoader(jar, parentClassLoader);
Mevcut olan ve dinamik olarak yüklenmiş dosyaları işleyin
Dinamik olarak yüklenen mevcut dosyalara yönelik istisnaların atılmasını önlemek için dinamik olarak denemeden önce dosyaları silip yeniden oluşturmanızı öneririz. bunları uygulamanıza tekrar yükleyebilirsiniz. Dosyaları yeniden oluştururken önceki yazma zamanında dosyaları salt okunur olarak işaretleme ile ilgili yol gösterici bilgiler içerir. Alternatif olarak mevcut dosyaları salt okunur olarak yeniden etiketleyin. Ancak bu örnekte, önce dosyaların bütünlüğünü doğrulamanızı öneririz (örneğin, uygulamanızın korunmasına yardımcı olmak için dosyanın imzasını güvenilir bir değerle karşılaştırarak kötü amaçlı işlemlerden korur.
Arka planda etkinlik başlatmayla ilgili ek kısıtlamalar
Android 14 (API düzeyi 34) veya sonraki sürümleri hedefleyen uygulamalar için sistem, uygulamaların arka planda etkinlik başlatmasına izin verildiği durumları daha da kısıtlar:
- Bir uygulama,
PendingIntent#send()veya benzer yöntemler kullanarakPendingIntentgönderdiğinde, bekleyen intent'i başlatmak için kendi arka plan etkinliği başlatma ayrıcalıklarını vermek istiyorsa bu özelliği etkinleştirmelidir. Etkinleştirmek için uygulamanınsetPendingIntentBackgroundActivityStartMode(MODE_BACKGROUND_ACTIVITY_START_ALLOWED)ile birActivityOptionspaketi iletmesi gerekir. - Görünen bir uygulama,
bindService()yöntemini kullanarak arka planda olan başka bir uygulamanın hizmetini bağladığında, bağlı hizmete kendi arka plan etkinliği başlatma ayrıcalıklarını vermek istiyorsa artık bu seçeneği etkinleştirmesi gerekir. Etkinleştirmek için uygulama,bindService()yöntemini çağırırkenBIND_ALLOW_ACTIVITY_STARTSişaretini içermelidir.
Bu değişiklikler, kötü amaçlı uygulamaların arka planda rahatsız edici etkinlikler başlatmak için API'leri kötüye kullanmasını engelleyerek kullanıcıları korumak amacıyla mevcut kısıtlama grubunu genişletir.
Zip path traversal
Android 14 (API düzeyi 34) veya sonraki sürümleri hedefleyen uygulamalarda Android, ZIP Yol Geçiş Güvenlik Açığını aşağıdaki şekilde önler: ZipFile(String) ve ZipInputStream.getNextEntry(), ZIP dosyası giriş adları ".." içeriyorsa veya "/" ile başlıyorsa ZipException hatası oluşturur.
Uygulamalar, dalvik.system.ZipPathValidator.clearCallback() çağrısı yaparak bu doğrulamayı devre dışı bırakabilir.
Her MediaProjection yakalama oturumu için kullanıcı izni gerekir
For apps targeting Android 14 (API level 34) or higher, a SecurityException is
thrown by MediaProjection#createVirtualDisplay in either of the following
scenarios:
- Your app caches the
Intentthat is returned fromMediaProjectionManager#createScreenCaptureIntent, and passes it multiple times toMediaProjectionManager#getMediaProjection. - Your app invokes
MediaProjection#createVirtualDisplaymultiple times on the sameMediaProjectioninstance.
Your app must ask the user to give consent before each capture session. A single
capture session is a single invocation on
MediaProjection#createVirtualDisplay, and each MediaProjection instance must
be used only once.
Handle configuration changes
If your app needs to invoke MediaProjection#createVirtualDisplay to handle
configuration changes (such as the screen orientation or screen size changing),
you can follow these steps to update the VirtualDisplay for the existing
MediaProjection instance:
- Invoke
VirtualDisplay#resizewith the new width and height. - Provide a new
Surfacewith the new width and height toVirtualDisplay#setSurface.
Register a callback
Your app should register a callback to handle cases where the user doesn't grant
consent to continue a capture session. To do this, implement
Callback#onStop and have your app release any related resources (such as
the VirtualDisplay and Surface).
If your app doesn't register this callback,
MediaProjection#createVirtualDisplay throws an IllegalStateException
when your app invokes it.
SDK olmayan arayüzlerle ilgili güncellenen kısıtlamalar
Android 14, Android geliştiricilerle işbirliği ve en son dahili testlere dayalı olarak kısıtlanmış SDK dışı arayüzlerin güncellenmiş listelerini içerir. Mümkün olduğunda, SDK olmayan arayüzleri kısıtlamadan önce herkese açık alternatiflerin kullanılabilir olmasını sağlarız.
Uygulamanız Android 14'ü hedeflemiyorsa bu değişikliklerin bazıları sizi hemen etkilemeyebilir. Ancak şu anda bazı SDK dışı arayüzleri (uygulamanızın hedef API düzeyine bağlı olarak) kullanabilseniz de herhangi bir SDK dışı yöntemi veya alanı kullanmak uygulamanızın bozulma riskini her zaman yüksek tutar.
Uygulamanızın SDK dışı arayüzler kullanıp kullanmadığından emin değilseniz öğrenmek için uygulamanızı test edebilirsiniz. Uygulamanız SDK dışı arayüzleri kullanıyorsa SDK alternatiflerine geçişi planlamaya başlamanız gerekir. Bununla birlikte, bazı uygulamaların SDK dışı arayüzleri kullanmak için geçerli kullanım alanları olduğunu anlıyoruz. Uygulamanızdaki bir özellik için SDK dışı arayüz kullanmaya alternatif bulamıyorsanız yeni bir herkese açık API isteğinde bulunmalısınız.
To learn more about the changes in this release of Android, see Updates to non-SDK interface restrictions in Android 14. To learn more about non-SDK interfaces generally, see Restrictions on non-SDK interfaces.