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.