Önceki sürümlerde olduğu gibi Android 14'te de uygulamanızı etkileyebilecek davranış değişiklikleri yer alıyor. 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 olduğu durumlarda uygulamanızı bu davranışları düzgün şekilde destekleyecek şekilde değiştirmeniz gerekir.
Ayrıca, uygulamanın targetSdkVersion
durumuna bakılmaksızın Android 14'te çalışan tüm uygulamaları etkileyen davranış değişiklikleri 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 uygulanması
Android 14 enforces the BLUETOOTH_CONNECT
permission when calling the
BluetoothAdapter
getProfileConnectionState()
method for apps targeting
Android 14 (API level 34) or higher.
This method already required the BLUETOOTH_CONNECT
permission, but it was not
enforced. Make sure your app declares BLUETOOTH_CONNECT
in your app's
AndroidManifest.xml
file as shown in the following snippet and check that
a user has granted the permission before calling
getProfileConnectionState
.
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
OpenJDK 17 güncellemeleri
Android 14, Android'in temel kitaplıklarını en son OpenJDK LTS sürümlerindeki özelliklerle uyumlu hale getirmek için yenileme çalışmalarına devam ediyor. Bu çalışmalara hem kitaplık güncellemeleri hem de uygulama ve platform geliştiricileri için Java 17 dil desteği dahildir.
Bu değişikliklerden bazıları uygulama uyumluluğunu etkileyebilir:
- Normal ifadelerdeki değişiklikler: OpenJDK'nın anlamını daha yakından takip etmek için geçersiz grup referanslarına artık izin verilmiyor.
java.util.regex.Matcher
sınıfı tarafındanIllegalArgumentException
atanmasının olduğu yeni durumlar görebilirsiniz. Bu nedenle, uygulamanızı normal ifadelerin kullanıldığı alanlar açısından test ettiğinizden emin olun. Test sırasında bu değişikliği etkinleştirmek veya devre dışı bırakmak için uyumluluk çerçevesi araçlarını kullanarakDISALLOW_INVALID_GROUP_REFERENCE
işaretini açın veya kapatın. - UUID işleme:
java.util.UUID.fromString()
yöntemi artık giriş bağımsız değişkenini doğrularken daha katı kontroller yapıyor. Bu nedenle, seri dışılaştırma sırasında birIllegalArgumentException
görebilirsiniz. Test sırasında bu değişikliği etkinleştirmek veya devre dışı bırakmak için uyumluluk çerçevesi araçlarını kullanarakENABLE_STRICT_VALIDATION
işaretini açın veya kapatın. - ProGuard sorunları: Bazı durumlarda, ProGuard'ı kullanarak uygulamanızı küçültmeye, kod karartmaya ve optimize etmeye çalıştığınızda
java.lang.ClassValue
sınıfının eklenmesi soruna neden olur. Sorun,Class.forName("java.lang.ClassValue")
'ün sınıf döndürüp döndürmediğine bağlı olarak çalışma zamanı davranışını değiştiren bir Kotlin kitaplığından kaynaklanıyor. Uygulamanız,java.lang.ClassValue
sınıfının bulunmadığı çalışma ortamının eski bir sürümüne göre geliştirildiyse bu optimizasyonlar,java.lang.ClassValue
sınıfından türetilen sınıflardancomputeValue
yöntemini kaldırabilir.
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
Android 11 (API düzeyi 30) ile birlikte, telefon kilitliyken tam ekran intent'ler göndermek için tüm uygulamaların Notification.Builder.setFullScreenIntent
kullanması mümkündü. AndroidManifest dosyasında USE_FULL_SCREEN_INTENT
iznini belirterek bu izni uygulama yüklenirken otomatik olarak verebilirsiniz.
Tam ekran intent bildirimleri, kullanıcının hemen ilgilenmesini gerektiren son derece yüksek öncelikli bildirimler (ör. gelen telefon araması veya kullanıcı tarafından yapılandırılmış alarm saati ayarları) için tasarlanmıştır. Android 14 (API düzeyi 34) veya sonraki sürümleri hedefleyen uygulamalarda bu iznin kullanılmasına izin verilen uygulamalar yalnızca arama ve alarm sağlayan uygulamalarla sınırlıdır. Google Play Store, bu profile uymayan uygulamaların varsayılan USE_FULL_SCREEN_INTENT
izinlerini iptal eder. Bu politika değişikliklerinin son tarihi 31 Mayıs 2024'tür.
Bu izin, kullanıcı Android 14'e güncellemeden önce telefona yüklenen uygulamalarda etkin kalır. Kullanıcılar bu izni etkinleştirip devre dışı bırakabilir.
Uygulamanızın izin alıp almadığını kontrol etmek için yeni API'yi NotificationManager.canUseFullScreenIntent
kullanabilirsiniz. İzin yoksa uygulamanız, kullanıcıların izni verebileceği ayarlar sayfasını başlatmak için yeni intent'i ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT
kullanabilir.
Güvenlik
Örtük ve beklemede olan intent'lerle 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#registerReceiver
yö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
If your app targets Android 14 (API level 34) or higher and uses Dynamic Code Loading (DCL), all dynamically-loaded files must be marked as read-only. Otherwise, the system throws an exception. We recommend that apps avoid dynamically loading code whenever possible, as doing so greatly increases the risk that an app can be compromised by code injection or code tampering.
If you must dynamically load code, use the following approach to set the dynamically-loaded file (such as a DEX, JAR, or APK file) as read-only as soon as the file is opened and before any content is written:
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);
Handle dynamically-loaded files that already exist
To prevent exceptions from being thrown for existing dynamically-loaded files, we recommend deleting and recreating the files before you try to dynamically load them again in your app. As you recreate the files, follow the preceding guidance for marking the files read-only at write time. Alternatively, you can re-label the existing files as read-only, but in this case, we strongly recommend that you verify the integrity of the files first (for example, by checking the file's signature against a trusted value), to help protect your app from malicious actions.
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 kullanarakPendingIntent
gö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 birActivityOptions
paketi 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_STARTS
iş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 yolu geçişi
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.
Android 14 (API düzeyi 34) veya sonraki sürümleri hedefleyen uygulamalarda, aşağıdaki senaryolardan birinde MediaProjection#createVirtualDisplay
tarafından bir SecurityException
atılır:
- Uygulamanız,
MediaProjectionManager#createScreenCaptureIntent
kaynağından döndürülenIntent
öğesini önbelleğe alır veMediaProjectionManager#getMediaProjection
kaynağına birden çok kez iletir. - Uygulamanız aynı
MediaProjection
örneğindeMediaProjection#createVirtualDisplay
işlevini birden fazla kez çağırıyor.
Uygulamanız, her yakalama oturumundan önce kullanıcıdan izin almalıdır. Tek bir yakalama oturumu, MediaProjection#createVirtualDisplay
üzerinde tek bir çağrıdır ve her MediaProjection
örneği yalnızca bir kez kullanılmalıdır.
Yapılandırma değişikliklerini işleme
Uygulamanızın yapılandırma değişikliklerini (ör. ekran yönü veya ekran boyutu değişikliği) işlemek için MediaProjection#createVirtualDisplay
'ü çağırması gerekiyorsa mevcut MediaProjection
örneği için VirtualDisplay
'ı güncellemek üzere aşağıdaki adımları uygulayabilirsiniz:
- Yeni genişlik ve yükseklikle
VirtualDisplay#resize
işlevini çağırın. VirtualDisplay#setSurface
için yeni genişlik ve yükseklik içeren yeni birSurface
sağlayın.
Geri arama kaydı
Uygulamanız, kullanıcının yakalama oturumuna devam etmek için izin vermediği durumları işlemek üzere bir geri çağırma işlevi kaydetmelidir. Bunu yapmak için Callback#onStop
'u uygulayın ve uygulamanızın ilgili tüm kaynakları (ör. VirtualDisplay
ve Surface
) yayınlamasını sağlayın.
Uygulamanız bu geri çağırma işlevini kaydetmezse MediaProjection#createVirtualDisplay
, uygulamanız işlevi çağırdığında IllegalStateException
hatası verir.
SDK dışı kısıtlamalar güncellendi
Android 14, Android geliştiricilerle yapılan ortak çalışmalara ve en son şirket içi 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ılabildiğinden emin oluruz.
Uygulamanız Android 14'ü hedeflemiyorsa bu değişikliklerin bazıları sizi hemen etkilemeyebilir. Ancak şu anda bazı SDK dışı arayüzleri kullanabilseniz de (uygulamanızın hedef API düzeyine bağlı olarak) SDK dışı bir yöntem veya alan kullanmak her zaman uygulamanızın bozulma riskini artırır.
Uygulamanızda SDK dışı arayüzlerin kullanılıp kullanılmadığını öğrenmek için uygulamanızı test edebilirsiniz. Uygulamanız SDK dışı arayüzleri kullanıyorsa SDK alternatiflerine geçiş planlamaya başlamanız gerekir. Bununla birlikte, bazı uygulamaların SDK dışı arayüzleri kullanmanın geçerli kullanım alanları olduğunu biliyoruz. Uygulamanızdaki bir özellik için SDK dışı arayüz kullanmanın alternatifini bulamıyorsanız yeni bir herkese açık API isteğinde bulunmanız gerekir.
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.