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 sunuyor. Bu dokümanda, geliştiriciler için yenilikler vurgulanmaktadır.

Android Oreo (Go sürümü)

Android Go, tüm dünyada 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:

  • Bellek optimizasyonları. Uygulamaların 1 GB veya daha az RAM'e sahip cihazlarda verimli bir şekilde çalışabilmesi için platform genelinde bellek kullanımı iyileştirildi.
  • Esnek hedefleme seçenekleri. Uygulamalarınızın Google Play aracılığıyla 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ılabilir olsa da Google Play, milyarlarca kullanıcıya uygun bir deneyim sunmak üzere geliştiriciler tarafından özel olarak optimize edilmiş uygulamalara görünür olacaktır.

Milyarlarca kural için oluşturulmuş yapıyı, uygulamanızı Android Oreo (Go sürümü) çalıştıran cihazlar için optimize etme konusunda ek rehberlik sağlayacak şekilde 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ü düşük RAM'e sahip cihazlara hedeflemek için Google Play'in Çoklu APK özelliğini kullanmaktır. Uygulamanızı daha hafif ve daha verimli hale getirmenin, cihazdan bağımsız olarak tüm kitleniz için faydalı olduğunu unutmayın.

Sinir Ağları API'sı

Neural Networks API, Google'ın mobil cihazlara yönelik platformlar arası makine öğrenimi kitaplığı TensorFlow Lite gibi cihaz üzerinde makine öğrenimi çerçeveleri ile Caffe2 ve benzeri 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 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'yle birlikte çalışır.

Otomatik doldurma çerçevesi güncellemeleri

Android 8.1 (API düzeyi 27), Otomatik Doldurma Çerçevesi'nde, uygulamalarınıza ekleyebileceğiniz çeşitli iyileştirmeler sunar.

BaseAdapter sınıfı artık bir bağdaştırıcıdaki değerlerin dize temsillerini sağlamanıza olanak tanıyan setAutofillOptions() yöntemini içeriyor. Bu, bağdaştırıcılarında dinamik olarak değer oluşturan dönen denetimler için yararlı olur. Örneğin, kullanıcıların kredi kartı son kullanma tarihi kapsamında seçebileceği yıl listesinin dize sunumunu sağlamak için setAutofillOptions() yöntemini kullanabilirsiniz. Otomatik doldurma hizmetleri, veri gerektiren görünümleri uygun şekilde doldurmak için dize gösterimini kullanabilir.

Buna ek olarak AutofillManager sınıfı, çerçeveyi bir görünümün sanal yapıdaki görünürlüğündeki değişiklikler hakkında bilgilendirmek için çağırabileceğiniz notifyViewVisibilityChanged(View, int, boolean) yöntemini de içerir. Ayrıca sanal olmayan yapılar için yöntemin aşırı yüklemesi de vardır. Bununla birlikte, yöntem zaten View sınıfı tarafından çağrıldığından sanal olmayan yapılar genellikle çerçeveye açıkça bilgi vermenizi gerektirmez.

Android 8.1, SaveInfo içinde CustomDescription and Validator desteği ekleyerek Otomatik Doldurma Hizmetleri'ne kaydetme kullanıcı arayüzü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 logosunu, kredi kartı numarasının son dört hanesini ve son kullanma numarasını gösterebilir. Daha fazla bilgi edinmek için CustomDescription sınıfına bakın.

Validator nesneleri, Doğrulayıcı koşulu karşılanmadığında otomatik doldurma kaydetme kullanıcı arayüzünün gösterilmesini önlemek için kullanılır. Daha fazla bilgi edinmek için Validator sınıfını ve alt sınıflarını ( LuhnChecksumValidator ve RegexValidator) inceleyin.

Bildirimler

Android 8.1, bildirimlerde aşağıdaki değişiklikleri içerir:

  • Uygulamalar artık saniyede yalnızca bir 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 diğer yönlerini etkilemez ve bildirim mesajları beklendiği gibi yayınlanmaya devam eder.
  • NotificationListenerService ve ConditionProviderService, ActivityManager.isLowRamDevice() çağrıldığında true döndüren düşük RAM'e sahip Android destekli cihazlarda desteklenmez.

EditText güncellemesi

EditText.getText() yöntemi, API düzeyi 27'den başlayarak bir Editable döndürür; daha önce ise bir CharSequence döndürmüştür. Editable, CharSequence politikasını 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ığından EditText örneği içindeki içeriğe işaretleme uygulayabilirsiniz.

Programatik Güvenli Tarama işlemleri

Güvenli Tarama API'sinin WebView uygulamasını kullanarak uygulamanız, bir 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, bilinen tehdit konusunda kullanıcıları uyaran bir geçiş reklamı gösterir. Bu ekran, kullanıcılara URL'yi yine de yükleme veya önceki güvenli 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 yönelik bilinen tehditleri bildirip bildirmeyeceğini kontrol edebilirsiniz.
  • Uygulamanızın, Güvenli Tarama'nın bilinen bir tehdit olarak sınıflandırdığı bir URL ile her karşılaştığında otomatik olarak belirli bir işlemi (ör. güvenli bir alana geri dönme) gerçekleştirmesini sağlayabilirsiniz.

Not: Bilinen tehditlere karşı optimum 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 bilinen bir tehditle karşılaştıktan sonra her zaman güvenliğe geri dönmesi için uygulamanızın WebView örneklerini nasıl bildirebileceğinizi göstermektedir:

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 resmi ayıklayıcı

MediaMetadataRetriever sınıfının, belirli bir zaman konumuna yakın bir kareyi bulan ve kaynak çerçeveyle aynı en boy oranına sahip bit eşlem döndüren ancak belirtilen genişlik ve yükseklikteki bir dikdörtgene sığacak şekilde ölçeklendirilen yeni bir getScaledFrameAtTime() yöntemi bulunur. Bu, videodan küçük resimler oluşturmak için yararlıdır.

Kaynak videoyla aynı çözünürlüğe sahip bir bit eşlem döndürdüğü için bellek israfına yol açabilecek getFrameAtTime() yerine bu yöntemi kullanmanızı öneririz. Örneğin, 4K videodan gelen bir kare, küçük resim için gerekenden çok daha büyük, 16 MB'lık bir bit eşlemdir.

Paylaşılan bellek API'si

Android 8.1 (API düzeyi 27) ile birlikte yeni bir SharedMemory API kullanıma sunuldu. Bu sınıf, anonim bir SharedMemory örneği oluşturmanızı, eşleştirmenizi ve yönetmenizi sağlar. Okuma ve/veya yazma için bellek korumasını SharedMemory nesnesine ayarlarsınız ve SharedMemory nesnesi Parselable olduğundan bunu AIDL aracılığıyla başka bir işleme kolayca aktarabilirsiniz.

SharedMemory API, NDK'daki ASharedMemory tesisiyle birlikte çalışır. ASharedMemory, okuma ve yazma için eşlenebilen bir dosya tanımlayıcıya erişim izni verir. 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'si

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 bit eşlemden veya çizimden bir WallpaperColors nesnesi oluşturarak ya da manuel olarak seçilen üç renk kullanarak yapabilirsiniz. Bu renk bilgilerini de alabilirsiniz.

WallpaperColors nesnesi oluşturmak için aşağıdakilerden birini yapın:

  • Üç renk kullanarak 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 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:

  • getPrimaryColor(), duvar kağıdını görsel olarak en iyi yansıtan rengi döndürür.
  • getSecondaryColor(), duvar kağıdının en öncelikli ikinci rengini döndürür.
  • getTertiaryColor() yöntemi, duvar kağıdının en öne çıkan üçüncü rengini döndürür.

Animasyonlu duvar kağıdınızdaki önemli renk değişiklikleri hakkında sisteme bildirim göndermek 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 üzere 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ı ortaya çıktı:

  • FINGERPRINT_ERROR_LOCKOUT_PERMANENT - Kullanıcı, parmak izi okuyucuyu kullanarak cihazının kilidini açmak için çok fazla kez çalıştı.
  • FINGERPRINT_ERROR_VENDOR: Tedarikçi firmaya özel bir parmak izi okuyucu hatası oluştu.

Kriptografi güncellemeleri

Android 8.1'de bazı kriptografi değişiklikleri yapılmıştır:

  • Conscrypt'e yeni algoritmalar uygulandı. Conscrypt uygulaması tercihen mevcut Bouncy Castle uygulaması yerine kullanılır. Yeni algoritmalar şunları içerir:
    • 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 algoritmalarda artık çalışmamaktadır. 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 durdu 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ünü genişletir.
  • Boş bir referans geçirildiğinde IllegalArgumentException değeri göndermek için kullanılan SSLSession yöntemleri artık NullPointerException değerini döndürür.
  • RSA KeyFactory artık kodlanmış anahtardan daha büyük bayt dizilerinden anahtar oluşturulmasına izin vermemektedir. 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ıyla kesintiye uğradığında Conscrypt, okuma işleminden -1 değerini döndürmek için kullanılır. Okuma şimdi SocketException hatasını veriyor.
  • Kök CA sertifikaları grubu değiştirilerek çok sayıda eski sertifika kaldırıldı. Bununla birlikte, WoSign ve StartCom'a ait kök sertifikalar da kaldırıldı. Bu kararla ilgili daha fazla bilgi için WoSign ve StartCom Sertifikalarına olan güvenin kaldırılması adlı Google Güvenlik Blogu yayınına bakın.