Davranış değişiklikleri: API düzeyi 28 ve sonraki sürümleri hedefleyen uygulamalar

Android 9 (API düzeyi 28), Android sisteminde bir dizi değişiklik sunar. Aşağıdaki davranış değişiklikleri yalnızca API düzeyi 28 veya sonraki sürümleri hedefleyen uygulamalar için geçerlidir. targetSdkVersion değerini API düzeyi 28 veya sonraki sürümlere ayarlayan uygulamalar, geçerli olduğu durumlarda bu davranışları düzgün şekilde desteklemek için uygulamalarını değiştirmelidir.

Hedefledikleri API düzeyinden bağımsız olarak Android 9'da çalışan tüm uygulamaları etkileyen değişiklikler için Davranış değişiklikleri: tüm uygulamalar başlıklı makaleyi inceleyin.

Ön plan hizmetleri

Android 9 veya sonraki sürümleri hedefleyen ve ön plan hizmetlerini kullanan uygulamalar FOREGROUND_SERVICE iznini istemelidir. Bu, normal bir izin olduğundan sistem, isteyen uygulamaya otomatik olarak verir.

Android 9 veya sonraki sürümleri hedefleyen bir uygulama, FOREGROUND_SERVICE izni istemeden ön plan hizmeti oluşturmaya çalışırsa sistem SecurityException oluşturur.

Gizlilik değişiklikleri

Uygulamanız Android 9'u hedefliyorsa aşağıdaki davranış değişikliklerini göz önünde bulundurmanız gerekir. Cihaz seri numarası ve DNS bilgilerindeki bu güncellemeler, kullanıcı gizliliğini artırır.

Derleme seri numarasının desteği sonlandırılıyor

Android 9'da, kullanıcı gizliliğini korumak için Build.SERIAL her zaman "UNKNOWN" olarak ayarlanır.

Uygulamanızın bir cihazın donanım seri numarasına erişmesi gerekiyorsa bunun yerine READ_PHONE_STATE iznini isteyip getSerial() işlevini çağırmanız gerekir.

DNS gizliliği

Android 9'u hedefleyen uygulamalar, özel DNS API'lerini desteklemelidir. Özellikle uygulamalar, sistem çözümleyici DNS-over-TLS yapıyorsa yerleşik DNS istemcisinin sistemle aynı ana makine adına şifrelenmiş DNS kullandığından veya sistem çözümleyici lehine devre dışı bırakıldığından emin olmalıdır.

Çerçeve güvenlik değişiklikleri

Android 9, uygulamanızın güvenliğini artıran çeşitli davranış değişiklikleri içerir. Ancak bu değişiklikler yalnızca uygulamanız API düzeyi 28 veya sonraki sürümleri hedefliyorsa geçerli olur.

Ağ TLS'si varsayılan olarak etkindir

Uygulamanız Android 9 veya sonraki sürümleri hedefliyorsa isCleartextTrafficPermitted() yöntemi varsayılan olarak false değerini döndürür. Uygulamanızın belirli alan adlarında şifresiz metnin etkinleştirilmesi gerekiyorsa uygulamanızın Ağ Güvenliği Yapılandırması'nda bu alan adları için cleartextTrafficPermitted değerini açıkça true olarak ayarlamanız gerekir.

İşleme göre ayrılmış web tabanlı veri dizinleri

Android 9'da uygulama kararlılığını ve veri bütünlüğünü artırmak için uygulamalar, WebView veri dizinini birden fazla işlem arasında paylaşamaz. Bu tür veri dizinleri genellikle çerezleri, HTTP önbelleklerini ve web'de gezinmeyle ilgili diğer kalıcı ve geçici depolama alanlarını saklar.

Çoğu durumda, uygulamanız yalnızca bir süreçte android.webkit paketindeki sınıfları (ör. WebView ve CookieManager) kullanmalıdır. Örneğin, WebView kullanan tüm Activity nesneleri aynı işleme taşımanız gerekir. Uygulamanızın diğer işlemlerinde disableWebView() işlevini çağırarak "yalnızca bir işlem" kuralını daha katı bir şekilde uygulayabilirsiniz. Bu çağrı, bağımlı bir kitaplıktan çağrılsa bile WebView öğesinin diğer süreçlerde yanlışlıkla başlatılmasını önler.

Uygulamanızın birden fazla işlemde WebView örneklerini kullanması gerekiyorsa söz konusu işlemde belirli bir WebView örneğini kullanmadan önce WebView.setDataDirectorySuffix() yöntemini kullanarak her işlem için benzersiz bir veri dizini soneki atamanız gerekir. Bu yöntem, her işlemden gelen web verilerini uygulamanızın veri dizinindeki kendi dizinine yerleştirir.

Uygulama başına SELinux alanları

Android 9 veya sonraki sürümleri hedefleyen uygulamalar, herkese açık Unix izinlerini kullanarak diğer uygulamalarla veri paylaşamaz. Bu değişiklik, özellikle bir uygulamanın özel verilerine yalnızca o uygulama tarafından erişilebilmesi şartı olmak üzere Android Uygulama Korumalı Alanı'nın bütünlüğünü artırır.

Dosyaları diğer uygulamalarla paylaşmak için içerik sağlayıcı kullanın.

Bağlantı değişiklikleri

Bağlantı verilerini sayma ve çok yollu

Android 9 veya sonraki sürümleri hedefleyen uygulamalarda sistem, mevcut varsayılan ağ olmayan ağlardaki (ör. cihaz kablosuz bağlantıya bağlıyken hücresel trafik) ağ trafiğini sayar ve bu trafiği sorgulamak için NetworkStatsManager sınıfında yöntemler sağlar.

Özellikle, getMultipathPreference() artık yukarıda bahsedilen ağ trafiğine göre bir değer döndürüyor. Android 9'dan itibaren yöntem, hücresel veriler için true değerini döndürür ancak bir günde belirli bir miktardan fazla trafik biriktiğinde false değerini döndürmeye başlar. Android 9'da çalışan uygulamalar bu yöntemi çağırmalı ve ipucunu dikkate almalıdır.

ConnectivityManager.NetworkCallback sınıfı artık VPN'ler hakkında bilgileri uygulamalara gönderiyor. Bu değişiklik, uygulamaların senkron ve asenkron çağrıları karıştırmasına ve sınırlı API'leri kullanmasına gerek kalmadan bağlantı etkinliklerini dinlemesini çok daha kolay hale getirir. Ayrıca, bir cihaz aynı anda birden fazla kablosuz ağa veya birden fazla hücresel ağa bağlandığında bilgi aktarımının beklendiği gibi çalıştığı anlamına gelir.

Apache HTTP istemcisinin desteğinin sonlandırılması

Android 6.0'da Apache HTTP istemcisi desteğini kaldırdık. Android 9'dan itibaren bu kitaplık, bootclasspath'ten kaldırıldı ve varsayılan olarak uygulamalarda kullanılamıyor.

Android 9 ve sonraki sürümleri hedefleyen uygulamalar, Apache HTTP istemcisini kullanmaya devam etmek için AndroidManifest.xml dosyalarına aşağıdakileri ekleyebilir:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Uygulamalar, çalışma zamanı Apache kitaplığını kullanmak yerine org.apache.http kitaplığının kendi sürümünü APK'larına paketleyebilir. Bunu yaparsanız çalışma zamanında sağlanan sınıflarla sınıf uyumluluğu sorunlarını önlemek için kitaplığı yeniden paketlemeniz (Jar Jar gibi bir yardımcı programla) gerekir.

Kullanıcı arayüzü değişiklikleri

Odak görünümü

Alanı 0 olan görünümlere (genişlik veya yükseklik 0) artık odaklanılamaz.

Ayrıca, etkinlikler artık dokunma modunda başlangıç odağını örtülü olarak atamıyor. Bunun yerine, istenirse ilk odaklanmayı açıkça talep etmeniz gerekir.

CSS RGBA onaltılık değer işleme

Android 9 veya sonraki sürümleri hedefleyen uygulamalar, 4 ve 8 onaltılık basamaklı CSS renklerini işlemek için taslak CSS Color Module Level 4 davranışını etkinleştirmelidir.

CSS Color Module Level 4, 52. sürümden beri Chrome tarafından desteklenmektedir ancak WebView, mevcut Android uygulamalarının Android sıralamasında (ARGB) 32 bit onaltılı renkler içerdiği ve bunun da oluşturma hatalarına neden olduğu tespit edildiğinden şu anda bu özelliği devre dışı bırakmaktadır.

Örneğin, #80ff8080 rengi şu anda API seviyesi 27 veya daha düşük olan uygulamalarda WebView'da opak açık kırmızı (#ff8080) olarak oluşturuluyor. Baştaki bileşen (Android tarafından alfa bileşeni olarak yorumlanır) şu anda göz ardı ediliyor. Bir uygulama API düzeyi 28 veya daha yüksek bir sürümü hedefliyorsa #80ff8080, %50 şeffaf açık yeşil (#80ff80) olarak yorumlanır.

Dosya için MIME türü algılama: URI'ler

Android 9'dan önceki Android sürümlerinde MIME türleri, dosya içeriklerinden çıkarılabiliyordu. Android 9'dan (API düzeyi 28) itibaren uygulamalar, file: URI'lerini WebView'da yüklerken doğru dosya uzantısını kullanmalıdır.

MIME türlerini tahmin etmek için dosya içeriklerini kullanmak güvenlik hatalarına neden olabilir ve bu durum genellikle modern tarayıcılar tarafından izin verilmez.

Bir dosyanın .html, .txt, .js veya .css gibi tanınan bir dosya uzantısı varsa MIME türü uzantıya göre belirlenir. Uzantısı olmayan veya tanınmayan bir uzantıya sahip dosyanın MIME türü düz metin olur.

Örneğin, file:///sdcard/test.html gibi bir URI, HTML olarak oluşturulur ancak dosya HTML verileri içerse bile file:///sdcard/test gibi bir URI düz metin olarak oluşturulur.

Doküman kaydırma öğesi

Android 9, bir dokümanın kök öğesinin kaydırma öğesi olduğu durumu düzgün şekilde işler. Önceki sürümlerde kaydırma konumu gövde öğesinde ayarlanıyordu ve kök öğenin kaydırma değerleri sıfırdı. Android 9, kaydırma öğesinin kök öğe olduğu standartlara uygun davranışı etkinleştirir.

Ayrıca, document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop veya document.documentElement.scrollLeft'ye doğrudan erişim, hedef SDK'ya bağlı olarak farklı şekilde davranır. Görüntü alanı kaydırma değerlerine erişmek için varsa document.scrollingElement öğesini kullanın.

Askıya alınmış uygulamalardan gelen bildirimler

Android 9'dan önceki sürümlerde, askıya alınan uygulamalardan gelen bildirimler iptal ediliyordu. Android 9'dan itibaren, askıya alınan uygulamaların bildirimleri uygulama devam ettirilene kadar gizlenir.