Yeni özelliklerin ve yeteneklerin yanı sıra Android 8.0 (API düzeyi 26) çeşitli sistem ve API davranışı değişikliklerini içerir. Bu doküman anlamanız ve hesaba katmanız gereken önemli değişikliklerden bazılarını vurgular. inceleyebilirsiniz.
Bu değişikliklerin çoğu, uygulamanızın hangi sürümünden Android'i hedefler. Ancak bazı değişiklikler yalnızca uygulama hedeflemeyi etkiler Android 8.0 En fazla netlik kazandırmak için, sayfa iki bölüme ayrıldı: Tüm uygulamalardaki değişiklikler ve Uygulama hedeflemesiyle ilgili değişiklikler Android 8.0
Tüm uygulamalar için değişiklikler
Bu davranış değişiklikleri, aşağıdaki durumlarda
Arka planda yürütme sınırları
Android 8.0'ın (API düzeyi 26) kullanıma sunduğu değişikliklerden biri, Bu da uygulamanızın pil ömrünü uzatmaya, önbelleğe alındı etkin olmayan eyalet bileşenleri sistem, uygulamanın tuttuğu uyanık kalma kilitlerini serbest bırakır.
Ayrıca, cihaz performansını iyileştirmek için sistem bazı ön planda çalışmayan uygulamaların davranışlarıyla ilgilidir. Özellikle:
- Arka planda çalışan uygulamalarda artık özgürce çalışan uygulamalar arka plan hizmetlerine erişebilirler.
- Uygulamalar, çoğu örtülü yayına kaydolmak için manifestlerini kullanamaz (yani, özel olarak uygulamaya hedeflenmeyen yayınlar).
Varsayılan olarak bu kısıtlamalar yalnızca O hedefini hedefleyen uygulamalar için geçerlidir. Ancak, Kullanıcılar, herhangi bir uygulama için bu kısıtlamaları Ayarlar ekranından etkinleştirebilirler. uygulama O'yu hedeflemese bile
Android 8.0 (API düzeyi 26), belirli yöntemlerde yapılan aşağıdaki değişiklikleri de içerir:
startService()
yöntemi artık UygulamaysaIllegalStateException
Android 8.0'ı hedefleyen reklamlar, bu yöntemi kullanmaya arka plan hizmetlerinin oluşturulmasına izin verilmediği durumlarda.- Yeni
Context.startForegroundService()
yöntemi, ön plan hizmetini kullanabilirsiniz. Sistem, uygulamalara izin verir Uygulama şu anda bileContext.startForegroundService()
numaralı telefonu aramak için arka planda çalışır. Ancak, uygulama beş içinde bu hizmetinstartForeground()
yöntemini çağırmalıdır saniye kadar sürebilecek.
Daha fazla bilgi için bkz. Arka Plan Yürütme Sınırları.
Android arka planda konum sınırları
Pili, kullanıcı deneyimini ve sistem sağlığını korumak için arka plandaki uygulamalar bir cihazda kullanıldığında konum güncellemelerini daha seyrek alır Android 8.0 yüklü halde. Bu davranış değişikliği tüm uygulamaları etkiler Google Play Hizmetleri de dahil olmak üzere konum güncellemeleri alan kullanıcılar için geçerlidir.
Bu değişiklikler aşağıdaki API'leri etkilemektedir:
- Çok Kaynaklı Konum Sağlayıcı (FLP)
- Coğrafi sınır çizme
- GNSS Ölçümleri
- Konum Yöneticisi
- Wi-Fi Yöneticisi
Uygulamanızın beklendiği gibi çalıştığından emin olmak için aşağıdaki adımları tamamlayın:
- Uygulamanızın mantığını inceleyin ve en son konumu kullandığınızdan emin olun API'ler.
- Uygulamanızın her kullanım için beklediğiniz davranışı sergileyip sergilemediğini test edin dava açın.
- Şu özelliklerden faydalanabilirsiniz: Kaynaşmış Konum Sağlayıcı (FLP) veya coğrafi sınır belirleme, Kullanıcının mevcut konumu.
Bu değişiklikler hakkında daha fazla bilgi için Arka Planda Konum Sınırlar.
Uygulama kısayolları
Android 8.0 (API düzeyi 26), uygulama kısayollarında aşağıdaki değişiklikleri içerir:
com.android.launcher.action.INSTALL_SHORTCUT
yayın numarası artık uygulamanız üzerinde herhangi bir etkisi yoktur, çünkü yayınla. Bunun yerine,requestPinShortcut()
. yönteminiShortcutManager
sınıfından alır.ACTION_CREATE_SHORTCUT
intent, artıkShortcutManager
sınıf. Bu amaç ayrıca, etkileşimde bulunmayan eski başlatıcı kısayollarıShortcutManager
Önceden bu amaç doğrultusunda yalnızca eski başlatıcı kısayolları oluşturabilir.- Kısayollar kullanılarak oluşturulanlar
requestPinShortcut()
. ve kısayolları da içeren bir özellik içerenACTION_CREATE_SHORTCUT
intent'ler artık tam kapsamlı uygulama kısayolları. Sonuç olarak uygulamalar artık bunları güncelleyebilirShortcutManager
yöntemlerinden birini kullanın. - Eski kısayollar, önceki sürümlerdeki işlevlerini korur ancak bunları uygulamanızda manuel olarak uygulama kısayollarına dönüştürmeniz gerekir.
Uygulama kısayollarında yapılan değişiklikler hakkında daha fazla bilgi edinmek için şu sayfaya bakın: Kısayolları sabitleme ve Widget'lar özellik rehberi.
Yerel ayarlar ve uluslararasılaştırma
Android 7.0 (API düzeyi 24),
ancak bazı API'ler varsayılan bir Kategori Yerel Ayarıdır ancak
genel Locale.getDefault()
yöntemini kullanmaları gerekir. Bunun yerine, varsayılan DISPLAY
kategori Yerel Ayarı'nı kullanmaları gerekir. Android 8.0 (API düzeyi 26) sürümünde,
Aşağıdaki yöntemlerde artık Locale.getDefault(Category.DISPLAY)
yöntemi kullanılıyor
(Locale.getDefault()
yerine):
Locale.getDisplayScript(Locale)
adlı kullanıcı da
değeri Locale.getDefault()
değerine düştüğünde
Locale
için displayScript değeri belirtildi
bağımsız değişkeni kullanılamıyor.
Yerel ayarlar ve uluslararasılaştırmayla ilgili diğer değişiklikler aşağıdaki gibidir: şöyle olur:
Currency.getDisplayName(null)
adlı kişiyeNullPointerException
gönderilir, davranışla tutarlı olması gerekir.- Saat dilimi adı ayrıştırma işlemi değişti. Daha önce
Android cihazlar, başlatma sırasında örneklenen sistem saat değerini kullandı
tarihi ayrıştırmak için kullanılan saat dilimi adlarını önbelleğe alma süresi
kez. Sonuç olarak, sistem çalışır durumda değilse ayrıştırma işlemi olumsuz yönde etkilenebilir.
veya nadiren görülen diğer durumlarda saat yanlış oluyordu.
Yaygın durumlarda ayrıştırma mantığında ICU ve saat dilimi adlarını ayrıştırırken geçerli sistem saat değerine ayarlayın. Bu daha doğru sonuçlar verir ve bu sonuçlar öncekinden farklı olabilir. Uygulamanızda aşağıdaki gibi sınıfların kullanıldığı Android sürümleri:
SimpleDateFormat
- Android 8.0 (API düzeyi 26), ICU sürümünü 58 sürümüne günceller.
Uyarı aralıkları
Bir uygulama SYSTEM_ALERT_WINDOW
kullanıyorsa
izin verir ve aşağıdaki pencere türlerinden birini kullanarak
diğer uygulamaların ve sistem pencerelerinin üzerinde uyarı pencereleri:
...bu pencereler her zaman
TYPE_APPLICATION_OVERLAY
pencere
türü. Bir uygulama Android 8.0'ı (API düzeyi 26) hedefliyorsa,
TYPE_APPLICATION_OVERLAY
.
pencere türünü seçin.
Daha fazla bilgi için Uygulamalara ilişkin davranış değişikliklerindeki uyarı pencereleri bölümü Android 8.0'ı hedefler.
Giriş ve gezinme
ChromeOS'te ve diğer geniş form faktörlerinde Android uygulamalarının ortaya çıkmasıyla yeni bir yeniden canlandığını gördük. Android uygulamaları. Android 8.0 (API düzeyi 26) sürümünde, klavyeyi gezinme giriş cihazı olarak kullanır ve böylece daha güvenilir, ok ve sekme tabanlı gezinme için tahmin edilebilir model
Özellikle öğe odağında aşağıdaki değişiklikler yapılmıştır davranış:
-
Belirli bir öğe için odak durumu rengi tanımlamadıysanız
View
nesne (ön planı veya arka planı) çekilebilirse) çerçeve, artık bu öğe için varsayılan odaklama rengiView
. Odaklanılan bu öne çıkan özellik, bir e-posta alırsınız.Bir
View
nesnesinin bu varsayılanı kullanmasını istemiyorsanız üzerine gelindiğinde vurgulamayı,android:defaultFocusHighlightEnabled
özelliğinifalse
View
veyafalse
sonra şuraya geçin:setDefaultFocusHighlightEnabled()
. - Klavye girişinin kullanıcı arayüzü öğesinin odağını nasıl etkilediğini test etmek için Çizim > Düzen sınırlarını göster geliştirici seçeneği. Android'de 8.0'ı seçerseniz bu seçenekte "X" gösterilir üzerine geldiğinde odaklanacağız.
Ayrıca, Android 8.0'da tüm araç çubuğu öğeleri, otomatik olarak klavye gezinme kümeleri, bir araç çubuğuna giderek kullanıcıların her araç çubuğuna gitmesini ve araçtan çıkmasını bütün.
Klavyeyle gezinme desteğini nasıl iyileştirebileceğiniz hakkında hakkında daha fazla bilgi edinmek için Destekleyici Klavyeyle Gezinme rehberini inceleyin.
Web formlarını otomatik doldurma
Artık Android Otomatik Doldurma
Çerçeve otomatik doldurma işlevi için yerleşik destek sunar.
WebView
nesneyle ilgili aşağıdaki yöntemler değiştirildi
Android 8.0 (API düzeyi 26) çalıştıran cihazlarda yüklü uygulamalar için:
WebSettings
-
- İlgili içeriği oluşturmak için kullanılan
getSaveFormData()
. yöntemi artıkfalse
değerini döndürüyor. Daha önce bu yöntem şu sonuçları döndürdü: Bunun yerinetrue
. - Telefon etme
setSaveFormData()
kişi geri çevirdi artık bir etkisi olmaz.
- İlgili içeriği oluşturmak için kullanılan
WebViewDatabase
-
- Telefon etme
clearFormData()
kişi geri çevirdi artık bir etkisi olmaz. - İlgili içeriği oluşturmak için kullanılan
hasFormData()
yöntem artıkfalse
değerini döndürüyor. Daha önce bu yöntem şu sonuçları döndürdü: Form veri içerdiğindetrue
.
- Telefon etme
Erişilebilirlik
Android 8.0 (API düzeyi 26), erişilebilirlikle ilgili aşağıdaki değişiklikleri içerir:
-
Erişilebilirlik çerçevesi artık tüm iki kez dokunma hareketlerini
ACTION_CLICK
. işlemlerdir. Bu değişiklik, TalkBack'in diğerlerine benzer davranışlarda bulunmasını sağlar. erişilebilirlik hizmetleri.Uygulamanızın
View
nesnesi özel dokunma kullanıyorsa TalkBack ile çalışmaya devam ettiğini doğrulamanız gerekir. En son haberleri sunan,View
tıklama işleyicisini kaydetmeniz yeterlidir. bir örneğidir. TalkBack, bu alt sekmelerde gerçekleştirilen hareketleri hâlâ tanımıyorsaView
nesne, geçersiz kılmaperformAccessibilityAction()
. - Erişilebilirlik hizmetleri artık
Uygulamanızın içinde
ClickableSpan
örnekTextView
nesne.
Uygulamanızı nasıl daha erişilebilir hale getirebileceğiniz hakkında daha fazla bilgi edinmek için Erişilebilirlik.
Ağ iletişimi ve HTTP(S) bağlantısı
Android 8.0 (API düzeyi 26), aşağıdaki davranış değişikliklerini içerir: ağ ve HTTP(S) bağlantısı:
- Gövdesi olmayan OPTIONS istekte
Content-Length: 0
var kullanabilirsiniz. Önceden,Content-Length
başlıkları yoktu. - HttpURLConnection ifadesi boş yol içeren URL'leri
ana makine veya yetkili adından sonra eğik çizgi koyun. Örneğin,
http://example.com
şuna dönüştürür:http://example.com/
. - ProxySelector.setDefault() aracılığıyla ayarlanan özel bir proxy seçici yalnızca istenen URL'nin adresini (şema, ana makine ve bağlantı noktası) hedefler. Sonuç olarak, proxy seçiminde yalnızca bu değerler temel alınabilir. Bir URL özel proxy seçiciye iletilen, istenen URL'nin sorgu parametreleri veya parçaları içerebilir.
- URI'lar boş etiketler içeremez.
Önceden platform, boş etiketlerin kabul edilmesiyle ilgili bir geçici çözümü destekliyordu yasa dışı bir şekilde URI'ların kullanımını içeren ana makine adları. Bu geçici çözüm, eski libcore sürümleriyle uyumluluk. API'yi kullanan geliştiriciler şöyle bir ADB mesajı görür: "URI example..com'da boş etiketler var ana makine adını girin. Bu hatalı bilgi nedeniyle ileride Android cihazlarda kabul edilmeyecek artık geçerli değil. Android 8.0 bu geçici çözümü kaldırır; sistem, bozuk URI'lar için null.
- Android 8.0’da HttpsURLConnection uygulaması güvenli olmayan TLS/SSL protokolü sürümü yedeği gerçekleştirmez.
- Tünel HTTP(S) bağlantılarının işlenmesi aşağıdaki şekilde değiştirilmiştir:
- Sistem, bağlantı üzerinden HTTPS bağlantısından tünel oluştururken bağlantı noktası numarasını (:443) doğru şekilde Ana Makine satırına yerleştirir bu bilgiyi ara sunucuya gönderebilirsiniz. Önceden, taşıma sayısı yalnızca CONNECT satırında oluştu.
- Sistem artık kullanıcı aracısı ve proxy yetkilendirmesi göndermemektedir
üstbilgilerini tanımlamaya çalışın.
Sistem artık Search Ads 360'ı ayarlarken proxy'ye bağlantı yer alır. Sistem, bunun yerine bir proxy yetkilendirme üstbilgisi ve bu proxy, web sunucusu tarafından İlk isteğe yanıt olarak HTTP 407.
Benzer şekilde, sistem artık kullanıcı aracısı başlığını kopyalamaz. isteğe bağlı şekilde, yer alır. Bunun yerine kitaplık, bu sorgu için bir kullanıcı aracısı isteğinde bulunabilirsiniz.
send(java.net.DatagramPacket)
yöntemi, daha önce yürütülen connect() ise bir SocketException hatası verir yöntemi başarısız oldu.- Bir dahili hata. Android 8.0'dan önce, sonraki bir recv() çağrısı, send() çağrısı başarılı olsa bile bir SocketException hatası verdi. Tutarlılık için her iki çağrı da artık SocketException hatası veriyor.
- InetAddress.isReachable(), ICMP'yi TCP Echo'ya geçmeden önce deniyor
protokolü.
- Bağlantı noktası 7'yi (TCP Echo) engelleyen google.com gibi bazı ana makineler ICMP Yankı protokolünü kabul ederlerse erişilebilir hale gelirler.
- Gerçekten erişilemeyen ana makineler için bu değişiklik, arama geri dönmeden önce harcanan zamanın oranıdır.
Bluetooth
Android 8.0 (API düzeyi 26),
ScanRecord.getBytes()
tarafından sağlanan veriler
yöntemi alır:
getBytes()
yöntemi, alınan bayt sayısı. Bu nedenle uygulamalar, veya döndürülen maksimum bayt sayısı. Bunun yerine, elde edilen dizinin uzunluğu.- Bluetooth 5 uyumlu cihazlar Maksimum 60 bayttır.
- Uzak cihaz tarama yanıtı sağlamıyorsa 60 bayttan az iade edilebilir.
Sorunsuz Bağlantı
Android 8.0 (API düzeyi 26), daha kolay seçim yapmak için Kablosuz Ayarlarında çok sayıda iyileştirme yapar. en iyi kullanıcı deneyimini sunan kablosuz ağ. Belirli değişiklikler şunlardır:
- Kararlılık ve güvenilirlik iyileştirmeleri.
- Sezgisel olarak daha okunabilir bir kullanıcı arayüzü.
- Tek ve birleştirilmiş Kablosuz Tercihleri menüsü.
- Uyumlu cihazlarda yüksek kaliteli kayıtlı bir ağ olduğunda kablosuz bağlantı otomatik olarak etkinleştirilir yakında.
Güvenlik
Android 8.0, güvenlikle ilgili aşağıdaki özellikleri içerir değişiklikler:
- Platform artık SSLv3'ü desteklemiyor.
- Doğru olmayan bir sunucuyla HTTPS bağlantısı kurarken
TLS protokol sürümü iletişimini uygular,
HttpsURLConnection
artık geçici çözümü denmiyor eski TLS protokolü sürümlerine geri dönüyor ve yeniden deneniyor. - Android 8.0 (API düzeyi 26), Güvenli Bilişim (SECCOMP) uygular tüm uygulamaları gösterecek şekilde filtrele. İzin verilen syscall'lar listesi şunlarla sınırlıdır: maruz kalınıyor. Sağlanan birkaç syscall uyumlu değilse bu öğelerin kullanılmamasını öneririz.
- Uygulamanızın
WebView
nesnesi artık çoklu işlemde çalışıyor yatırım yapmanız önemlidir. Web içeriği, uygulamanın gelişmiş güvenlik sürecini içeren -
Artık APK'ların, adları ile biten dizinlerde bulunduğunu varsayamazsınız
-1 veya -2'dir. Uygulamalar,
sourceDir
kazanmak için dizin biçimini kullanabilir, doğrudan dizin biçimine dayanmaz. - Yerel reklamlarla ilgili güvenlik geliştirmeleri hakkında bilgi için kitaplıklar için Yerel Kitaplıklar bölümüne bakın.
Ayrıca Android 8.0 (API düzeyi 26) sürümünde, uygulama yüklemeyle ilgili olarak aşağıdaki değişiklikler yapılmıştır. bilinmeyen kaynaklardan bilinmeyen uygulamalar:
- Eski ayarın değeri
INSTALL_NON_MARKET_APPS
şimdi her zaman 1. Bilinmeyen bir kaynağın bunun yerinecanRequestPackageInstalls()
-
INSTALL_NON_MARKET_APPS
tarafından kullanılan:setSecureSetting()
,UnsupportedOperationException
atılır. Kullanıcıların bilinmeyen uygulamalar kullanarak bilinmeyen uygulamaları yüklemesini engellemek Bunun yerine,DISALLOW_INSTALL_UNKNOWN_SOURCES
kullanıcı olur. -
Android 8.0 (API düzeyi 26) çalıştıran cihazlarda oluşturulan yönetilen profillerde otomatik olarak
DISALLOW_INSTALL_UNKNOWN_SOURCES
kullanıcı kısıtlama etkin. Aşağıdaki özelliklere sahip cihazlardaki mevcut yönetilen profiller için: yeni Android 8.0 sürümüne geçirildi,DISALLOW_INSTALL_UNKNOWN_SOURCES
kullanıcı kısıtlama otomatik olarak etkinleştirilir. Aksi takdirde profil sahibi özelliğini ayarlayarak bu kısıtlamayı (yeni sürüme geçmeden önce) devre dışı bırakınINSTALL_NON_MARKET_APPS
- 1.
Bilinmeyen uygulamaları yüklemeyle ilgili ek ayrıntılar için şuraya bakın: Bilinmeyen Uygulama İzinleri Yükleme rehberini inceleyin.
Uygulamanızı daha güvenli hale getirmeyle ilgili ek yönergeler için Android Geliştiricileri için Güvenlik.
Gizlilik
Android 8.0 (API düzeyi 26), aşağıdaki işlemleri gizlilikle ilgilidir bazı değişiklikler var.
- Platform artık tanımlayıcıları farklı şekilde işliyor.
-
Bir OTA sürümünden önce yüklenen uygulamalar için
Android 8.0 (API düzeyi 26)
(API düzeyi 26),
ANDROID_ID
aynı kaldı kaldırılmadığı ve OTA'dan sonra yeniden yüklenmediği anlamına gelir. Değerleri korumak için OTA'dan sonra yüklemeyi kaldırma işlemleri, geliştiriciler Anahtar/Değer Yedeklemesi. - Android 8.0 çalıştıran bir cihazda yüklü uygulamalar için
ANDROID_ID
artık kapsama dahil kullanıcı başına oturum sayısı seçebilirsiniz. The value ofANDROID_ID
benzersiz kullanıcı ve cihaz kombinasyonlarını yönetmenizi sağlar. Sonuç olarak, aynı cihazda çalışan farklı imzalama anahtarları olan uygulamalar (aynı kullanıcı için olsa bile) artık aynı Android kimliğini görmez. ANDROID_ID
değeri paketin kaldırılması veya yeniden yüklenmesinde değişmeyeceğinden aynı olduğunu (ve uygulama, OTA'dan sürümü) ekleyebilirsiniz.ANDROID_ID
değeri bir sistem güncellemesi paket imzalama anahtarının değişmesine neden olsa bile değişmez.- Google Play Hizmetleri ve reklam kimliği ile gönderilen cihazlarda
kullanmanız gereken
Reklam kimliği. Uygulamalardan para kazanmak için basit, standart bir sistem,
Reklam kimliği, reklamcılık için kullanılan ve kullanıcı tarafından sıfırlanabilen benzersiz bir kimliktir. Sağlanan
.
Diğer cihaz üreticileri devam edecek
ANDROID_ID
sağlamak için.
-
Bir OTA sürümünden önce yüklenen uygulamalar için
Android 8.0 (API düzeyi 26)
(API düzeyi 26),
net.hostname
sistem özelliği sorgulandığında boş değer üretiliyor yardımcı olur.
Yakalanmayan istisnaları günlüğe kaydetme
Uygulama, aşağıdaki özelliklere sahip bir Thread.UncaughtExceptionHandler
yüklerse:
Thread.UncaughtExceptionHandler
öğesine çağrılmaz,
sistem bunu yapar
Yakalanmamış bir istisna oluştuğunda uygulamayı kapatmaz. Başlangıç tarihi:
Android 8.0 (API düzeyi 26) yüklüyse sistem, istisna yığınını
durum; eski sürümlerde sisteme
istisna yığınını günlüğe kaydetti.
Özel Thread.UncaughtExceptionHandler
kullanmanızı öneririz
her zaman
varsayılan işleyici; bu öneriyi uygulayan uygulamalar
Android 8.0'daki değişiklik.
findViewById() imza değişikliği
findViewById()
yönteminin tüm örnekleri artık View
yerine
<T extends View> T
döndürüyor. Bu değişiklik
aşağıdaki çıkarımları vardır:
- Bu durum, mevcut kodun artık belirsiz bir dönüş türüne sahip olmasına neden olabilir.
örneğin, hem
someMethod(View)
hem desomeMethod(TextView)
findViewById()
. - Java 8 kaynak dili kullanılırken bu,
Dönüş türü kısıtlanmadığında
View
(örneğin,assertNotNull(findViewById(...)).someViewMethod())
. - Nihai olmayan
findViewById()
yöntemlerinin geçersiz kılınması ( (ör.Activity.findViewById()
) geri bildirimde bulunması gerekir. türü güncellendi.
Kişi sağlayıcı kullanım istatistikleri değişikliği
Android'in önceki sürümlerinde, Kişi Sağlayıcı bileşeni
geliştiricilerin her kişi için kullanım verilerini almasını sağlar. Bu kullanım verileri
Her e-posta adresine ve ilişkili her telefon numarasına ait bilgileri gösterir
bir kişiyle iletişim kurma sayısı da dahil olmak üzere
ve kişiyle en son ne zaman iletişim kurulduğu. Şunu isteyen uygulamalar:
READ_CONTACTS
.
izni bu verileri okuyabilir.
Uygulamalar, isterlerse bu verileri okumaya devam edebilir
READ_CONTACTS
.
izni gerekir. Android 8.0 (API düzeyi 26) ve sonraki sürümlerde kullanım verilerinin döndürülmesiyle ilgili sorgular
kesin değerler değil,
yaklaşımları kullanmak isteyebilirsiniz. Android sistemi,
tam değerleri dahili olarak yansıtmadığından, bu değişiklik
otomatik tamamlama API'si ile uyumludur.
Bu davranış değişikliği aşağıdaki sorgu parametrelerini etkiler:
Toplama işlemleri
AbstractCollection.removeAll()
.
ve AbstractCollection.retainAll()
şimdi her zaman NullPointerException
at; daha önce
Koleksiyon şu durumdayken NullPointerException
atılmadı:
boştur. Bu değişiklik, davranışın belgelerle tutarlı olmasını sağlar.
Android Enterprise
Android 8.0 (API düzeyi 26) kurumsal uygulamalara ilişkin bazı API ve özelliklerin (cihaz dahil) davranışı politika denetleyicileri (DPC) olarak bilinir. Değişiklikler şunlardır:
- Uygulamaların tümüyle yönetilen cihazlarda iş profillerini desteklemesine yardımcı olacak yeni davranışlar.
- Sistem güncellemesini işleme, uygulama doğrulama ve cihaz ve sistem bütünlüğünü artırır.
- Kullanıcı deneyiminde temel hazırlık, bildirimler, Son kullanılanlar ekranı ve her zaman açık VPN.
Android 8.0 (API düzeyi 26) sürümündeki tüm kurumsal değişiklikleri görmek ve bunların nasıl olabileceğini öğrenmek nasıl etkilediğini görmek için Enterprise'da Android.
Android 8.0'ı hedefleyen uygulamalar
Bu davranış değişiklikleri yalnızca şu hedeflemeyi hedefleyen uygulamalar için geçerlidir:
Android 8.0 (API düzeyi 26) veya sonraki sürümler. Android 8.0, 2022 veya daha fazlasında
ya da targetSdkVersion
uygulamasını Android 8.0 veya sonraki bir sürüme ayarlamak için değişiklik yapmanız gerekir
ve kendi uygulamalarını bu davranışları doğru şekilde desteklemesi için kullanabilirsiniz.
Uyarı aralıkları
SYSTEM_ALERT_WINDOW
telefon numarasını kullanan uygulamalar
izin, uyarı pencerelerini görüntülemek için artık aşağıdaki pencere türlerini kullanamaz
diğer uygulamaların ve sistem pencerelerinin üzerinde:
Bunun yerine, uygulamalar için
TYPE_APPLICATION_OVERLAY
TYPE_APPLICATION_OVERLAY
pencere
uygulamanızda uyarı pencereleri görüntülemek için yazın, aşağıdaki özellikleri koruyun
göz önünde bulundurmanız gerekir:
- Uygulamaların uyarı pencereleri her zaman kritik sistem pencerelerinin altında görünür: görebilirsiniz.
- Sistem,
TYPE_APPLICATION_OVERLAY
. pencere türünü kullanarak ekran gösterimini iyileştirebilirsiniz. - Bildirim gölgesini açarak, kullanıcılar bir
uyarı pencerelerini görüntülemesini engellemenize olanak tanır.
TYPE_APPLICATION_OVERLAY
. pencere türü.
İçerik değişikliği bildirimleri
Android 8.0 (API düzeyi 26) yeni sürümde
ContentResolver.notifyChange()
.
ve registerContentObserver(Uri, boolean, ContentObserver)
Android 8.0'ı hedefleyen uygulamalar için davranır.
Bu API'ler için artık geçerli bir ContentProvider
tanımıdır. İlgili izinlere sahip geçerli bir ContentProvider
tanımlamak,
uygulamanızı kötü amaçlı uygulamalardan gelen içerik değişikliklerine karşı korumaya ve
gizli olabilecek verilerin kötü amaçlı uygulamalara sızdırılmasını engeller.
Odağı göster
Tıklanabilir View
nesneleri artık şunlara da odaklanabiliyor:
varsayılandır. Bir View
nesnesinin tıklanabilir olmasını istiyor ancak tıklanabilir olmasını istemiyorsanız
odaklanılabilir,
Düzende false
öğesine android:focusable
özelliği eklendi
View
içeren XML dosyası veya false
içinde iletin
uygulamanızın kullanıcı arayüzünde setFocusable()
adresine
mantığıyla başlayalım.
Tarayıcı algılamada kullanıcı aracısı eşleştirme
Android 8.0 (API düzeyi 26) ve sonraki sürümler
derleme tanımlayıcı dizesi OPR
. Bazı kalıp eşleşmeleri
tarayıcı algılama mantığının Opera dışındaki bir tarayıcıyı yanlışlıkla Opera olarak tanımlamasına neden olur.
Bu tür bir kalıp eşleşmesine ilişkin örnek aşağıdaki gibi olabilir:
if(p.match(/OPR/)){k="Opera";c=p.match(/OPR\/(\d+.\d+)/);n=new Ext.Version(c[1])}
Bu tür bir yanlış tanımlamadan kaynaklanan sorunları önlemek için
OPR
öğesini Opera tarayıcısı için kalıp eşleşmesi olarak kullanın.
Güvenlik
Aşağıdaki değişiklikler Android 8.0'da (API düzeyi 26) güvenliği etkiler:
- Uygulamanızın ağ güvenliği yapılandırması
optimizasyon
desteğinin dışında, uygulamanızın
WebView
nesneleri, HTTP üzerinden web sitelerine erişemez. Her biriWebView
nesnesi bunun yerine HTTPS kullanmalıdır. - Bilinmeyen kaynaklara izin ver sistem ayarı kaldırıldı; kendi Bilinmeyen uygulamaları yükleme izni bilinmeyen uygulama yüklemelerini yönetir bilinmeyen kaynaklardan gelen aramaları yapıyor. Bu yeni izin hakkında daha fazla bilgi edinmek için Bilinmeyen Uygulama İzinleri Yükleme rehberini inceleyin.
Uygulamanızı daha güvenli hale getirmeyle ilgili ek yönergeler için Android Geliştiricileri için Güvenlik.
Hesaba erişim ve bulunabilirlik
Android 8.0 (API düzeyi 26) sürümünde uygulamalar artık erişemez
hesabın sahibi olmadığı sürece, kimlik doğrulayıcısı
kullanıcı bu erişimi verdiğinde. İlgili içeriği oluşturmak için kullanılan
GET_ACCOUNTS
izin
artık yeterli değil. Uygulamalara bir hesaba erişim izni verilmesi için:
AccountManager.newChooseAccountIntent()
kullanın
veya kimlik doğrulayıcıya özgü
yöntemidir. Hesaplara erişim elde ettikten sonra bir uygulama sizi arayabilir
AccountManager.getAccounts()
.
erişebilir.
Android 8.0 kullanımdan kaldırılıyor
LOGIN_ACCOUNTS_CHANGED_ACTION
Uygulamalar
bunun yerine
addOnAccountsUpdatedListener()
.
almak için Google Analytics 4'te tarama yapar.
Hesap erişimi için eklenen yeni API'ler ve yöntemler hakkında bulunabilirlik için Hesap Erişimi ve Keşfedilebilirlik konularını ele alacağız.
Gizlilik
Aşağıdaki değişiklikler Android 8.0'da (API düzeyi 26) gizliliği etkiler.
-
net.dns1
,net.dns2
,net.dns3
venet.dns4
artık değil da platformdaki gizliliği iyileştiren bir değişiklik yapıyoruz. -
DNS sunucuları gibi ağ bilgilerini almak için
ACCESS_NETWORK_STATE
birNetworkRequest
veyaNetworkCallback
nesne. Bu sınıflar, Android 5.0 (API düzeyi 21) ve sonraki sürümlerde kullanılabilir. -
Build.SERIAL desteği sonlandırıldı.
Donanım seri numarasını bilmesi gereken uygulamalar bunun yerine
yeni
Build.getSerial()
yöntemini kullanın. içinREAD_PHONE_STATE
izni gerekir. -
LauncherApps
API artık iş profiline izin vermiyor birincil profil hakkında bilgi almak için uygulamalar. Kullanıcı bir işteykenLauncherApps
API, hiç uygulama yokmuş gibi davranır aynı profil grubundaki başka profillere yüklenmiş olmalıdır. Daha önce olduğu gibi alakasız profillere erişmeye teşebbüs etmesi SecurityExceptions neden olur.
İzinler
Bir uygulama, Android 8.0'dan (API düzeyi 26) önce izin istediyse ve izin verilmişse sistem de hatalı bir şekilde uygulamaya, aynı kullanıcıya ait diğer izinleri de verdi ve manifest'te kayıtlı olan URL'leri içerir.
Android 8.0'ı hedefleyen uygulamalar için bu davranış düzeltildi. Uygulamaya yalnızca açıkça sahip olduğu izinler verilir istendi. Ancak kullanıcı uygulamaya izin verdiğinde söz konusu izin grubundaki izin istekleri için otomatik olarak verilir.
Örneğin, bir uygulamada hem READ_EXTERNAL_STORAGE
hem de
Manifest dosyasında WRITE_EXTERNAL_STORAGE
.
Uygulama READ_EXTERNAL_STORAGE
ve
kullanıcı izin verdiğinde. Uygulama, API düzeyi 25 veya altını hedefliyorsa sistem ayrıca
aynı anda WRITE_EXTERNAL_STORAGE
verir
çünkü aynı STORAGE
izin grubuna aittir ve aynı zamanda
kayıtlı olması gerekir. Uygulama Android 8.0'ı (API düzeyi 26) hedefliyorsa, sistem
o sırada yalnızca READ_EXTERNAL_STORAGE
;
Ancak, uygulama daha sonra WRITE_EXTERNAL_STORAGE
isteğinde bulunursa sistem hemen
bu ayrıcalığı kullanıcıya sormadan verir.
Medya
- Çerçeve, performansı
otomatik sesi kısma
gerekir. Bu durumda, başka bir uygulama
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
, uygulama daha az ilgi odağı oluşturmak içinonAudioFocusChange()
geri arama alır ve ses odağı kaybolacak. Aşağıdakiler için bu davranışı geçersiz kılacak yeni API'ler mevcut: duraklama yerine duraklatılması gereken uygulamaları içerir. - Kullanıcı telefon araması yaptığında etkin medya akışlarının sesi şu süre boyunca kapatılır: çağrısına bir tıklama URL'si eklemeniz gerekir.
- Sesle ilgili tüm API'ler
AudioAttributes
kullanmalıdır. yerine ses yayını türlerini tanımlayın. Ses yayını türlerini yalnızca ses seviyesi kontrolleri için kullanmaya devam edin. Akış türlerinin diğer kullanımları çalışmaya devam eder (örneğin, desteği sonlandırılanstreamType
bağımsız değişkeniAudioTrack
oluşturucu), ancak sistem bunu hata olarak kaydeder. AudioTrack
kullanırken, uygulama yeterince büyük bir ses arabelleği isterse çerçeve, varsa derin arabellek çıkışını kullanmaya çalışır.- Android 8.0 (API düzeyi 26) sürümünde medya düğmesi etkinliklerinin işlenmesi farklıdır:
- Medya düğmelerinin işlenmesi kullanıcı arayüzü etkinliğinde değişiklik olmadı: Ön plan etkinliklerinin işlenmesinde öncelikli olmaya devam eder medya düğmesi etkinlikleri.
- Ön plan etkinliği medya düğmesi etkinliğini işlemezse sistem etkinliği yönlendirir yerel olarak ses çalan en son Etkin durum, bayraklar ve oynatma hangi uygulamanın medya aldığı belirlenirken medya oturumunun durumu dikkate alınmaz düğme etkinlikleri.
- Uygulamanın medya oturumu yayınlandıysa
sistem, medya düğmesi etkinliğini uygulamanın
Varsa
MediaButtonReceiver
. - Diğer her durumda sistem, medya düğmesi etkinliğini siler.
Yerel kitaplık
Android 8.0 (API düzeyi 26) sürümünü hedefleyen uygulamalarda, yerel kitaplıklar hayır hem yazılabilir hem de çalıştırılabilir olan herhangi bir yük segmenti yürütülebilir. Aşağıdaki özelliklere sahip olan bazı uygulamalar bu değişiklik nedeniyle çalışmayı durdurabilir: yerel kitaplıklar yanlış yükleme segmentlerine sahip olabilir. Bu, bir önlemdir.
Daha fazla bilgi için bkz. Yazılabilir ve Yürütülebilir Segmentler.
Bağlayıcı değişiklikleri, uygulamanın hedeflediği API düzeyine bağlanır. Varsa bağlayıcı değişikliğinden uygulama kitaplığı yükleyemez. Hedeflenen bağlayıcı değişikliğinin gerçekleştiği API düzeyinden daha düşük bir API düzeyi, logcat bir uyarı gösteriyor.
Toplama işlemleri
Android 8.0 (API düzeyi 26) sürümünde,
Collections.sort()
şurada uygulandı:
en üstte List.sort()
. Ters
(API düzeyleri 24 ve 25) Android 7.x sürümünde (API düzeyleri 24 ve 25) doğrudur):
Varsayılan List.sort()
uygulaması
adı Collections.sort()
.
Bu değişiklik sayesinde Collections.sort()
optimize edilmiş List.sort()
özelliklerinden yararlanabilirsiniz.
ancak aşağıdaki kısıtlamalara sahiptir:
List.sort()
uygulamalarıCollections.sort()
, çünkü bunu yapmak yığın taşmasına sonsuz yinelemeden kaynaklanmaktadır. Bunun yerine,List
uygulamanızda bunu geçersiz kılmaktan kaçınmalısınızsort()
.Bir ebeveyn sınıfı
sort()
özelliğini uygunsuz bir şekilde uygularsa genellikleList.sort()
geçersiz kılınabilir temel alınan bir uygulamaylaList.toArray()
,Arrays.sort()
veListIterator.set()
. Örnek:@Override public void sort(Comparator<? super E> c) { Object[] elements = toArray(); Arrays.sort(elements, c); ListIterator<E> iterator = (ListIterator<Object>) listIterator(); for (Object element : elements) { iterator.next(); iterator.set((E) element); } }
Çoğu durumda,
List.sort()
. şununla: farklı bir varsayılan ayara erişen uygulama uygulamaları hakkında bilgi edindik. Örnek:@Override public void sort(Comparator<? super E> comparator) { if (Build.VERSION.SDK_INT <= 25) { Collections.sort(this); } else { super.sort(comparator); } }
İkincisini yalnızca bir
sort()
sahibi olmak istediğiniz için yapıyorsanız tüm API düzeylerinde kullanılabilir, benzersiz bir ad verin, geçersiz kılmak yerinesortCompat()
gibisort()
-
Collections.sort()
artık şu şekilde sayılıyor: yapısal olaraksort()
çağrısı yapan uygulamaları listeleyin. Örneğin, .ArrayList
ve bu numaradasort()
aranıyor iterasyonun ortasındaConcurrentModificationException
atacaktım. düzenleme yapıldığınıList.sort()
numaralı telefonu arayarak.Collections.sort()
. , istisna yapmadı.Bu değişiklik, platform davranışını daha tutarlı hale getirir: yaklaşımı artık
ConcurrentModificationException
ile sonuçlanıyor.
Sınıf yükleme davranışı
Android 8.0 (API düzeyi 26), sınıf yükleyicilerin
yeni sınıfları yüklerken çalışma zamanı varsayımlarını ortadan kaldırabilirsiniz. Bu kontroller
sınıfa Java'dan (
forName()
),
Dalvik bayt kodu veya JNI. Platform, Java'dan
loadClass()
yöntemini de kontrol etmez
emin olmanız gerekir. Bu davranış, sağlıklı kelimelerin çalışmasını etkilememelidir.
sınıf yükleyiciler.
Platform, sınıf yükleyicisinin döndürdüğü sınıfın tanımlayıcısını kontrol eder
beklenen tanımlayıcıyla eşleşir. Döndürülen tanımlayıcı eşleşmezse
platform bir NoClassDefFoundError
hatası verir ve
ise tutarsızlığı belirten ayrıntılı bir mesaj yer alır.
Platform, istenen sınıfların tanımlayıcılarının da geçerli olup olmadığını kontrol eder. Bu
check, GetFieldID()
gibi sınıfları dolaylı olarak yükleyen JNI çağrılarını yakalar,
bu sınıflara geçersiz tanımlayıcılar geçirmeye karar verir. Örneğin, imzalı bir alan
Bu imza geçersiz olduğundan java/lang/String
bulunamadı;
Ljava/lang/String;
olmalı.
Bu, FindClass()
ile yapılan bir JNI çağrısından farklıdır
Bu örnekte java/lang/String
, geçerli ve tam bir addır.
Android 8.0 (API düzeyi 26), birden fazla sınıf yükleyicinin sınıf tanımlamaya çalışmasını desteklemez
aynı DexFile nesnesini kullanır. Bunu yapmaya çalışmak, Android çalışma zamanının
InternalError
.
"<filename>
dex dosyasını kaydetmeye çalışılıyor
birden fazla sınıf yükleyici ile".
DexFile API desteği sonlandırılmıştır ve
platform sınıf yükleyicilerinden biri, PathClassLoader
veya
Bunun yerine BaseDexClassLoader
.
Not:
dosya sistemindeki aynı APK veya JAR dosya kapsayıcısını içermelidir. Bu yöntem normal bir şekilde
ek bellek yüküne neden olur: Kapsayıcıdaki DEX dosyaları
sıkıştırıldığında, platform şunun yerine bunlar üzerinde bir mmap
işlemi gerçekleştirebilir:
ayıklayabilir. Ancak platformun, DEX dosyasını kapsayıcıdan çıkarması gerekiyorsa
bir DEX dosyasına bu şekilde referans olması çok fazla bellek kullanabilir.
Android'de tüm sınıf yükleyiciler paralel yetenekli olarak kabul edilir. Birden fazla iş parçacığı aynı sınıfla aynı sınıfı yüklemek için yarıştığında işlemi tamamlayan ilk iş parçacığı kazanır ve sonuç, ileti dizileri. Bu davranış, sınıf yükleyicisinin aynı sınıfı döndürdü, farklı bir sınıf döndürdü veya bir istisnaya neden oldu. Platform bu tür istisnaları sessizce yoksayar.
Dikkat: Platformun sürümlerinde daha düşük bir sürüm olduğundan bu varsayımların yıkılması, sınıf karışıklığı nedeniyle yığın bozulması, ve diğer istenmeyen etkilerden bahsedeceğiz.