Android 6.0 (API düzeyi 23), yeni özellikler ve özelliklerle birlikte çeşitli sistem değişiklikleri ve API davranışı değişiklikleri içerir. Bu dokümanda, uygulamalarınızda anlamanız ve dikkate almanı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ı etkilediğini unutmayın.
Çalışma Zamanı İzinleri
Bu sürümde, kullanıcıların artık çalışma zamanında uygulama izinlerini doğrudan yönetebileceği yeni bir izin modeli kullanıma sunulmuştur. Bu model, kullanıcılara izinler üzerinde daha iyi görünürlük ve kontrol sağlarken uygulama geliştiriciler için yükleme ve otomatik güncelleme süreçlerini kolaylaştırır. Kullanıcılar yüklü uygulamalar için izinleri tek tek verebilir veya iptal edebilir.
Android 6.0 (API düzeyi 23) veya sonraki sürümleri hedefleyen uygulamalarınızda, çalışma zamanında izinleri kontrol edip istemeyi unutmayın. 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 modeli altında test etmeniz gerekir.
Uygulamanızda yeni izin modelini destekleme hakkında ayrıntılı bilgi için Sistem izinleriyle çalışma başlıklı makaleyi inceleyin. Uygulamanız üzerindeki etkiyi nasıl değerlendireceğinizle ilgili ipuçları için İzin Kullanım Notları başlıklı makaleyi inceleyin.
Doz ve Uygulamayı Beklemeye Alma
Bu sürümde, boşta çalışan cihazlar ve uygulamalar için yeni güç tasarrufu optimizasyonları sunulmaktadır. Bu özellikler tüm uygulamaları etkilediğinden uygulamalarınızı bu yeni modlarda test etmeyi unutmayın.
- Dinlenme: Kullanıcı bir cihazın fişini çekip ekranı kapalı durumdayken bir süre boyunca sabit bırakırsa cihaz Dinlenme moduna geçer. Bu modda sistem uyku durumunda tutulmaya çalışılır. Bu modda cihazlar, uygulama senkronizasyonunun gerçekleşmesi ve sistemin bekleyen işlemleri gerçekleştirebilmesi için kısa sürelerle normal işlemleri düzenli olarak devam ettirir.
- Uygulama Bekleme: Uygulama Bekleme, kullanıcı uygulamayı etkin olarak kullanmadığında sistemin uygulamanın boşta olduğunu belirlemesine olanak tanır. Sistem, kullanıcı belirli bir süre boyunca uygulamaya dokunmadığında bu kararı verir. Cihazın fişi çekilirse sistem, ağ erişimini devre dışı bırakır ve boşta olduğunu düşündüğü uygulamaların senkronizasyonlarını ve işlerini 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 Modu için Optimizasyon bölümüne bakın.
Apache HTTP İstemcisini Kaldırma
Android 6.0 sürümü, Apache HTTP istemcisi desteğini kaldırıyor. 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 öncelikle build.gradle
dosyanızda aşağıdaki derleme zamanı bağımlılığını belirtmeniz gerekir:
android { useLibrary 'org.apache.http.legacy' }
BoringSSL
Android, OpenSSL'den BoringSSL kitaplığına geçiyor. Uygulamanızda Android NDK'yı kullanıyorsanız libcrypto.so
ve libssl.so
gibi NDK API'sinin bir parçası olmayan kriptografik kitaplıklara bağlantı vermeyin. Bu kitaplıklar, herkese açık API'ler değildir ve sürümler ile cihazlar genelinde haber verilmeden değiştirilebilir veya bozulabilir.
Ayrıca kendinizi güvenlik açıklarına da maruz bırakabilirsiniz. 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ğlanacak şekilde değiştirin.
Donanım Tanımlayıcısına Erişim
Android, bu sürümden itibaren kullanıcılara daha fazla veri koruması sağlamak için kablosuz ağ ve Bluetooth API'lerini kullanan uygulamalarda cihazın yerel donanım tanımlayıcısına programatik erişimi kaldırı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 donanım tanımlayıcılarına Bluetooth ve kablosuz ağ taramaları yoluyla 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) yüklü bir cihaz arka planda kablosuz ağ veya Bluetooth taraması başlattığında, işlem rastgele bir MAC adresinden geldiği için harici cihazlar tarafından görülebilir.
Bildirimler
Bu sürümde Notification.setLatestEventInfo()
yöntemi kaldırılmıştır. Bildirim 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ırmıyor.
Bir bildirim nesnesindeki metni yazdırmak için adb shell dumpsys notification --noredact
komutunu kullanın.
Ses Yöneticisi Değişiklikleri
Ses seviyesinin doğrudan ayarlanması veya AudioManager
sınıfı aracılığıyla belirli akışların sessize alınması artık desteklenmiyor. setStreamSolo()
yöntemi kullanımdan kaldırıldığı için bunun yerine requestAudioFocus()
yöntemini çağırmanız gerekir. Benzer şekilde, setStreamMute()
yönteminin desteği sonlandırılmıştır. Bunun yerine adjustStreamVolume()
yöntemini çağırın ve yön değerini ADJUST_MUTE
veya ADJUST_UNMUTE
olarak iletin.
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 kayan araç çubuğunda görüntüleyebilirsiniz. Kullanıcı etkileşimi uygulaması, Tekil görünümler için bağlama dayalı işlem modunu etkinleştirme başlıklı makalede açıklandığı gibi bağlama dayalı işlem çubuğuna benzer.
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
nesnenizde,ActionMode
çağrılarınızıstartActionMode(Callback)
yerinestartActionMode(Callback, ActionMode.TYPE_FLOATING)
olarak değiştirin.- Bunun yerine, mevcut
ActionMode.Callback
uygulamanızı alıpActionMode.Callback2
kapsamına alın. - Görüntüdeki
Rect
içeriği nesnesinin (ör. metin seçim dikdörtgeni) koordinatlarını 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 Destek Kitaplığı 22.2 düzeltmesini kullanıyorsanız yüzen araç çubuklarının geriye dönük uyumlu olmadığını ve appcompat'in varsayılan olarak ActionMode
nesneleri kontrol ettiğini unutmayın. Bu, yüzen araç çubuklarının gösterilmesini engeller. Bir AppCompatActivity
içinde ActionMode
desteğini etkinleştirmek için getDelegate()
'yi, ardından döndürülen AppCompatDelegate
nesnesinde setHandleNativeActionModesEnabled()
'ı çağırın ve giriş parametresini false
olarak ayarlayın. Bu çağrı, ActionMode
nesnelerinin kontrolünü çerçeveye döndürür. Android 6.0 (API düzeyi 23) yüklü cihazlarda bu, çerçevenin ActionBar
veya kayan araç çubuğu modlarını desteklemesine olanak tanır. Android 5.1 (API düzeyi 22) veya daha eski sürümleri çalıştıran cihazlarda ise yalnızca ActionBar
modları desteklenir.
Tarayıcı Yer İşareti Değişiklikleri
Bu sürüm, genel yer işaretleri için desteği kaldırır. android.provider.Browser.getAllBookmarks()
ve android.provider.Browser.saveBookmark()
yöntemleri kaldırıldı. Aynı ş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 sürümleri hedefliyorsa genel sağlayıcıdan yer işaretlerine erişmeyin veya yer işareti izinlerini kullanmayın. Bunun yerine, uygulamanız yer işareti verilerini dahili olarak saklamalıdır.
Android Anahtar Deposu Değişiklikleri
Bu sürümden itibaren Android Keystore sağlayıcısı artık DSA'yı desteklemiyor. ECDSA hâlâ desteklenmektedir.
Dinlenme durumunda şifreleme gerektirmeyen anahtarlar, güvenli kilit ekranı devre dışı bırakıldığında veya sıfırlandığında (örneğin, kullanıcı veya cihaz yöneticisi tarafından) artık silinmeyecek. Aktif olmayan şifreleme gerektiren anahtarlar bu etkinlikler sırasında silinir.
Kablosuz Bağlantı ve Ağ Değişiklikleri
Bu sürümde, Wi-Fi ve ağ iletişimi API'lerinde aşağıdaki davranış değişiklikleri yapılmıştır.
- Uygulamalarınız artık
WifiConfiguration
nesnelerin durumunu yalnızca bu nesneleri oluşturduysanız değiştirebilir. Kullanıcı veya diğer uygulamalar tarafından oluşturulanWifiConfiguration
nesneleri değiştirmenize veya silmenize izin verilmez. -
Daha önce, bir uygulama
disableAllOthers=true
ayarıylaenableNetwork()
kullanarak cihazı belirli bir kablosuz ağa bağlanmaya zorladığında cihazın hücresel veri gibi diğer ağlarla bağlantısı kesiliyordu. Bu sürümde, cihaz artık bu tür diğer ağların bağlantısını kesmiyor. UygulamanızıntargetSdkVersion
değeri“20”
veya daha düşükse seçili kablosuz ağa sabitlenir. UygulamanızıntargetSdkVersion
değeri“21”
veya daha yüksekse ağ trafiğinin seçilen ağda gönderilmesini sağlamak için çok ağlı API'leri (openConnection()
,bindSocket()
ve yenibindProcessToNetwork()
yöntemi gibi) kullanın.
Kamera Hizmeti Değişiklikleri
Bu sürümde, kamera hizmetindeki paylaşılan kaynaklara erişim modeli, önceki "ilk gelen, ilk hizmet alır" erişim modelinden yüksek öncelikli süreçlerin tercih edildiği bir erişim modeli olarak değiştirilmiştir. Hizmet davranışında yapılan değişiklikler şunlardır:
- Kamera alt sistem 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 planda çalışan etkinlikler içeren uygulama işlemlerine genellikle daha yüksek öncelik verilir. Bu da kamera kaynağı edinme ve kullanma işlemini daha güvenilir hale getirir.
- Daha yüksek öncelikli bir uygulama kamerayı kullanmaya çalıştığında, daha düşük öncelikli uygulamalara ait etkin kamera istemcileri "çıkarılabilir". Desteği sonlandırılan
Camera
API'de bu, kullanımdan kaldırılan istemci içinonError()
çağrılmasına neden olur.Camera2
API'de bu durum,onDisconnected()
çıkarılan istemcinin çağrılmasıyla sonuçlanır. - Uygun kamera donanımına sahip cihazlarda, ayrı uygulama işlemleri ayrı kamera cihazlarını bağımsız olarak açıp aynı anda kullanabilir. Bununla birlikte, aynı anda erişimin açık kamera cihazlarından herhangi birinin performansında veya yeteneklerinde önemli düzeyde düşüşe neden olduğu çok işlemli kullanım alanları artık kamera hizmeti tarafından algılanıyor ve bunlara izin verilmiyor. Bu değişiklik, başka hiçbir uygulama doğrudan aynı kamera cihazına erişmeye çalışmasa bile daha düşük öncelikli istemcilerin "çıkarılmasına" neden olabilir.
- Mevcut kullanıcının değiştirilmesi, önceki kullanıcı hesabına ait uygulamalardaki etkin kamera istemcilerinin kaldırılmasına neden olur. Kameraya erişim, geçerli cihaz kullanıcısına ait kullanıcı profilleriyle sınırlıdır. Pratikte bu, örneğin bir "Misafir" hesabının, kullanıcı farklı bir hesaba geçtiğinde kamera alt sistemini kullanan çalışan işlemleri bırakamayacağı anlamına gelir.
Çalışma zamanı
ART çalışma zamanı artık newInstance()
yöntemi için erişim kurallarını doğru şekilde uyguluyor. Bu değişiklik, Dalvik'in önceki sürümlerde erişim kurallarını yanlış kontrol etmesine neden olan bir sorunu düzeltir.
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 recyclerview kitaplığını kullanıyorsa uygulamanızı bu kitaplıkların en son sürümlerini kullanacak şekilde güncellemeniz gerekir. Aksi takdirde, XML'den referans verilen tüm özel sınıfların, sınıf yapıcılarına erişilebilmesi için güncellendiğinden emin olun.
Bu sürümde dinamik bağlayıcının davranışı güncellendi. Dinamik bağlayıcı artık bir kitaplığın soname
ile yolu arasındaki farkı anlıyor (
kamuya açık 6670 numaralı hata) ve soname
'ye göre arama özelliği uygulandı. Daha önce çalışan ve hatalı DT_NEEDED
girişleri (genellikle derleme makinesinin dosya sistemindeki mutlak yollar) olan uygulamalar yüklenirken başarısız olabilir.
dlopen(3) RTLD_LOCAL
işareti artık doğru şekilde uygulanıyor. Varsayılan olarak RTLD_LOCAL
olduğunu unutmayın. Bu nedenle, açıkça RTLD_LOCAL
kullanmayan dlopen(3)
çağrıları etkilenecektir (uygulamanız açıkça RTLD_GLOBAL
kullanmadığı sürece). RTLD_LOCAL
ile sonraki adımlarda (DT_NEEDED
girişleriyle değil) dlopen(3)
için yapılan çağrılar tarafından yüklenen kitaplıklarda simgeler kullanılamaz.
Android'in önceki sürümlerinde uygulamanız sistemin, metin yer değiştirme içeren paylaşılan bir kitaplığı yüklemesini istemişse sistem bir uyarı gösteriyor ancak yine de kitaplığın yüklenmesine izin veriyordu.
Bu sürümden itibaren uygulamanızın hedef SDK sürümü 23 veya sonraki bir sürümse sistem bu kitaplığı reddeder. Bir kitaplığın yüklenip yüklenmediğ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şlemleriyle ilgili daha fazla bilgi edinmek için bu kılavuza göz atın.
APK Doğrulama
Platform artık APK'ları daha sıkı bir şekilde doğruluyor. Manifest dosyasında tanımlanan ancak APK'da bulunmayan dosyalar, APK'nın bozuk olduğu anlamına gelir. İç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 ayarlanmıştır. USB bağlantısı üzerinden cihaza ve içeriğine erişmek için kullanıcıların bu tür etkileşimlere açıkça izin vermesi gerekir. Uygulamanız, kullanıcıların USB bağlantı noktası üzerinden cihazla etkileşim kurmasını 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ğlamlarda iş kişileri Google Telefon uygulamasının Arama Günlüğü'nde artık kullanıcı geçmiş aramaları görüntülediğinde iş kişileri gösteriliyor.
setCrossProfileCallerIdDisabled()
değerinitrue
olarak ayarladığınızda Google Telefon uygulamasının Arama Günlüğü'nde iş profili kişileri gizlenir. İş kişileriniz, kişisel kişilerinizle birlikte Bluetooth üzerinden cihazlarda yalnızcasetBluetoothContactSharingDisabled()
'üfalse
olarak ayarladığınızda gösterilebilir. Varsayılan olaraktrue
olarak ayarlanmıştır. - Kablosuz ağ yapılandırmasının kaldırılması: Profil sahibi tarafından eklenen kablosuz ağ yapılandırmaları (ör.
addNetwork()
yöntemine yapılan çağrılar aracılığıyla), ilgili iş profili silinirse kaldırılır. - Kablosuz yapılandırma kilidi: Etkin bir cihaz sahibi tarafından oluşturulan tüm kablosuz yapılandırmalar,
WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN
sıfırdan farklıysa kullanıcı tarafından değiştirilemez veya silinemez. Kullanıcı, kendi kablosuz yapılandırmalarını oluşturmaya ve değiştirmeye devam edebilir. Etkin Cihaz Sahipleri, kendileri tarafından oluşturulmayanlar da dahil olmak üzere tüm kablosuz ağ yapılandırmalarını düzenleme veya kaldırma ayrıcalığına sahiptir. - Google Hesabı ekleme üzerinden cihaz politikası denetleyicisini indirme: Cihaz politikası denetleyicisi (DPC) uygulaması aracılığıyla yönetilmeyi gerektiren bir Google Hesabı, yönetilen bağlamın dışında bir cihaza eklendiğinde hesap ekleme akışında artık kullanıcıdan uygun WPC'yi yüklemesi istenir. Bu davranış Ayarlar > Hesaplar aracılığıyla ve ilk cihaz kurulum sihirbazında eklenen hesaplar için de geçerlidir.
- Belirli
DevicePolicyManager
API davranışlarında yapılan değişiklikler:setCameraDisabled()
yöntemini çağırmak, kamerayı yalnızca arayan kullanıcı için etkiler. Yönetilen profilden çağırmak, birincil kullanıcıda çalışan kamera uygulamalarını etkilemez.- Ayrıca, bu yöntem artık
setKeyguardDisabledFeatures()
profil sahipleri ve cihaz sahipleri tarafından da kullanılabilir. - Profil sahipleri şu kilit ekranı kısıtlamalarını ayarlayabilir:
KEYGUARD_DISABLE_TRUST_AGENTS
veKEYGUARD_DISABLE_FINGERPRINT
, profilin ebeveyn kullanıcısının anahtar kilidi ayarlarını etkiler.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS
, yalnızca yönetilen profildeki uygulamalar tarafından oluşturulan bildirimleri etkiler.
DevicePolicyManager.createAndInitializeUser()
veDevicePolicyManager.createUser()
yöntemleri kullanımdan kaldırıldı.setScreenCaptureDisabled()
yöntemi artık belirli bir kullanıcının uygulaması ön plandayken de yardımcı yapıyı engelliyor.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
şimdi varsayılan olarak SHA-256'ya ayarlandı. SHA-1, geriye dönük uyumluluk için hâlâ desteklenmektedir ancak gelecekte kaldırılacaktır.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
şimdi yalnızca SHA-256'yı kabul etmektedir.- Android 6.0'da (API düzeyi 23) bulunan cihaz başlatıcı API'leri artık kaldırılmıştır.
- NFC temassız temel hazırlığı, fabrika ayarlarına sıfırlanmış ve korumalı bir cihazın kilidini programlı olarak açamayacağı için
EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS
kaldırılır. - Artık yönetilen cihazın NFC temel hazırlığı sırasında cihaz sahibi uygulamasına veri aktarmak için
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
ek özelliğini kullanabilirsiniz. - Android for Work API'leri; İş profilleri, destek katmanı ve diğer M çalışma zamanı izinleri için optimize edilmiştir. Yeni
DevicePolicyManager
izin API'leri, M öncesi uygulamaları etkilemez. - Kullanıcılar,
ACTION_PROVISION_MANAGED_PROFILE
veyaACTION_PROVISION_MANAGED_DEVICE
intent'i aracılığıyla başlatılan kurulum akışının senkronize kısmından geri çekildiğinde sistem artık birRESULT_CANCELED
sonuç kodu döndürüyor.
- Diğer API'lerde yapılan değişiklikler:
- Veri Kullanımı:
android.app.usage.NetworkUsageStats
sınıfıNetworkStats
olarak yeniden adlandırıldı.
- Veri Kullanımı:
- Genel ayarlarda yapılan değişiklikler:
- Bu ayarlar artık
setGlobalSettings()
üzerinden değiştirilemez:BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON
- Bu genel ayarlar artık
setGlobalSettings()
üzerinden ayarlanabilir:
- Bu ayarlar artık