Android 8.1 Özellikleri ve API'leri

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 ve ConditionProviderService, ActivityManager.isLowRamDevice() çağrıldığında true 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:

AndroidManifest.xml

<manifest>
    <application>
        ...
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:value="true" />
    </application>
</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 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çirerek WallpaperColors 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 ileterek fromBitmap() yöntemini çağırın.
  • Çekilebilir bir öğeye WallpaperColors nesnesi oluşturmak için çekilebilir kaynağı parametre olarak ileterek fromDrawable() 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:

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 yerine getParameterSpec(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ık ConscryptFileDescriptorSocket veya ConscryptEngineSocket türündedir. Her ikisi de OpenSSLSocketImpl türündedir.
  • Boş bir referans iletildiğinde IllegalArgumentException yönergesi vermek için kullanılan SSLSession yöntemleri artık NullPointerException 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ığı bir KeySpec sağlayan generatePrivate() ve generatePublic() ç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.