Android 8.1 (API düzeyi 27), çok çeşitli özellikler kullanıcılar ve geliştiriciler için yeni özellikler ve olanaklar. Bu belgede, geliştiriciler için yenilikler vurgulanmaktadır.
Android Oreo (Go sürümü)
Android Go, dünyanın dört bir yanında internete giren milyarlarca kullanıcı için Android deneyimini optimize etme girişimimizdir. Android 8.1 sürümünden itibaren Android'i giriş düzeyindeki cihazlar için mükemmel bir platform haline getiriyoruz. Android Oreo (Go sürümü) yapılandırmasında bulunan özellikler şunlardır:
- Bellek optimizasyonları. Platform genelinde iyileştirilen bellek kullanımı, .
- Esnek hedefleme seçenekleri Yeniler donanım özelliği sabit değerleri kullanarak uygulamalarınızın normal veya düşük RAM'li cihazlara dağıtımını Google Play
- Google Play.Tüm uygulamalar Android Oreo çalıştıran cihazlarda kullanılabilir (Go sürümü) için Google Play, geliştiriciler tarafından özel olarak optimize edilen uygulamaları görmenizi sağlar milyarlarca kullanıcıya hitap eden binayla milyarlarca kullanıcıya mükemmel bir deneyim sunuyor. aykırıdır.
Milyarlarca kullanıcı için uygulama geliştirme yönergelerini, uygulamanızı Android Oreo (Go sürümü) çalıştıran cihazlar için optimize etme hakkında ek bilgiler ekleyerek güncelledik. Çoğu geliştirici için Android Oreo (Go sürümü) çalıştıran cihazlara hazırlanmanın en iyi yolu, mevcut APK'nızı optimize etmek veya APK'nızın bir sürümünü RAM'i düşük cihazlara hedeflemek için Google Play'in Çoklu APK özelliğini kullanmaktır. Unutmayın ki, uygulaması daha hafif ve daha verimli seçeneği, cihazdan bağımsız olarak tüm kitleniz için faydalıdır.
Neural Networks API
Neural Networks API, cihaz üzerinde makine için hızlandırılmış hesaplama ve çıkarım sağlar TensorFlow gibi öğrenme çerçeveleri Lite - Google'ın mobil cihazlar için platformlar arası makine öğrenimi kitaplığıdır. Caffe2 ve diğerleri. İndirme ve dokümanlar için TensorFlow Lite açık kaynak 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 ile çalışır.
Otomatik doldurma çerçevesi güncellemeleri
Android 8.1 (API düzeyi 27), Otomatik Doldurma'da çeşitli iyileştirmeler sunar Uygulamalarınıza dahil edebileceğiniz çerçeve.
BaseAdapter
sınıfı artık bir bağdaştırıcının değerlerinin dize gösterimlerini sağlamanıza olanak tanıyan setAutofillOptions()
yöntemini içerir. Bu, adaptörlerindeki değerleri dinamik olarak oluşturan spinner kontrolleri için kullanışlıdır. Örneğin, kullanıcıların kredi kartı geçerlilik bitiş tarihi kapsamında seçebileceği yılların listesinin dize temsilini 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.
Ayrıca AutofillManager
sınıfı, sanal bir yapıdaki görünümün görünürlüğünde yapılan değişiklikler hakkında çerçeveyi bilgilendirmek için çağırabileceğiniz notifyViewVisibilityChanged(View, int, boolean)
yöntemini içerir. Ayrıca, kötü amaçlı yazılımda da
sanal yapılardır. Ancak sanal olmayan yapılarda, yöntem zaten View
sınıfı tarafından çağrıldığı için genellikle çerçeveyi açıkça bilgilendirmeniz gerekmez.
Android 8.1, Otomatik Doldurma Hizmetleri'ne kaydetme kullanıcı arayüzünü özelleştirme olanağı da sunar
CustomDescription
and
Validator
için destek ekleyerek
SaveInfo
içinde.
Özel açıklamalar, otomatik doldurma hizmetinin nelerin kaydedildiğini netleştirmesine yardımcı olur. Örneğin, ekranda bir kredi kartı olduğunda kredi kartını veren bankanın logosu, kredi kartı numarasının son dört hanesi ve son kullanma tarihi gösterilebilir. Daha fazla bilgi için
CustomDescription
sınıfına bakın.
Validator
.
Nesneler, Doğrulayıcı ayarı etkinleştirildiğinde otomatik doldurma kaydetme kullanıcı arayüzünün görüntülenmesini önlemek için
memnun olmadığını düşünelim. Daha fazla bilgi edinmek için bkz.
Doğrulama Aracı sınıfı ve alt sınıfları olan
LuhnChecksumValidator ve RegexValidator
Bildirimler
Android 8.1'de bildirimlerle ilgili aşağıdaki değişiklikler yapılmıştır:
- Uygulamalar artık saniyede yalnızca bir kez bildirim uyarısı sesi çıkarabilir. Bu hızı aşan uyarı sesleri sıraya eklenmez ve kaybolur. Bu değişiklik, bildirim davranışının diğer yönlerini etkilemez ve bildirim mesajları beklendiği gibi yayınlanmaya devam eder.
-
NotificationListenerService
veConditionProviderService
, düşük RAM'de desteklenmez Şu durumlardatrue
döndüren Android destekli cihazlar:ActivityManager.isLowRamDevice()
çağrıldı.
EditText güncellemesi
API düzeyi 27'den itibaren EditText.getText()
yöntemi bir Editable
döndürür. Daha önce CharSequence
döndürüyordu. Bu değişiklik
geriye dönük uyumluluğa sahiptir, çünkü Editable
CharSequence
.
Editable
arayüzü,
işlevi görür. Örneğin, Editable
adlı kullanıcı da
Spannable
arayüzünü uygularsa işaretlemeyi
EditText
örneğinin içindeki içerik.
Programatik Güvenli Tarama işlemleri
Uygulamanız, Güvenli Tarama API'sinin WebView
uygulamasını kullanarak WebView
örneğinin Google'ın bilinen bir tehdit olarak sınıflandırdığı bir URL'ye gitmeye çalıştığında bunu algılayabilir. Varsayılan olarak
WebView
, kullanıcıları bilinen tehdit konusunda uyaran bir geçiş reklamı gösteriyor.
Bu ekran kullanıcılara URL'yi yine de yükleme veya
bu güvenli bir sayfadır.
Android 8.1'de, uygulamanızın bilinen bir tehdide nasıl yanıt vereceğini programatik olarak tanımlayabilirsiniz:
- Uygulamanızın bilinen tehditleri Güvenli Tarama'ya bildirme durumunu kontrol edebilirsiniz.
- Güvenli Tarama'nın bilinen bir tehdit olarak sınıflandırdığı bir URL ile her karşılaştığında uygulamanızın otomatik olarak belirli bir işlemi (ör. güvenli sayfaya 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şlatın.
Aşağıdaki kod snippet'lerinde, uygulamanızın WebView
örneklerine bilinen bir tehditle karşılaştıktan sonra her zaman güvenli moda dönme talimatı nasıl vereceğiniz gösterilmektedir:
AndroidManifest.xml
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:valu>e=&qu<ot;true">;< / /a>pplication /manifest
MyWebActivity.java
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!"); } } }); }
MyWebViewClient.java
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 resmi ayıklayıcı
MediaMetadataRetriever
sınıfında, belirli bir zaman konumuna yakın bir kare bulan ve kaynak kareyle aynı en boy oranına sahip ancak belirli bir genişlik ve yükseklikteki bir dikdörtgene sığacak şekilde ölçeklendirilmiş bir bitmap döndüren yeni bir yöntem (getScaledFrameAtTime()
) vardır. Bu özellik, videolardan küçük resim oluşturmak için kullanışlıdır.
Bellek israfına neden olabilecek getFrameAtTime()
yerine bu yöntemi kullanmanızı öneririz
çünkü kaynak videoyla aynı çözünürlükte bir bit eşlem döndürür. Örneğin, 4K videodan alınan bir kare 16 MB boyutunda bir bitmap olur. Bu, küçük resim için ihtiyaç duyduğunuzdan çok daha büyüktür.
Paylaşılan bellek API'si
Android 8.1 (API düzeyi 27), yeni bir SharedMemory
API'si kullanıma sunar. Bu sınıf, anonim bilgiler oluşturmanıza, eşlemenize ve yönetmenize olanak tanır.
SharedMemory
örneğidir. Okuma ve/veya yazma için bir SharedMemory
sınıfında bellek korumasını ayarlarsınız. SharedMemory
sınıfı Parcelable olduğundan bu sınıfı AIDL aracılığıyla başka bir sürece kolayca iletebilirsiniz.
SharedMemory
API,
NDK'da ASharedMemory
tesis yapıldı.
ASharedMemory
erişim izni verir
daha sonra okuma ve yazma için eşlenebilen bir dosya tanımlayıcısına yönlendirir. Uygulamalar arasında veya tek bir uygulamadaki birden fazla işlem arasında büyük miktarda veri paylaşmak için mükemmel bir yöntemdir.
WallpaperColors API'si
Android 8.1 (API düzeyi 27), canlı duvar kağıdınızın sistem kullanıcı arayüzüne renk bilgisi sağlamasına olanak tanır. Bunu, bir bitmap veya çizilebilir öğeden WallpaperColors
öğesi oluşturarak ya da manuel olarak seçilen üç rengi kullanarak yapabilirsiniz.
Bu renk bilgilerini de alabilirsiniz.
WallpaperColors
oluşturmak için
aşağıdakilerden birini yapın:
WallpaperColors
oluşturmak için üç renk kullanarakWallpaperColors
öğesinin bir örneğini oluşturun sınıfa eklemeniz gerekir. Birincil renk boş bırakılmamalıdır.WallpaperColors
oluşturmak için nesnesini son haline getirmek için,fromBitmap()
çağrısı yöntemini kullanabilirsiniz.- Bir çizilebilir öğeden
WallpaperColors
öğesi oluşturmak için çizilebilir kaynağı parametre olarak göndererekfromDrawable()
yöntemini çağırın.
Birincil, ikincil veya üçüncül renk ayrıntılarını aşağıdaki yöntemleri çağırın:
getPrimaryColor()
duvar kağıdının görsel olarak en temsili rengini döndürür.getSecondaryColor()
. duvar kağıdının en belirgin ikinci rengini döndürür.getTertiaryColor()
yöntemi, duvar kağıdındaki en belirgin üçüncü rengi döndürür.
Animasyonlu duvar kağıdınızda önemli renk değişiklikleri varsa sistemi bildirmek için
notifyColorsChanged()
cihazını ara
yöntemidir. Bu yöntem bir onComputeColors()
yaşam döngüsü tetikler
yeni bir WallpaperColors
sağlama fırsatınızın olduğu etkinlik
nesnesini tanımlayın.
Renk değişiklikleri için işleyici eklemek isterseniz addOnColorsChangedListener()
yöntemini çağırabilirsiniz. Bir duvar kağıdının birincil renklerini almak için getWallpaperColors()
yöntemini de çağırabilirsiniz.
Parmak izi güncellemeleri
FingerprintManager
sınıfı
şu hata kodlarına sahip:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
: Kullanıcı, parmak izi okuyucuyu kullanarak cihazının kilidini açmak için çok fazla kez denemiştir. -
FINGERPRINT_ERROR_VENDOR
: Satıcıya özgü bir parmak izi okuyucu hatası oluştu.
Kriptografi güncellemeleri
Android 8.1'de kriptografiyle ilgili çeşitli değişiklikler yapıldı:
- Conscrypt'e yeni algoritmalar uygulandı. Mevcut Bouncy Castle uygulaması yerine tercihen Conscrypt uygulaması kullanılır. Yeni algoritmalar şunlardır:
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)
hayır GCM'yi kullanan algoritmalarda daha uzun süre çalışır. Bunun yerinegetParameterSpec(GCMParameterSpec.class)
kullanın.- TLS ile ilişkili birçok dahili Conscrypt sınıfı yeniden yapılandırıldı. Başlangıç
geliştiriciler bazen bunlara yansıtıcı bir şekilde erişiyor;
desteklenmiş olsa da bazı ayrıntılar değişmiştir. Örneğin, daha önce
OpenSSLSocketImpl
türündeki soketler artıkConscryptFileDescriptorSocket
veyaConscryptEngineSocket
türüne sahip. Bu türler deOpenSSLSocketImpl
türünü genişletir. - Atış için
SSLSession
yöntem kullanıldı Boş bir referans iletildiğindeIllegalArgumentException
, artıkNullPointerException
at. - RSA
KeyFactory
artık kodlanmış anahtardan daha büyük bayt dizilerinden anahtar oluşturulmasına izin vermez. Anahtar yapısının tüm arabelleği doldurmadığı birKeySpec
sağlayangeneratePrivate()
vegeneratePublic()
çağrılarıInvalidKeySpecException
ile sonuçlanır. - Bir soket okuması, soketin kapatılması nedeniyle kesintiye uğradığında Conscrypt, okumadan -1 değerini döndürürdü. Okunanlar şimdi
SocketException
- Kök CA sertifikaları grubu değiştirildi. Bu değişiklikle birlikte, çoğunlukla çok sayıda eski sertifika kaldırıldı ancak WoSign ve StartCom'un kök sertifikaları da kaldırıldı. Bu karar hakkında daha fazla bilgi için Google Güvenlik Blogu'ndaki WoSign ve StartCom Sertifikalarına güvenin kaldırılması başlıklı makaleyi inceleyin.