ViewModel は、Activity や Fragment などのライフサイクルにバインドされたエンティティから、ビューのデータとロジックの所有権を分離します。ViewModel は、関連付けられた Activity や Fragment が永久に破棄されるまで保持されます。つまり、回転によって Fragment が再作成されたりしてもビューデータが破棄されることはありません。ViewModel を使うと、一般的なライフサイクルの問題が解消できるだけでなく、モジュール性が高くテストしやすい UI を構築できるようになります。
Android 8.1 には、厳選された新機能とデベロッパー API(API レベル 27)、最新の最適化、バグの修正、セキュリティ パッチが含まれています。以下に、新しい API の一部を紹介します。
Android Go のメモリ最適化とターゲティング -- Android 8.1 には、Android Go 構成(1GB 以下のメモリ)に対する一連のメモリ最適化が含まれています。新しいハードウェア機能定数が追加されているので、Android 8.1 以降を実行している通常または低 RAM 端末に対してアプリや分割 APK を配布できます。
Neural Networks API -- Android で人工知能を実行するための取り組みの一環として、NDK 経由で動作する Neural Networks API が追加されています。これによって、サポートされている端末でハードウェア アクセラレーションを利用した推論操作が行えるようになります。Neural Networks API は、TensorFlow Lite などの ML フレームワークの基礎レイヤーとして設計されています。TensorFlow Lite は、まもなく登場する Google のモバイル用クロスプラットフォーム ML フレームワークで、Caffe2 などと似ています。今後の TensorFlow Lite に関するお知らせにご期待ください。
共有メモリ API -- この新しい API を使うと、アプリで共有メモリを割り当て、よく使うデータに高速アクセスできます。アプリは、SharedMemory API を使って匿名共有メモリをマッピングしたり、保護状態を管理できます。この API は Parcelable で、AIDL と親和性が高く、書き込みパーミッションの削除などの便利な機能も公開されています。
対応端末を Android ベータ版に登録すると、最新のアップデートが配信され、Google Play から現在のアプリをインストールしてテストできるようになります。Pixel や Nexus 端末をお持ちでない方は、テスト用の Android 8.1 エミュレータを設定できます。問題を発見した場合は、修正して、アプリのプラットフォームのターゲットを変更せず、すぐに Google Play のアプリをアップデートしてください。
正式な Android 8.1 API でコンパイルするには、プロジェクトの compileSdkVersion を API 27 にアップデートします。また、アプリの targetSdkVersion を API 27 に更新し、互換動作を無効にしてテストを行うことをおすすめします。Android 8.1 でビルドするための環境設定の詳しい手順については、こちらのガイドをご覧ください。
アップデートを Google Play に公開する
Android 8.1 API は既に最終版になっているため、Google Play では、API 27 でコンパイルしたアプリや、API 27 をターゲットにしたアプリを受け付けています。準備ができ次第、APK のアップデートをアルファ版、ベータ版、または本番チャンネルで公開しましょう。Android 8.1 だけでなく、古いバージョンでもアップデートしたアプリが問題なく動作することを確認しておきましょう。まずは、Google Play のベータ版テスト機能を使って、少人数のユーザーを対象にアルファテストを行い、その後、規模を広げてオープンベータ版テストを行うことをおすすめします。アップデートをリリースする準備ができた際には、段階的ロールアウトを利用することもできます。皆さんのアプリのアップデートを楽しみにしています。
ビルドの高速化 -多くのモジュールを含む大規模プロジェクトでさらに Gradle を高速化するため、 Android Gradle プラグインの API を抜本的に変更 し、拡張性の向上とビルド時間の短縮を行っています。バージョン番号が Android Studio 2.4 から 3.0 に進んだ理由の 1 つがこの変更です。以前の Gradle プラグインの API を利用している場合は、新しいプラグインとの互換性を確認し、新しい API に移行する必要があります。テストするには、build.gradle ファイルでプラグインのバージョンをアップデートしてください。詳細をご覧ください。
Google の Maven レポジトリ -アップデートを小型化、高速化するために、Android Studio 3.0 では、Android Support Library、Google Play Services、Firebase の Maven 依存性のアップデートを探す際に、デフォルトで Android SDK Manager の代わりに Google の Maven レポジトリを使うようになります。最新のコマンドライン SDK Manager ツールと Gradle を併用する場合は、継続的インテグレーション ビルドにおける今後の Maven レポジトリのアップデートを Google の Maven レポジトリに移行する必要があります。詳細をご覧ください。
テストとデバッグ
Google Play システム イメージ -Android Oreo のエミュレータ システム イメージがアップデートされ、Google Play Store が含まれるようになります。Google Play ストアがバンドルされることによって、Google Play を用いた包括的なアプリのテストが可能になり、Android Virtual Device(AVD)の Google Play サービスを最新に保つ便利な方法が提供されます。AVD でも、物理端末と同様に Google Play サービスのアップデートを行うことができます。
Device File Explorer -Android Studio 3.0 の新しい Device File Explorer を使うと、Android 端末やエミュレータのファイルとディレクトリの構造を表示できます。これによって、アプリをテストする際に、Android Studio から簡単にアプリのデータファイルを直接プレビューしたり変更したりできるようになります。詳細をご覧ください。
Android Test Orchestrator のサポート - AndroidJUnitRunner 1.0 以降を使う場合、Android Gradle プラグイン 3.0 で Android Test Orchestrator の利用がサポートされます。Android Test Orchestrator を使うと、アプリのそれぞれのテストを独自の Instrumentation 内で行うことができます。詳細をご覧ください。
ダウンロード
以前のバージョンの Android Studio を使っている方は、すぐに Android Studio 3.0 にアップグレードできます。または、公式の Android Studio プレビューのダウンロード ページからアップデートをダウンロードすることもできます。本ブログで説明したように、Gradle プラグイン API は IDE の新機能をサポートするために大幅に変更されています。そのため、アプリのプロジェクト設定のテストや検証を行うには、現在のプロジェクトの Android Gradle プラグインのバージョンも 3.0.0 にアップデートする必要があります。
気に入った機能や問題点、新機能の提案などのフィードバックは大歓迎です。バグや問題を見つけた方は、ご遠慮なく問題を送信してください。Google+ のページや Twitter で Android Studio 開発チームからの情報を常にチェックしてください。
// Construct a request for phone numbers and show the picker
private void requestHint() {
HintRequest hintRequest = new HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build();
PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(
apiClient, hintRequest);
startIntentSenderForResult(intent.getIntentSender(),
RESOLVE_HINT, null, 0, 0, 0);
}
HintRequest ビルダーは、電話番号による識別子が必要であることを Play Services に伝えます。その後、これを使って intent を作成して開始します。すると、Play Service のダイアログが表示され、選択された電話番号がアプリに共有されます。この API には、何のパーミッションも必要ありません。表示される選択肢は、スマートフォンまたは Google アカウントで利用できる電話番号です。
最新版の Play Services を実行している端末では、ユーザーが選んだ電話番号がアプリの onActivityResult に返されます。その際の形式は、E164 フォーマットです。なお、スマートフォンによっては、電話番号を取得できない場合もありますので、資格情報が null でないことを確認するようにしてください。電話番号がない場合は、ユーザーが手動で入力できる方法を提供する必要があります。
// Obtain the phone number from the result
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESOLVE_HINT) {
if (resultCode == RESULT_OK) {
Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
// credential.getId(); <-- E.164 format phone number on 10.2.+ devices
}
}
}
<#> Use 123456 as your verification code in Example App!
FA+9qCX9VSu
ワンタイム確認コードは、任意の文字列で構いません。単純に乱数を生成することもできます。メッセージの末尾は、こちらの手続きにしたがって決まるハッシュにする必要があります。Google Play Services は、このハッシュを使って確認メッセージがどのアプリのものかを判断します。ハッシュは、アプリのパッケージと署名証明書を使って一度だけ生成します。これは変更されることはなく、クライアント アプリで提供してはいけません。
サーバーは、既存の SMS インフラストラクチャやサービスを利用してスマートフォンにメッセージを送信します。メッセージを受信すると、Google Play Services がメッセージのテキストを含む intent をブロードキャストします。次にコードを示します。
public class MySMSBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
Bundle extras = intent.getExtras();
Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
switch(status.getStatusCode()) {
case CommonStatusCodes.SUCCESS:
String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
break;
case CommonStatusCodes.TIMEOUT:
break;
}
}
}
}