Android 8.1(API レベル 27)では、ユーザーやデベロッパー向けのさまざまな新機能が導入されています。このドキュメントでは、デベロッパー向けの最新情報を紹介します。
Android Oreo(Go バージョン)
<ph type="x-smartling-placeholder"></ph> Android Go は、Android のエクスペリエンスを最適化し、 何十億人もの人々が インターネットにアクセスしていますAndroid 8.1 以降 エントリー レベルのデバイスに適したプラットフォームとして、Android を開発しています。Android Oreo(Go バージョン)には以下の機能が搭載されています。
- メモリの最適化。プラットフォーム全体のメモリ使用量を改善し、 1GB 以下の RAM を搭載したデバイスでアプリを効率的に実行できることを要件としています。
- 柔軟なターゲティング オプション: 新規 ハードウェア機能 定数を使用して、通常のデバイスまたは低 RAM デバイスへのアプリの配布を Google Play。
- Google Play: すべてのアプリは Android Oreo を搭載したデバイスで利用可能 (Go バージョン)では、デベロッパーが特別に最適化されたアプリが表示されます。 何十億人ものユーザーに 優れたエクスペリエンスを提供できます <ph type="x-smartling-placeholder"></ph> ガイドラインを参照
何十億人ものユーザー向けにアプリを更新 <ph type="x-smartling-placeholder"></ph> の使用に関する追加のガイダンスが <ph type="x-smartling-placeholder"></ph> デバイスに応じてアプリを最適化する Android Oreo(Go バージョン)。ほとんどの場合は、既存の APK を最適化するか、Google Play のマルチ APK 機能を使って、APK の特定のバージョンのターゲットを低 RAM デバイスに設定することによって Android Oreo(Go エディション)デバイスに対応するとよいでしょう。重要なことは、 アプリ 軽量化と効率化により、デバイスを問わずオーディエンス全体に利益をもたらします。
Neural Networks API
Neural Networks API により、デバイス上のマシンの計算と推論を高速化 TensorFlow など、ML フレームワークを Lite(Google のモバイル向けクロスプラットフォーム ML ライブラリ) Caffe2 などですTensorFlow Lite を見る オープンソース リポジトリをご覧ください。 TensorFlow Lite は、Neural Networks API と連携して次のようなモデルを実行します。 MobileNets Inception v3、 および スマート リプライをモバイル デバイスで効率的に使用しましょう。
自動入力フレームワークの更新
Android 8.1(API レベル 27)では、自動入力機能が改良されています。 アプリに組み込むことができるフレームワークです。
BaseAdapter
クラスに setAutofillOptions()
メソッドが追加されました。このメソッドを使用すると、アダプター内の値の文字列表現を提供できます。これは、スピナー コントロールでアダプター内で値を動的に生成する場合に便利です。たとえば
setAutofillOptions()
メソッドを使用して、文字列を指定できます。
ユーザーが期間の一部として選択できる年数のリストを
クレジットカードの有効期限自動入力サービスは、文字列表現を使用して
データを必要とするビューに
適切に入力できます
また、AutofillManager
クラスには notifyViewVisibilityChanged(View, int, boolean)
メソッドが含まれています。このメソッドを呼び出すと、仮想構造内のビューの表示に関する変更についてフレームワークに通知できます。また、メソッドのオーバーロードは、
構築できます。ただし、非仮想構造では通常、メソッドが View
クラスですでに呼び出されているため、フレームワークに対して明示的に通知する必要はありません。
Android 8.1 では、SaveInfo
内の CustomDescription
and
Validator
のサポートが追加され、自動入力サービスで保存 UI アフォーダンスをカスタマイズする機能が強化されました。
カスタムの説明を使用すると、自動入力サービスで保存内容を明確に示すことができます。たとえば、画面にクレジット カードを表示する場合、クレジット カード会社のロゴ、クレジット カード番号の下 4 桁、クレジット カードの有効期限を表示できます。詳細については、
CustomDescription
クラスをご覧ください。
Validator
オブジェクトを使用して、Validator の実行時に自動入力保存 UI が表示されないようにします。
満たされません詳しくは、Validator クラスと、そのサブクラスの LuhnChecksumValidator と RegexValidator をご覧ください。
通知
Android 8.1 では、通知が次のように変更されています。
- アプリが通知アラート音を 1 秒に 1 回音で鳴らせるようになりました。この回数を超えるアラート音はキューに登録されず、失われます。この変更は通知の他の要素には影響しません。 動作と通知メッセージは想定どおりに送信されます。
-
NotificationListenerService
とConditionProviderService
は、ActivityManager.isLowRamDevice()
が呼び出されるとtrue
を返す低 RAM の Android デバイスではサポートされていません。
EditText の更新
API レベル 27 以降、EditText.getText()
メソッドは Editable
を返します。以前は CharSequence
を返していました。この変更は、Editable
が CharSequence
を実装するため、下位互換性があります。
Editable
インターフェースは、有用な追加情報を
説明します。たとえば、Editable
も
Spannable
インターフェースを実装しているので、マークアップを
EditText
のインスタンス内のコンテンツを返します。
プログラマティックなセーフ ブラウジング アクション
WebView
実装を実装すると、アプリで次の操作が可能になります。
WebView
のインスタンスが移動しようとしたときに検出する
Google が既知の脅威と分類した URL に誘導する試みです。デフォルトでは、
WebView
は、既知の脅威についてユーザーに警告するインタースティシャルを表示します。
この画面でユーザーは、それでもその URL を読み込むか、安全性を確保するために前のページに戻るかを選択できます。
Android 8.1 では、アプリでの既知の脅威への対応方法を以下のようにプログラマティックに定義できます。
- アプリが既知の脅威を Safer に報告するかどうかを管理できます ブラウジング。
- アプリに特定のアクションを自動で実行させることもできます(セーフ ブラウジングによって既知の脅威と判断された URL へのアクセスを試みたときに安全なページに戻るなど)。
注: 既知の脅威から最適な形で保護するには、
呼び出す前にセーフ ブラウジングを初期化してから
WebView
オブジェクトの loadUrl()
メソッド。
以下のコード スニペットは、既知の脅威を検出したときに、アプリの WebView
インスタンスに対して安全なページに必ず戻るよう指示する方法を示しています。
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(); } }
動画のサムネイルの抽出ツール
MediaMetadataRetriever
クラスには、getScaledFrameAtTime()
という新しいメソッドが追加されています。これは、
特定の時間位置に近いフレームを読み込み、同じアスペクト比のビットマップを返す
比率になりますが、指定された幅の長方形に収まるようにスケーリングされ、
あります。このメソッドは、動画からサムネイル画像を生成するのに便利です。
getFrameAtTime()
は元の動画と同じ解像度のビットマップを返すため、メモリを浪費する可能性があることから、このメソッドを使用することをおすすめします。対象
たとえば、4K 動画のフレームは 16 MB のビットマップで、
サムネイル画像が必要だからです
SharedMemory API
Android 8.1(API レベル 27)では、
SharedMemory
APIこのクラスを使用すると、匿名の ID リソースを作成、マッピング、
SharedMemory
構成されますメモリ保護を設定する
日付
SharedMemory
読み取り/書き込み用のオブジェクトであり、
SharedMemory
オブジェクトが Parcelable であれば、AIDL を介して別のプロセスに簡単に渡すことができます。
SharedMemory
API は、NDK の ASharedMemory
機能と相互運用します。ASharedMemory
を使用すると、読み取りと書き込みにマッピング可能なファイル記述子にアクセスできます。この方法は、アプリ間で、または 1 つのアプリ内の複数のプロセス間で、大量のデータを共有するのに適しています。
WallpaperColors API
Android 8.1(API レベル 27)では、ライブ壁紙からシステム UI にカラー情報を提供できます。これを行うには、WallpaperColors
を作成します。
オブジェクトを使用するか、手動で選択した 3 色を使用します。
この色情報を取得することもできます。
WallpaperColors
オブジェクトを作成するには、次のいずれかを行います。
WallpaperColors
を作成するには 3 色を使用して、WallpaperColors
のインスタンスを作成します。 プライマリ カラー、セカンダリ カラー、ターシャリ カラーを渡します。メイン color を null にすることは許可されていません。- ビットマップから
WallpaperColors
オブジェクトを作成するには、ビットマップのソースをパラメータとして渡してfromBitmap()
メソッドを呼び出します。 - ドローアブルから
WallpaperColors
オブジェクトを作成するには、ドローアブルのソースをパラメータとして渡してfromDrawable()
メソッドを呼び出します。
壁紙から第 1、第 2、第 3 の色の詳細を取得するには、以下のメソッドを呼び出します。
getPrimaryColor()
は、壁紙の中で視覚的に最も特徴的な色を返します。getSecondaryColor()
は、壁紙の 2 番目に目立つ色を返します。getTertiaryColor()
メソッドは、壁紙の中で 3 番目に目立つ色を返します。
ライブ壁紙の色に大きな変化があったときにシステムに通知するには、次の操作を行います。
notifyColorsChanged()
を呼び出す
メソッドを呼び出します。このメソッドは、onComputeColors()
ライフサイクルをトリガーします。
新しい WallpaperColors
を提供する機会がある
渡されます。
色の変化のリスナーを追加するには、addOnColorsChangedListener()
メソッドを呼び出します。また、getWallpaperColors()
メソッドを呼び出して、壁紙の第 1 の色を取得することもできます。
フィンガープリントの更新
FingerprintManager
クラスには、
以下のエラーコードが導入されました。
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
– ユーザーが 指紋認証リーダーでデバイスのロックを解除する回数が多すぎる。 -
FINGERPRINT_ERROR_VENDOR
- ベンダー固有の指紋リーダーエラーが発生した。
暗号化の更新
Android 8.1 では、暗号化に関するさまざまな変更が行われています。
- 新しいアルゴリズムが Conscrypt に実装されました。Conscrypt の実装は、既存の Bouncy Castle の実装より優先的に使用されます。新しいアルゴリズムは次のとおりです。
<ph type="x-smartling-placeholder">
- </ph>
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 を使用するアルゴリズムでは正常に機能しません。代わりに、getParameterSpec(GCMParameterSpec.class)
を使用します。 - TLS に関連付けられている多くの Conscrypt 内部クラスがリファクタリングされました。デベロッパーが反射的にこれらのクラスを使用することがあるため、以前の用法をサポートするために shim が残されていますが、詳細が一部変更されています。たとえば、ソケットのタイプは以前は
OpenSSLSocketImpl
でしたが、現在は、ConscryptFileDescriptorSocket
またはConscryptEngineSocket
になっています(どちらもOpenSSLSocketImpl
を拡張したものです)。 - スローに使用される
SSLSession
メソッドIllegalArgumentException
に null 参照が渡されると、NullPointerException
をスローする。 - RSA
KeyFactory
では、エンコードされた鍵よりもサイズの大きいバイト配列から鍵を生成することができなくなりました。キー構造がバッファ全体を埋め尽くさないKeySpec
を指定するgeneratePrivate()
とgeneratePublic()
の呼び出しは、InvalidKeySpecException
になります。 - 閉じているソケットによってソケットの読み取りが中断された場合、Conscrypt は読み取りから -1 を返していました。読み取りは
SocketException
。 - ルート CA 証明書のセットが変更されましたが、 ルート証明書の削除も行います WoSign と StartCom です。この決定について詳しくは、Google セキュリティ ブログの WoSign および StartCom が発行した証明書の完全無効化に関する投稿(英語)をご覧ください。