Android 8.1 (API düzeyi 27), kullanıcılar ve geliştiriciler için çeşitli yeni özellikler ve olanaklar sunar. Bu dokümanda, geliştiriciler için yenilikler vurgulanmaktadır.
Android Oreo (Go sürümü)
Android Go, dünyanın her yerinden internete giren milyarlarca kişi için Android deneyimini optimize etme girişimimizdir. Android 8.1'den başlayarak, Android'i giriş düzeyindeki cihazlar için harika bir platform haline getiriyoruz. Android Oreo (Go sürümü) yapılandırmasındaki özellikler şunlardır:
- Bellek optimizasyonları. Uygulamaların en fazla 1 GB RAM'e sahip cihazlarda verimli bir şekilde çalışabilmesi için platform genelinde bellek kullanımı iyileştirildi.
- Esnek hedefleme seçenekleri. Google Play aracılığıyla uygulamalarınızın normal veya düşük RAM'li cihazlara dağıtımını hedeflemenize olanak tanıyan yeni donanım özelliği sabitleri.
- Google Play.Tüm uygulamalar Android Oreo (Go sürümü) çalıştıran cihazlarda kullanılabilse de Google Play, milyarlarca kullanıcıya yönelik oluşturulan yapıyla milyarlarca kullanıcıya harika bir deneyim sunmak üzere geliştiriciler tarafından özel olarak optimize edilen uygulamalara görünürlük kazandırır yönergeler.
Bu yapıyı, milyarlarca kullanıcı için yönergeler Android Oreo (Go sürümü) çalıştıran cihazlar için nasıl optimize edeceğinize yönelik ek yardımlarla güncelledik. Çoğu geliştirici için, mevcut APK'nızı optimize etmek veya APK'nızın bir sürümünü düşük RAM'li cihazlara hedeflemek üzere Google Play'in Birden fazla APK özelliğini kullanmak, Android Oreo (Go sürümü) çalıştıran cihazlara hazırlanmanın en iyi yoludur. Uygulamanızı daha hafif ve daha verimli hale getirmenin, cihazdan bağımsız olarak tüm kitlenize fayda sağladığını unutmayın.
Sinir Ağları API'sı
Neural Networks API, Google'ın mobil cihazlara yönelik platformlar arası makine öğrenimi kitaplığı TensorFlow Lite, Caffe2 ve diğerleri gibi cihaz üzerinde makine öğrenimi çerçeveleri için hızlandırılmış bilgi işlem ve çıkarım sağlar. İndirmeler ve belgeler için TensorFlow Lite açık kaynak kod deposunu ziyaret edin. TensorFlow Lite; MobileNets, Inception v3 ve Akıllı Yanıt gibi modelleri mobil cihazınızda verimli bir şekilde çalıştırmak için Neural Networks API'si ile birlikte çalışır.
Otomatik doldurma çerçevesi güncellemeleri
Android 8.1 (API düzeyi 27), Otomatik Doldurma Çerçevesi'nde, uygulamalarınıza dahil edebileceğiniz çeşitli iyileştirmeler sağlar.
BaseAdapter
sınıfı artık bir adaptördeki değerlerin dize temsillerini sağlamanıza olanak tanıyan setAutofillOptions()
yöntemini içeriyor. Bu, bağdaştırıcılarındaki değerleri dinamik olarak oluşturan spinner denetimleri için yararlıdır. Örneğin, kullanıcıların kredi kartı son kullanma tarihi kapsamında seçebilecekleri yıl listesinin dize sunumunu sağlamak için setAutofillOptions()
yöntemini kullanabilirsiniz. Otomatik doldurma hizmetleri, verileri gerektiren görünümleri uygun şekilde doldurmak için dize gösterimini kullanabilir.
Buna ek olarak AutofillManager
sınıfı, bir sanal yapıdaki görünümün görünürlüğünde yapılan değişiklikler hakkında çerçeveyi bildirmek için çağırabileceğiniz notifyViewVisibilityChanged(View, int, boolean)
yöntemini içerir. Sanal olmayan yapılar için de bu yöntemin aşırı yüklenmesi söz konusudur. Bununla birlikte, yöntem zaten View
sınıfı tarafından çağrıldığından sanal olmayan yapılar genellikle çerçeveyi açık bir şekilde bildirmenizi gerektirmez.
Android 8.1, SaveInfo
içinde CustomDescription
and
Validator
desteği ekleyerek Otomatik Doldurma Hizmetleri'ne kullanıcı arayüzü kaydetme olanaklarını özelleştirme konusunda daha fazla özellik sunar.
Özel açıklamalar, otomatik doldurma hizmetinin nelerin kaydedildiğini açıklığa kavuşturmasına yardımcı olur. Örneğin, ekranda bir kredi kartı bulunduğunda kredi kartı bankasının logosu, kredi kartı numarasının son dört hanesi ve son kullanma numarası gösterilebilir. Daha fazla bilgi edinmek için
CustomDescription
dersini inceleyin.
Validator
nesneleri, Doğrulayıcı koşulu karşılanmadığında otomatik doldurma kaydetme kullanıcı arayüzünün gösterilmesini engellemek için kullanılır. Daha fazla bilgi edinmek için
Validator ve alt sınıfları olan
LuhnChecksumValidator ile RegexValidator sınıflarına bakın.
Bildirimler
Android 8.1, bildirimlerde aşağıdaki değişiklikleri içerir:
- Uygulamalar artık saniyede yalnızca bir kez bildirim uyarısı sesi çıkarabiliyor. Bu hızı aşan uyarı sesleri sıraya alınmaz ve kaybolur. Bu değişiklik, bildirim davranışının ve bildirim mesajlarının beklendiği gibi yayınlanmaya devam etmesinin diğer yönlerini etkilemez.
-
NotificationListenerService
veConditionProviderService
,ActivityManager.isLowRamDevice()
çağrıldığındatrue
döndüren düşük RAM'e sahip Android cihazlarda desteklenmez.
EditText güncellemesi
API düzeyi 27'den başlayarak EditText.getText()
yöntemi, daha önce bir CharSequence
döndürdü; Editable
. Editable
, CharSequence
yöntemini uyguladığından bu değişiklik geriye dönük olarak uyumludur.
Editable
arayüzü, değerli ek işlevler sunar. Örneğin, Editable
, Spannable
arayüzünü de uyguladığı için bir EditText
örneğindeki içeriğe işaretleme uygulayabilirsiniz.
Programatik Güvenli Tarama işlemleri
Güvenli Tarama API'sinin
WebView
uygulamasını kullanarak uygulamanız, WebView
örneğinin Google'ın bilinen tehdit olarak sınıflandırdığı bir URL'ye gitmeye çalıştığında bunu algılayabilir. Varsayılan olarak WebView
, kullanıcıları bilinen tehditlere karşı uyaran bir geçiş reklamı gösterir.
Bu ekran, kullanıcılara URL'yi yine de yükleme veya güvenli bir önceki sayfaya dönme seçeneği sunar.
Android 8.1'de, uygulamanızın bilinen bir tehdide nasıl tepki vereceğini programatik olarak tanımlayabilirsiniz:
- Uygulamanızın, Güvenli Tarama'ya karşı bilinen tehditleri bildirip bildirmeyeceğini kontrol edebilirsiniz.
- Uygulamanızın, Güvenli Tarama'nın bilinen tehdit olarak sınıflandırdığı bir URL ile karşılaştığı her seferinde otomatik olarak belirli bir işlemi (ör. güvenliğe geri dönme) gerçekleştirmesini sağlayabilirsiniz.
Not: Bilinen tehditlere karşı en iyi koruma için bir WebView
nesnesinin loadUrl()
yöntemini çağırmadan önce Güvenli Tarama'yı başlatana kadar bekleyin.
Aşağıdaki kod snippet'leri, uygulamanızın WebView
örneklerini bilinen bir tehditle karşılaştıktan sonra her zaman güvenli bir yere geri dönmeleri için nasıl yönlendirebileceğinizi gösterir:
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="true" /> </application> </manifest>
Kotlin
private var superSafeWebView: WebView? = null private var safeBrowsingIsInitialized: Boolean = false // ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) superSafeWebView = WebView(this).apply { webViewClient = MyWebViewClient() safeBrowsingIsInitialized = false startSafeBrowsing(this@SafeBrowsingActivity, { success -> safeBrowsingIsInitialized = true if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!") } }) } }
Java
private WebView superSafeWebView; private boolean safeBrowsingIsInitialized; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); superSafeWebView = new WebView(this); superSafeWebView.setWebViewClient(new MyWebViewClient()); safeBrowsingIsInitialized = false; superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() { @Override public void onReceiveValue(Boolean success) { safeBrowsingIsInitialized = true; if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!"); } } }); }
Kotlin
class MyWebViewClient : WebViewClient() { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. override fun onSafeBrowsingHit( view: WebView, request: WebResourceRequest, threatType: Int, callback: SafeBrowsingResponse ) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true) Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show() } }
Java
public class MyWebViewClient extends WebViewClient { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. @Override public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true); Toast.makeText(view.getContext(), "Unsafe web page blocked.", Toast.LENGTH_LONG).show(); } }
Video küçük resim ayıklayıcı
MediaMetadataRetriever
sınıfı, belirli bir zaman konumuna yakın bir kareyi bulan ve kaynak kareyle aynı en boy oranına sahip bir bit eşlem döndüren, ancak belirtilen genişlik ve yükseklikteki bir dikdörtgene sığacak şekilde ölçeklendirilen getScaledFrameAtTime()
adlı yeni bir yönteme sahiptir. Bu, videodan küçük resim oluşturmak için yararlıdır.
Kaynak videoyla aynı çözünürlüğe sahip bir bit eşlem döndürdüğü için bellekte yer israfına neden olabilecek getFrameAtTime()
yerine bu yöntemi kullanmanızı öneririz. Örneğin, 4K'lık bir videonun karesi 16 MB'lık bit eşlem olur ve küçük resim için gerekenden çok daha büyüktür.
Paylaşılan bellek API'sı
Android 8.1 (API düzeyi 27) ile yeni bir SharedMemory
API kullanıma sunuldu. Bu sınıf, anonim bir SharedMemory
örneği oluşturmanıza, eşlemenize ve yönetmenize olanak tanır. Bellek korumasını okuma ve/veya yazma için SharedMemory
nesnesine ayarlarsınız ve SharedMemory
nesnesi Parcelable olduğundan AIDL aracılığıyla başka bir işleme kolayca geçirebilirsiniz.
SharedMemory
API, NDK'daki ASharedMemory
tesisiyle birlikte çalışır.
ASharedMemory
, bir dosya açıklayıcıya erişim izni verir. Bu tanımlayıcı daha sonra okuma ve yazma için eşlenebilir. Uygulamalar arasında veya tek bir uygulama içindeki birden fazla işlem arasında büyük miktarda veri paylaşmanın harika bir yoludur.
WallpaperColors API'sı
Android 8.1 (API düzeyi 27), animasyonlu duvar kağıdınızın sistem kullanıcı arayüzüne renk bilgileri sağlamasına olanak tanır. Bunu bir bit eşlemden veya çekilebilir bir sayfadan WallpaperColors
nesnesi oluşturarak veya manuel olarak seçilen üç rengi kullanarak yapabilirsiniz.
Bu renk bilgilerini de alabilirsiniz.
Bir WallpaperColors
nesnesi oluşturmak için aşağıdakilerden birini yapın:
- Üç renk kullanarak bir
WallpaperColors
nesnesi oluşturmak için birincil, ikincil ve üçüncül rengi geçirerekWallpaperColors
sınıfının bir örneğini oluşturun. Birincil renk boş olmamalıdır. - Bit eşlemden
WallpaperColors
nesnesi oluşturmak için bit eşlem kaynağını parametre olarak ileterekfromBitmap()
yöntemini çağırın. - Çekilebilir bir öğeye
WallpaperColors
nesnesi oluşturmak için çekilebilir kaynağı parametre olarak ileterekfromDrawable()
yöntemini çağırın.
Duvar kağıdından birincil, ikincil veya üçüncül renk ayrıntılarını almak için aşağıdaki yöntemleri çağırın:
getPrimaryColor()
duvar kağıdının görsel olarak en iyi temsil eden rengini döndürür.getSecondaryColor()
duvar kağıdının ikinci en belirgin rengini döndürür.getTertiaryColor()
yöntemi, duvar kağıdının üçüncü en belirgin rengini döndürür.
Animasyonlu duvar kağıdınızdaki önemli renk değişikliklerini sisteme bildirmek için notifyColorsChanged()
yöntemini çağırın. Bu yöntem, yeni bir WallpaperColors
nesnesi sağlama fırsatınız olduğunda bir onComputeColors()
yaşam döngüsü etkinliğini tetikler.
Renk değişiklikleri için işleyici eklemek isterseniz addOnColorsChangedListener()
yöntemini çağırabilirsiniz. Duvar kağıdının birincil renklerini almak için getWallpaperColors()
yöntemini de çağırabilirsiniz.
Parmak izi güncellemeleri
FingerprintManager
sınıfında aşağıdaki hata kodları kullanılmaya başlandı:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
- Kullanıcı, parmak izi okuyucuyu kullanarak cihazının kilidini açmak için çok fazla sayıda deneme yapmıştır. -
FINGERPRINT_ERROR_VENDOR
: Tedarikçi firmaya özel bir parmak izi okuyucu hatası oluştu.
Cryptography güncellemeleri
Android 8.1'de birkaç şifreleme değişikliği yapılmıştır:
- Conscrypt'te yeni algoritmalar uygulandı. Conscrypt uygulaması tercihen mevcut Bouncy Castle uygulaması yerine kullanılır. Yeni algoritmalardan bazıları:
AlgorithmParameters:GCM
KeyGenerator:AES
KeyGenerator:DESEDE
KeyGenerator:HMACMD5
KeyGenerator:HMACSHA1
KeyGenerator:HMACSHA224
KeyGenerator:HMACSHA256
KeyGenerator:HMACSHA384
KeyGenerator:HMACSHA512
SecretKeyFactory:DESEDE
Signature:NONEWITHECDSA
Cipher.getParameters().getParameterSpec(IvParameterSpec.class)
, GCM kullanan algoritmalar için artık çalışmıyor. Bunun yerinegetParameterSpec(GCMParameterSpec.class)
kullanın.- TLS ile ilişkili birçok dahili Conscrypt sınıfı yeniden düzenlendi. Geliştiriciler bazen bunlara yansıtıcı olarak eriştiğinden, önceki kullanımı desteklemek için dolgular yerinde bırakıldı ancak bazı ayrıntılar değişti. Örneğin, önceden
OpenSSLSocketImpl
türünde olan yuvalar artıkConscryptFileDescriptorSocket
veyaConscryptEngineSocket
türündedir. Her ikisi deOpenSSLSocketImpl
türündedir. - Boş bir referans iletildiğinde
IllegalArgumentException
yönergesi vermek için kullanılanSSLSession
yöntemleri artıkNullPointerException
atar. - RSA
KeyFactory
artık kodlanmış anahtardan daha büyük bayt dizilerinden anahtar oluşturulmasına izin vermiyor. Anahtar yapısının arabelleğin tamamını doldurmadığı birKeySpec
sağlayangeneratePrivate()
vegeneratePublic()
çağrılarıInvalidKeySpecException
sonucunu verir. - Bir yuva okuması, yuvanın kapatılması nedeniyle kesintiye uğradığında Conscrypt okumadan -1 döndürmek için kullanılır. Şimdi okunduğunda
SocketException
hatası veriliyor. - Kök CA sertifika grubu değiştirilerek büyük ölçüde çok sayıda eski sertifika ve WoSign ile StartCom kök sertifikaları kaldırıldı. Bu karar hakkında daha fazla bilgi edinmek için WoSign ve StartCom sertifikalarına yönelik güvenin kaldırılması başlıklı Google Güvenlik Blogu yayınına bakın.