Android 8.1 の機能と API

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 クラスと、そのサブクラスの LuhnChecksumValidatorRegexValidator をご覧ください。

通知

Android 8.1 では、通知が次のように変更されています。

  • アプリが通知アラート音を 1 秒に 1 回音で鳴らせるようになりました。この回数を超えるアラート音はキューに登録されず、失われます。この変更は通知の他の要素には影響しません。 動作と通知メッセージは想定どおりに送信されます。
  • NotificationListenerServiceConditionProviderService は、ActivityManager.isLowRamDevice() が呼び出されると true を返す低 RAM の Android デバイスではサポートされていません。

EditText の更新

API レベル 27 以降、EditText.getText() メソッドは Editable を返します。以前は CharSequence を返していました。この変更は、EditableCharSequence を実装するため、下位互換性があります。

Editable インターフェースは、有用な追加情報を 説明します。たとえば、EditableSpannable インターフェースを実装しているので、マークアップを 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 の色の詳細を取得するには、以下のメソッドを呼び出します。

ライブ壁紙の色に大きな変化があったときにシステムに通知するには、次の操作を行います。 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 が発行した証明書の完全無効化に関する投稿(英語)をご覧ください。