Android 6.0 (API düzeyi 23), yeni özellikler ve özelliklerin yanı sıra çeşitli sistem değişiklikleri ve API davranışı değişiklikleri içerir. Bu dokümanda, uygulamalarınızda anlamanız ve hesaba katmanız gereken bazı önemli değişiklikler vurgulanmaktadır.
Daha önce Android için bir uygulama yayınladıysanız, platformdaki bu değişikliklerin uygulamanızı etkileyeceğini unutmayın.
Çalışma Zamanı İzinleri
Bu sürümde, kullanıcıların çalışma zamanında uygulama izinlerini doğrudan yönetebileceği yeni bir izin modeli kullanıma sunuluyor. Bu model, kullanıcılara izinler üzerinde daha fazla görünürlük ve kontrol sunarken uygulama geliştiriciler için yükleme ve otomatik güncelleme süreçlerini basitleştirir. Kullanıcılar yüklü uygulamalar için tek tek izin verebilir veya izinleri iptal edebilir.
Android 6.0 (API düzeyi 23) veya sonraki sürümleri hedefleyen uygulamalarınızda çalışma zamanında izin olup olmadığını kontrol edip gerekli izinleri verdiğinizden emin olun. Uygulamanıza izin verilip verilmediğini belirlemek için yeni checkSelfPermission()
yöntemini çağırın. İzin istemek için yeni requestPermissions()
yöntemini çağırın. Uygulamanız Android 6.0'ı (API düzeyi 23) hedeflemese bile uygulamanızı yeni izin modeliyle test etmelisiniz.
Uygulamanızda yeni izin modelini desteklemeyle ilgili ayrıntılar için Sistem İzinleriyle Çalışma bölümüne bakın. Uygulamanız üzerindeki etkiyi nasıl değerlendireceğinizle ilgili ipuçları için İzin Kullanım Notları'na bakın.
Doz ve Uygulamayı Beklemeye Alma
Bu sürümde, boşta olan cihazlar ve uygulamalar için yeni güç tasarrufu optimizasyonları kullanıma sunulmuştur. Bu özellikler tüm uygulamaları etkilediğinden, uygulamalarınızı bu yeni modlarda test ettiğinizden emin olun.
- Doz: Kullanıcı, bir cihazın fişini çekip ekranı kapalıyken hareketsiz halde bırakırsa bir süre boyunca Doz moduna geçer ve bu modda sistemi uyku durumunda tutmaya çalışır. Bu modda cihazlar kısa süreliğine düzenli olarak normal şekilde çalışmaya devam eder. Böylece uygulama senkronizasyonu gerçekleşir ve sistem bekleyen tüm işlemleri gerçekleştirebilir.
- Uygulamayı Beklemeye Alma: Uygulama Bekletme, sistemin bir uygulamayı aktif olarak kullanmadığı sırada boşta olup olmadığını belirlemesine olanak tanır. Sistem bu tespiti, kullanıcı belirli bir süre boyunca uygulamaya dokunmadığında yapılır. Cihaz fişe takılı değilse sistem ağ erişimini devre dışı bırakır ve boşta olduğunu düşündüğü uygulamalara ilişkin senkronizasyonları ve işleri askıya alır.
Güç tasarrufu sağlayan bu değişiklikler hakkında daha fazla bilgi edinmek için Doz ve Uygulamayı Beklemeye Alma özelliklerini optimize etme bölümüne bakın.
Apache HTTP İstemcisini Kaldırma
Android 6.0 sürümü, Apache HTTP istemcisi desteğini kaldırır. Uygulamanız bu istemciyi kullanıyorsa ve Android 2.3 (API düzeyi 9) veya sonraki sürümleri hedefliyorsa bunun yerine HttpURLConnection
sınıfını kullanın. Bu API, şeffaf sıkıştırma ve yanıt önbelleğe alma yoluyla ağ kullanımını azalttığı ve güç tüketimini en aza indirdiği için daha verimlidir. Apache HTTP API'lerini kullanmaya devam etmek için önce build.gradle
dosyanızda aşağıdaki derleme zamanı bağımlılığını beyan etmeniz gerekir:
android { useLibrary 'org.apache.http.legacy' }
BoringSSL
Android, OpenSSL'den BoringSSL kitaplığına geçiyor. Uygulamanızda Android NDK'yı kullanıyorsanız NDK API'sinin parçası olmayan libcrypto.so
ve libssl.so
gibi kriptografik kitaplıklara bağlantı vermeyin. Bu kitaplıklar, herkese açık API'ler değildir ve sürümler ile cihazlar arasında haber verilmeden değiştirilebilir veya bozulabilir.
Ayrıca, güvenlik açıklarına maruz kalabilirsiniz. Bunun yerine, yerel kodunuzu JNI aracılığıyla Java kriptografi API'lerini çağıracak veya seçtiğiniz bir kriptografi kitaplığına statik olarak bağlantı kuracak şekilde değiştirin.
Donanım Tanımlayıcıya Erişim
Android, kullanıcılara daha fazla veri koruması sağlamak amacıyla bu sürümden itibaren kablosuz bağlantı ve Bluetooth API'lerini kullanan uygulamalar için cihazın yerel donanım tanımlayıcısına programatik erişimi kaldıracaktır. WifiInfo.getMacAddress()
ve BluetoothAdapter.getAddress()
yöntemleri artık 02:00:00:00:00:00
sabit değerini döndürüyor.
Yakındaki harici cihazların Bluetooth ve kablosuz ağ taramaları üzerinden donanım tanımlayıcılarına erişmek için uygulamanızın artık ACCESS_FINE_LOCATION
veya ACCESS_COARSE_LOCATION
izinlerine sahip olması gerekir:
Not: Android 6.0 (API düzeyi 23) çalıştıran bir cihaz arka planda kablosuz ağ veya Bluetooth taraması başlattığında, işlem rastgele bir MAC adresinden geldiğiyle harici cihazlar tarafından görülebilir.
Bildirimler
Bu sürüm Notification.setLatestEventInfo()
yöntemini kaldırır. Bildirimler oluşturmak için bunun yerine Notification.Builder
sınıfını kullanın. Bir bildirimi tekrar tekrar güncellemek için Notification.Builder
örneğini yeniden kullanın. Güncellenmiş Notification
örneklerini almak için build()
yöntemini çağırın.
adb shell dumpsys notification
komutu artık bildirim metninizi yazdırmaz.
Bir bildirim nesnesindeki metni yazdırmak için bunun yerine adb shell dumpsys notification --noredact
komutunu kullanın.
Audio Manager Değişiklikleri
AudioManager
sınıfı aracılığıyla ses düzeyini doğrudan ayarlama veya belirli akışları yoksayma artık desteklenmemektedir. setStreamSolo()
yöntemi kullanımdan kaldırıldığı için bunun yerine requestAudioFocus()
yöntemini çağırmalısınız. Benzer şekilde, setStreamMute()
yöntemi de kullanımdan kaldırılır. Bunun yerine, adjustStreamVolume()
yöntemini çağırın ve yön değerini ADJUST_MUTE
veya ADJUST_UNMUTE
olarak geçirin.
Metin Seçimi
Kullanıcılar uygulamanızda metin seçtiğinde artık Kes, Kopyala ve Yapıştır gibi metin seçimi işlemlerini bir kayan araç çubuğunda görüntüleyebilirsiniz. Kullanıcı etkileşimi uygulaması, bağımsız görünümler için bağlamsal işlem modunu etkinleştirme bölümünde açıklandığı gibi, bağlamsal işlem çubuğuna benzerdir.
Metin seçimi için kayan bir araç çubuğu uygulamak üzere mevcut uygulamalarınızda aşağıdaki değişiklikleri yapın:
View
veyaActivity
nesnenizdestartActionMode(Callback)
olanActionMode
çağrılarınızıstartActionMode(Callback, ActionMode.TYPE_FLOATING)
olarak değiştirin.- Bunun yerine mevcut
ActionMode.Callback
uygulamanızı alıpActionMode.Callback2
kapsamını genişletin. - Görünümde içerik
Rect
nesnesinin koordinatlarını (metin seçim dikdörtgeni gibi) sağlamak içinonGetContentRect()
yöntemini geçersiz kılın. - Dikdörtgen konumlandırması artık geçerli değilse ve geçersiz kılınacak tek öğe buysa
invalidateContentRect()
yöntemini çağırın.
Android Support Library düzeltme 22.2'sini kullanıyorsanız, kayan araç çubuklarının geriye dönük uyumlu olmadığını ve appcompat'ın varsayılan olarak ActionMode
nesnelerini kontrol ettiğini unutmayın. Bu, kayan araç çubuklarının görüntülenmesini engeller. AppCompatActivity
öğesinde ActionMode
desteğini etkinleştirmek için getDelegate()
çağrısı yapın, ardından döndürülen
AppCompatDelegate
nesnesinde
setHandleNativeActionModesEnabled()
çağrısı yapın ve giriş parametresini false
olarak ayarlayın. Bu çağrı, ActionMode
nesnelerinin denetimini çerçeveye döndürür. Çerçevenin ActionBar
veya kayan araç çubuğu modlarını desteklemesine olanak tanıyan Android 6.0 (API düzeyi 23) sürümünü çalıştıran cihazlarda ise Android 5.1 (API düzeyi 22) veya önceki sürümleri çalıştıran cihazlarda yalnızca ActionBar
modları desteklenir.
Tarayıcı Yer İşareti Değişiklikleri
Bu sürümle birlikte genel yer işaretleri desteği kaldırılmıştır. android.provider.Browser.getAllBookmarks()
ve android.provider.Browser.saveBookmark()
yöntemleri artık kaldırılmıştır. Benzer şekilde READ_HISTORY_BOOKMARKS
ve WRITE_HISTORY_BOOKMARKS
izinleri de kaldırılır. Uygulamanız Android 6.0 (API düzeyi 23) veya sonraki bir sürümü hedefliyorsa genel sağlayıcının yer işaretlerine erişmeyin veya yer işareti izinlerini kullanmayın. Bunun yerine, uygulamanız yer işareti
verilerini dahili olarak depolamalıdır.
Android Anahtar Deposu Değişiklikleri
Bu sürümle birlikte Android Anahtar Deposu sağlayıcısı artık Dinamik Arama Ağı Reklamlarını desteklememektedir. ECDSA desteklenmektedir.
Aktif olmayan şifreleme gerektirmeyen anahtarlar, güvenli kilit ekranı devre dışı bırakıldığında veya sıfırlandığında (ör. kullanıcı veya cihaz yöneticisi tarafından) artık silinmez. Aktif olmayan şifreleme gerektiren anahtarlar bu etkinlikler sırasında silinir.
Kablosuz Bağlantı ve Ağ İletişimi Değişiklikleri
Bu sürümde, kablosuz ağ ve ağ iletişimi API'lerinde aşağıdaki davranış değişiklikleri kullanıma sunulmuştur.
- Uygulamalarınız artık
WifiConfiguration
nesnelerinin durumunu yalnızca bu nesneleri siz oluşturduysanız değiştirebilir. Kullanıcı veya diğer uygulamalar tarafından oluşturulanWifiConfiguration
nesnelerini değiştirmenize veya silmenize izin verilmez. -
Daha önce, bir uygulama
disableAllOthers=true
ayarıylaenableNetwork()
kullanarak cihazı belirli bir kablosuz ağa bağlanmaya zorlarsa cihazın hücresel veri gibi diğer ağlarla bağlantısı kesilirdi. Bu sürümde, cihazın diğer ağlarla bağlantısı artık kesilmez. UygulamanızıntargetSdkVersion
değeri“20”
veya daha düşükse seçili kablosuz ağa sabitlenmiştir. UygulamanızıntargetSdkVersion
değeri“21”
veya daha yüksekse ağ trafiğinin seçilen ağda gönderildiğinden emin olmak için çoklu ağ API'lerini (ör.openConnection()
,bindSocket()
ve yenibindProcessToNetwork()
yöntemi) kullanın.
Kamera Hizmeti Değişiklikleri
Bu sürümde, kamera hizmetinde paylaşılan kaynaklara erişim modeli, önceki "ilk gelen alır" erişim modelinden yüksek öncelikli işlemlerin tercih edildiği bir erişim modeline dönüştürüldü. Hizmet davranışındaki değişiklikler şunlardır:
- Kamera alt sistemi kaynaklarına erişim (kamera cihazı açma ve yapılandırma dahil), istemci uygulama işleminin "önceliğine" göre verilir. Kullanıcı tarafından görülebilen veya ön plan etkinlikleri olan uygulama işlemlerine genellikle daha yüksek öncelik verilir. Bu da kamera kaynağı edinme ve kullanımını daha güvenilir hale getirir.
- Daha yüksek öncelikli bir uygulama kamerayı kullanmaya çalıştığında, düşük öncelikli uygulamalar için etkin kamera istemcileri "çıkarılabilir". Kullanımdan kaldırılan
Camera
API'de bu durum,onError()
tarafından çıkarılan istemci için çağrılmasına neden olur.Camera2
API'deonDisconnected()
, çıkarılan istemci için çağrılıyor. - Uygun kamera donanımına sahip cihazlarda ayrı uygulama işlemleri, ayrı kamera cihazlarını bağımsız olarak aynı anda açıp kullanabilir. Ancak aynı anda erişimin açık kamera cihazlarından herhangi birinin performansında veya becerilerinde önemli düşüşlere neden olduğu çok işlemli kullanım alanları artık kamera hizmeti tarafından algılanıp bunlara izin verilmemektedir. Bu değişiklik, başka bir uygulama aynı kamera cihazına doğrudan erişmeye çalışmasa bile daha düşük öncelikli istemcilerde "çıkarma işlemleri" yapılmasına neden olabilir.
- Mevcut kullanıcının değiştirilmesi, önceki kullanıcı hesabına ait uygulamalardaki etkin kamera istemcilerinin çıkarılmasına neden olur. Kameraya erişim, geçerli cihaz kullanıcısına ait kullanıcı profilleriyle sınırlıdır. Örneğin, pratikte bu durum, kullanıcı farklı bir hesaba geçiş yaptığında "Misafir" hesabının, kamera alt sistemini kullanan işlemleri çalışır durumda bırakamayacağı anlamına gelir.
Süre
ART çalışma zamanı artık newInstance()
yöntemi için erişim kurallarını düzgün bir şekilde uyguluyor. Bu değişiklik, Dalvik'in önceki sürümlerde erişim kurallarını yanlış kontrol ettiği bir sorunu düzeltmektedir.
Uygulamanız newInstance()
yöntemini kullanıyorsa ve erişim kontrollerini geçersiz kılmak istiyorsanız giriş parametresi true
olarak ayarlanmış şekilde setAccessible()
yöntemini çağırın. Uygulamanız v7 appcompat kitaplığını veya v7 geri dönüşüm görüntüleme kitaplığını kullanıyorsa bu kitaplıkların en yeni sürümlerini kullanmak için uygulamanızı güncellemeniz gerekir. Aksi takdirde, XML'den başvurulan tüm özel sınıfların, sınıf kurucularının erişilebilir olacak şekilde güncellendiğinden emin olun.
Bu sürüm, dinamik bağlayıcının davranışını günceller. Dinamik bağlayıcı artık bir kitaplığın soname
öğesi ile yolu (
herkese açık hata 6670) arasındaki farkı anlıyor ve soname
ile arama
uygulanıyor. Daha önce çalışan ancak bozuk DT_NEEDED
girişleri (genellikle derleme makinesinin dosya sistemindeki mutlak yollar) olan uygulamalar yüklendiğinde başarısız olabilir.
dlopen(3) RTLD_LOCAL
işareti artık doğru şekilde uygulanmış. Varsayılan
RTLD_LOCAL
olduğundan, açıkça RTLD_LOCAL
kullanmayan dlopen(3)
çağrıları bu durumdan
etkilenecektir (uygulamanız açık bir şekilde RTLD_GLOBAL
kullanmadığı sürece). RTLD_LOCAL
ile birlikte semboller, DT_NEEDED
girişleriyle başvurulmaz ve daha sonra dlopen(3)
çağrılarıyla yüklenen kitaplıklarda kullanılamaz.
Android'in önceki sürümlerinde, uygulamanız sistemden metinlerin yerlerini değiştirerek paylaşılan bir kitaplık yüklemesini isterse sistem bir uyarı gösteriyordu ancak yine de kitaplığın yüklenmesine izin veriyordu.
Bu sürümden itibaren, uygulamanızın hedef SDK sürümü 23 veya üstü ise sistem bu kitaplığı reddeder. Bir kitaplığın yüklenip yüklenemeyeceğini tespit etmenize yardımcı olmak için uygulamanız dlopen(3)
hatasını günlüğe kaydetmeli ve dlerror(3)
çağrısının döndürdüğü sorun açıklaması metnini içermelidir. Metin taşıma işlemlerini ele alma hakkında daha fazla bilgi edinmek için bu kılavuzu inceleyin.
APK Doğrulama
Platformda artık APK'lar daha sıkı bir şekilde doğrulanıyor. Bir dosya, manifest dosyasında tanımlanmışsa ancak APK'nın kendisinde bulunmuyorsa APK bozuk olarak kabul edilir. İçeriklerden herhangi biri kaldırılırsa APK yeniden imzalanmalıdır.
USB Bağlantısı
USB bağlantı noktası üzerinden yapılan cihaz bağlantıları artık varsayılan olarak yalnızca şarj moduna ayarlıdır. Cihaza ve içeriğine USB bağlantısı üzerinden erişmek için kullanıcıların bu tür etkileşimlere açıkça izin vermesi gerekir. Uygulamanız, USB bağlantı noktası üzerinden cihazla kullanıcı etkileşimlerini destekliyorsa etkileşimin açıkça etkinleştirilmesi gerektiğini unutmayın.
Android for Work Değişiklikleri
Bu sürüm, Android for Work için aşağıdaki davranış değişikliklerini içerir:
- Kişisel bağlamda iş iletişim bilgileri. Google Çevirici
Arama Kaydı, kullanıcı geçmiş aramaları görüntülediğinde artık iş kişilerini de gösteriyor.
setCrossProfileCallerIdDisabled()
true
olarak ayarlanırsa Google Çevirici Arama Kaydı'ndaki iş profili kişileri gizlenir. Cihazlarda, iş kişileri özel kişilerle birlikte görüntülenebilir. Bunun içinsetBluetoothContactSharingDisabled()
ayarınıfalse
yapmanız gerekir. Varsayılan olaraktrue
şeklinde ayarlanmıştır. - Kablosuz ağ yapılandırmasını kaldırma: Bir Profil Sahibi tarafından eklenen kablosuz ağ yapılandırmaları (örneğin,
addNetwork()
yöntemine yapılan çağrılar aracılığıyla) artık iş profili silindiğinde artık kaldırılmaktadır. - Kablosuz yapılandırması tam kilitleme:
WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN
sıfır dışında bir değerse etkin bir Cihaz Sahibi tarafından oluşturulan herhangi bir kablosuz ağ yapılandırması artık kullanıcı tarafından değiştirilemez veya silinemez. Kullanıcı yine de kendi kablosuz ağ yapılandırmalarını oluşturabilir ve değiştirebilir. Etkin Cihaz Sahipleri, kendileri tarafından oluşturulmayanlar da dahil olmak üzere tüm kablosuz yapılandırmaları düzenleme veya kaldırma ayrıcalığına sahiptir. - Google Hesabı ekleyerek cihaz politikası denetleyiciyi indirme: Cihaz politikası denetleyici (DPC) uygulaması aracılığıyla yönetim gerektiren bir Google hesabı yönetilen bağlam dışındaki bir cihaza eklendiğinde, hesap ekleme akışı artık kullanıcıdan uygun WPC'yi yüklemesini ister. Bu davranış, Ayarlar > Hesaplar aracılığıyla ve ilk cihaz kurulumu sihirbazında eklenen hesaplar için de geçerlidir.
- Belirli
DevicePolicyManager
API davranışlarında yapılan değişiklikler:setCameraDisabled()
yönteminin çağrılması, yalnızca arayan kullanıcı için kamerayı etkiler. Kameranın yönetilen profilden çağrılması, birincil kullanıcıda çalışan kamera uygulamalarını etkilemez.- Ek olarak,
setKeyguardDisabledFeatures()
yöntemi artık hem Profil Sahipleri hem de Cihaz Sahipleri tarafından kullanılabilir. - Profil Sahibi, şu tuş koruyucu kısıtlamalarını ayarlayabilir:
KEYGUARD_DISABLE_TRUST_AGENTS
veKEYGUARD_DISABLE_FINGERPRINT
ayarları. Profilin üst kullanıcısı için tuş koruyucu ayarlarını etkiler.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS
; bu ayar yalnızca yönetilen profildeki uygulamalar tarafından oluşturulan bildirimleri etkiler.
DevicePolicyManager.createAndInitializeUser()
veDevicePolicyManager.createUser()
yöntemleri kullanımdan kaldırılmıştır.setScreenCaptureDisabled()
yöntemi artık belirli bir kullanıcının uygulaması ön plandayken destek yapısını da engelliyor.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
artık varsayılan olarak SHA-256 değerine ayarlanıyor. SHA-1, geriye dönük uyumluluk için hâlâ desteklense de gelecekte kaldırılacaktır.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
artık yalnızca SHA-256'yı kabul ediyor.- Android 6.0'da (API düzeyi 23) mevcut olan cihaz başlatıcı API'leri kaldırıldı.
EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS
kaldırıldığında, fabrika ayarlarına sıfırlanan cihazın NFC dokundurma temel hazırlığı programatik olarak açılamaz.- Artık yönetilen cihazın NFC temel hazırlığı sırasında cihaz sahibinin uygulamasına veri iletmek için
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
ekstrasını kullanabilirsiniz. - Android for Work API'leri; İş profilleri, destek katmanı ve benzeri M çalışma zamanı izinleri için optimize edilmiştir. Yeni
DevicePolicyManager
izni API'leri, M öncesi uygulamaları etkilemez. - Kullanıcılar bir
ACTION_PROVISION_MANAGED_PROFILE
veyaACTION_PROVISION_MANAGED_DEVICE
amacı aracılığıyla başlatılan kurulum akışının eşzamanlı bölümünden çıktığında sistem artıkRESULT_CANCELED
sonuç kodu döndürür.
- Diğer API'lerde yapılan değişiklikler:
- Veri Kullanımı:
android.app.usage.NetworkUsageStats
sınıfının adıNetworkStats
olarak değiştirildi.
- Veri Kullanımı:
- Genel ayarlarda yapılan değişiklikler:
- Bu ayarlar artık
setGlobalSettings()
aracılığıyla ayarlanamaz:BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON
- Bu genel ayarlar artık
setGlobalSettings()
aracılığıyla ayarlanabilir:
- Bu ayarlar artık