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 Oreo の機能 (Go エディション)構成には以下が含まれます。

  • メモリの最適化。プラットフォーム全体のメモリ使用量を改善し、 1GB 以下の RAM を搭載したデバイスでアプリを効率的に実行できることを要件としています。
  • 柔軟なターゲティング オプション新規 ハードウェア機能 定数を使用して、通常のデバイスまたは低 RAM デバイスへのアプリの配布を Google Play。
  • Google Play: すべてのアプリは Android Oreo を搭載したデバイスで利用可能 (Go バージョン)では、デベロッパーが特別に最適化されたアプリが表示されます。 何十億人ものユーザーに 優れたエクスペリエンスを提供できます <ph type="x-smartling-placeholder"></ph> ガイドラインを参照

何十億人ものユーザー向けに Google Play の建物を更新 <ph type="x-smartling-placeholder"></ph> の使用に関する追加のガイダンスが <ph type="x-smartling-placeholder"></ph> デバイスに応じてアプリを最適化する Android Oreo(Go バージョン)。ほとんどのデベロッパーにとって、既存の APK を最適化するか、 Google Play の<ph type="x-smartling-placeholder"></ph> 複数 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() が含まれるようになりました メソッドを使用すると、値を文字列で表すことができます。 設定してください。これは spinner に便利です。 渡す必要があります。たとえば setAutofillOptions() メソッドを使用して、文字列を指定できます。 ユーザーが期間の一部として選択できる年数のリストを クレジットカードの有効期限自動入力サービスは、文字列表現を使用して データを必要とするビューに 適切に入力できます

また、AutofillManager クラスに notifyViewVisibilityChanged(View, int, boolean) メソッドが含まれている この関数を呼び出して、API 呼び出しの可視性の変化を 仮想構造で表示できます。メソッドのオーバーロードもあり、 構築できます。ただし、非仮想構造の場合、通常は このメソッドはフレームワークによってすでに呼び出されているため、フレームワークに明示的に通知します。 View クラスです。

Android 8.1 では、自動入力サービスで保存 UI をカスタマイズできる機能も追加されています。 CustomDescription and Validator のサポートを追加することにより、アフォーダンス (SaveInfo 内)

カスタムの説明は、自動入力サービスが何を伝えられるかを 保存されるかどうかたとえば、画面にクレジット カードが表示されている場合、 クレジット カード会社のロゴ(クレジット カードの末尾 4 桁)を表示する その有効期限番号が含まれます詳しくは、 CustomDescriptionをご覧ください クラスです。

Validator オブジェクトを使用して、Validator の実行時に自動入力保存 UI が表示されないようにします。 満たされません詳しくは、 Validator クラス、およびそのサブクラス LuhnChecksumValidatorRegexValidator

通知

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

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

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: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();
    }
}

動画のサムネイルの抽出ツール

MediaMetadataRetriever クラスには、getScaledFrameAtTime() という新しいメソッドが追加されています。 特定の時間位置に近いフレームを読み込み、同じアスペクト比のビットマップを返す 比率になりますが、指定された幅の長方形に収まるようにスケーリングされ、 あります。このメソッドは、動画からサムネイル画像を生成するのに便利です。

メモリを浪費する可能性がある getFrameAtTime() ではなく、この方法を使用することをおすすめします。 元の動画と同じ解像度のビットマップが返されるためです。対象 たとえば 4K 動画のフレームは 16 MB のビットマップで、 サムネイル画像が必要だからです

SharedMemory API

Android 8.1(API レベル 27)では、 SharedMemory APIこのクラスを使用すると、匿名グループの作成、マッピング、管理を SharedMemory 作成します。メモリ保護を設定する 日付 SharedMemory 読み取り/書き込み用のオブジェクトであり、 SharedMemory オブジェクトが Parcelable であれば、AIDL を介して別のプロセスに簡単に渡すことができます。

SharedMemory API は Google Cloud のプロジェクトと NDK の ASharedMemory 機能。 ASharedMemory がアクセスを許可します ファイル ディスクリプタに変換してから読み取りと書き込みにマッピングできます。とても 大量のメッセージや アプリ間または単一のアプリ内の複数のプロセス間で 大量のデータを取り込みます

WallpaperColors API

Android 8.1(API レベル 27)では、ライブ壁紙に色を付けることができます 情報をシステム UI に渡します。これを行うには、WallpaperColors を作成します。 オブジェクトを使用するか、手動で選択した 3 色を使用します。 この色情報を取得することもできます。

WallpaperColors を作成するには 次のいずれかを行います。

  • WallpaperColors を作成するには 3 色を使用して、WallpaperColors のインスタンスを作成します。 プライマリ カラー、セカンダリ カラー、ターシャリ カラーを渡します。メイン color を null にすることは許可されていません
  • WallpaperColors を作成するには 使用したら、fromBitmap() を呼び出して、 メソッドにビットマップ ソースをパラメータとして渡します。
  • WallpaperColors を作成するには ドローアブルから保持する場合は、fromDrawable() を呼び出します。 ドローアブル ソースをパラメータとして渡します。

プライマリ カラー、セカンダリ カラー、ターシャリ カラーの詳細を 次のメソッドを呼び出します。

ライブ壁紙の色に大きな変化があったときにシステムに通知するには、次の操作を行います。 notifyColorsChanged()を呼び出す メソッドを呼び出します。このメソッドは、onComputeColors() ライフサイクルをトリガーします。 新しい WallpaperColors を提供する機会がある 渡されます。

色の変化のリスナーを追加するには、addOnColorsChangedListener() メソッドを呼び出します。Google Chat では getWallpaperColors() メソッドも呼び出す 壁紙のプライマリ カラーを取得できます。

フィンガープリントの更新

FingerprintManager クラスには、 以下のエラーコードが導入されました。

  • FINGERPRINT_ERROR_LOCKOUT_PERMANENT – ユーザーが 指紋認証リーダーでデバイスのロックを解除する回数が多すぎる。
  • FINGERPRINT_ERROR_VENDOR - ベンダー固有のフィンガープリント リーダーエラーが発生しました。

暗号化の更新

Android 8.1 では、暗号化に関するさまざまな変更が行われています。

  • 新しいアルゴリズムが 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 内部クラスがリファクタリングされました。以降 シムが残されたままになっているため、開発者がリフレクティブ サポートしていますが、詳細が一部変更されています。たとえば、ソケットは 以前は OpenSSLSocketImpl 型でしたが、現在は型になっています。 ConscryptFileDescriptorSocket または ConscryptEngineSocket(どちらも拡張) OpenSSLSocketImpl
  • スローに使用される SSLSession メソッド IllegalArgumentException に null 参照が渡されると、 NullPointerException をスローする。
  • RSA KeyFactory で鍵を生成できなくなりました バイト配列から取り出します。着信 generatePrivate()generatePublic() は、 KeySpec(キー構造が入力データに対応しない) 全体のバッファ全体が InvalidKeySpecException になります。
  • 閉じているソケットによってソケットの読み取りが中断された場合、Conscrypt は 読み取りから -1 を返します。読み取りは SocketException
  • ルート CA 証明書のセットが変更されましたが、 ルート証明書の削除も行います WoSign と StartCom です。この決定について詳しくは、 セキュリティに関するブログ投稿 最終版 WoSign 証明書と StartCom 証明書の信頼の削除