2017年3月21日(現地時刻)、GoogleはAndroid O Developer Previewを発表しました。
Android O Developer Previewは多くの機能が新規に追加・変更されています。主な機能をあげると
- バッテリ保護のためのBackground limits
- 通知情報をまとめるNotification channels
- パスワードの入力負荷を軽減するAutofill APIs
- Picture in Picture マルチウインドウへの対応
- XMLでのFont resources対応
- 形状をデバイスに応じて変更、アニメーションに対応するAdaptive icons
など着実な強化が図られています。公開された内容からダイジェストで解説します(随時更新します)。
- https://developer.android.com/intl/ja/preview/index.html
- https://developer.android.com/intl/ja/preview/api-overview.html
- https://android-developers.googleblog.com/2017/03/first-preview-of-android-o.html
- Android Oのリリースタイミングと既存アプリのマイグレーション方法
ノーティフィケーション
Android Oでは通知機能が再設計されました。Notification channels(通知チャンネル)では通知種類にあわせてチャンネルというまとまった単位で扱えるようになります。ユーザーはチャンネル単位でスヌーズしたりブロックしたり、カスタマイズできます。アプリが出す通知では表示するチャンネル、背景色やタイムアウト時間を指定できます。より使いやすくするために大胆な変更が加えられたと言えます。
バックグラウンド実行の制限
低消費電力機能であるDozeのながれを受けて、バックグラウンドについても制限が加えられました。Background Execution LimitsとBackground Location Limitsです。
Background Execution Limitsはバックグラウンド実行中のアプリ動作を制限します。サービスおよびブロードキャストが対象です。Android Oではフォアグラウンドとバックグラウンドを明確に区別します。アプリがバックグラウンドにまわったと判断された場合には、数分間の猶予ののちServiceは停止させられます。特定の状況下(優先度の高いFCMメッセージの受信、SMS,MMSの受信、PendingIntentによる実行時)ではバックグラウンドサービスが実行できますが、既存の処理はサービスからJobSchedulerで置き換えることになります。
もうひとつ、ブロードキャストも変更があります。Android 7.0からバックグラウンド実行には最適化が行われてきましたが、Android Oをターゲットとするアプリではついに暗黙的なブロードキャスト受信をマニフェストに記述できなくなります(明示的なブロードキャストはマニフェストに記述できますし、Context.registerReceiver()をつかえば任意のブロードキャストを受信できる点も従来どおりです。Android Oでは部分的に使えなくなっていきます)。
Background Location Limitsはバックグラウンド実行中の頻繁な位置情報の取得を制限します。バックグラウンドで位置情報を使ったリアルタイムなアラート、動き検出を行ってる場合は特に注意してください。意図通りの挙動ができなくなります。現在のDeveloper Previewでは最初の数回のみ受信を許容していますが、これは調整中の値です。GeofencingApiまたはFusedLocationProviderApiが利用できるか検討してみてください。(フォアグラウンドアプリの動作は保証されます)。この変更でLocation ManagerやFused Location Provider (FLP)が影響を受けます。
オートフィルAPI
Autofill Frameworkが追加されました。ユーザーはオートフィル機能を利用して簡単に口座やクレジットカード番号を入力できるようになります。アプリはAutofill Frameworkのサービスと通信することで、フォーム記入にかかる時間を節約し、エラーを最小化できます。
マルチウィンドウモードにPicture in Picture (PIP) を追加
Android NからPIPモードの存在は確認されていましたが、Oではモバイル、タブレットの両方でPIPモードに対応しました。ピクチャーインピクチャーモードにおいてもマルチウィンドウのライフサイクルの原則はそのままです。たとえばビデオの再生中であればいままではonPauseメソッドで停止していましたが、PIPモードを考慮するのであれば再生を継続し、onStopメソッドで停止するように変更してください。Activity.enterPictureInPictureMode()メソッドなどPIPモードのサポートにあたっていくつかのAPIが追加されています。
フォントリソースをXMLから利用する
Android Oではリソース(res/font)にあるフォントをXMLから利用ができます。TextViewに対してfontFamily属性を指定するとフォント設定が有効になります。
出典:https://developer.android.com/preview/features/working-with-fonts.html
ソースコードから利用する場合は次のようにリソースにアクセスし、TextViewのsetTypefaceメソッドで指定します。
Typeface typeface = getResources().getFont(R.font.myfont); textView.setTypeface(typeface);
フォントの設定は非常に簡単ながらも強力な表現力を持つ機能です。
マスクを考慮したアダプティブアイコン
アダプティブアイコンはデバイスごとに最適な形状を表示するための適応型ランチャーアイコンです。アダプティブアイコンは、ある機種では丸く、別の機種では四角く、とデバイスごとに統一感を出すための機能です。アニメーションにも対応しています。
出典:https://android-developers.googleblog.com/2017/03/first-preview-of-android-o.html
メーカーはデバイスごとにマスクを用意し、アイコンのレンダリング領域をマスクできます。アダプティブアイコンでは背景とフォアグラウンド画像、2層分を用意しておく必要があります。いままでのアイコンは48×48dpでしたが、108×108dp(フォアグラウンド画像は72×72dp)のサイズにしてください。
マルチメディア機能の強化
前述の機能以外にも、カラーマネジメントではAdobe RGB、Photo RGB、DCI-P3などカラープロファイルに対応、Wi-FiではNeighbor Awareness Networking (NAN) に対応、またWebViewについても安定性とセキュリティを強化するためにバージョン確認、Googleセーフブラウジングやレンダリング機能のAPI追加が図られています。
Content providerには多くのデータを扱えるようにページング処理が実装されました。MediaPlayerではバッファリング、シーク、DRM再生機能が強化され、MediaRecorderでは新たにMPEG2 TS形式をサポートし、ストリーミング用途への最適化を図っています。
Storage Access Frameworkはカスタムドキュメントプロバイダのリモートにあるデータソースに対しても、シークできるようになりました。これにより、ファイル全体をキャッシュする必要がなくなりました。データソースから任意の範囲を効率的に切り出せます。
AccountManagerについてもユーザーアカウントへのアクセスを改良しています。
アプリ開発をサポートする機能追加
マルチディスプレイ対応に追従するため、adbコマンドはアクティビティのターゲットを変更できるようになりました。
adb shell start <activity_name> –display <display_id>
とすることでターゲットディスプレイを指定できます。
StrictModeポリシーが追加されます。アプリケーションのバッファを無効化するdetectUnbufferedIoメソッド、他アプリからのアクセス設定を確認するdetectContentUriWithoutPermissionメソッド、タグ付けせずに利用されているネットワークソケットを検出するdetectUntaggedSocketsメソッドおよびあらかじめタグ付けにつかうsetThreadStatsTagメソッドなどです。
またアニメーションへの要望が高まっていることからAndroid OからAnimatorSetに逆再生機能が追加されました。これにより2つのアニメーションをつくることなく、元に戻す時は逆再生で済ませられます。またOpen JDK8からjava.nio.fileパッケージおよびjava.timeパッケージが追加されました。
Android Oでの振る舞い変更点
前述のBackground execution limitsやAndroid background location limitsはバックグラウンド動作で影響がでてきますが、こっら以外にも振る舞いが変わる点があります。URLより抜粋して解説します。
- Chrome OSやタブレット対応のため、キーボードサポートを強化しつつあります。アプリ側での対応はガイドを確認してください
- WebViewはマルチプロセス(独立した別プロセス)モードで実行します
- ANDROID_IDはアプリごとに独立の識別子になります(アプリAとBでは異なるANDROID_ID を得ます)
- ANDROID_IDは、アプリのパッケージ名と署名が同じ限り変わりません。アンインストールや再インストールは影響しません。
- アプリのショートカットはcom.android.launcher.action.INSTALL_SHORTCUTが使えなくなったため、requestPinShortcut()を使ってアプリが自分で作成する方式に変更します。詳細はこちら
- SYSTEM_ALERT_WINDOW権限を使用するアプリケーションでは、特定のウインドウタイプ(TYPE_PHONE、
TYPE_PRIORITY_PHONE、TYPE_SYSTEM_ALERT、TYPE_SYSTEM_OVERLAY、TYPE_SYSTEM_ERROR)を使用して他のアプリケーションやシステムウィンドウよりも上に警告ウィンドウを表示することができなくなりました
Exploration of Android O Api Diff
To Level o-dp1とFrom Level 25のAPI Diffのうち、変更箇所が多いもの、面白い変更点があるものを取り上げています(ドキュメントの更新によりリンク先の内容が変わる可能性がある点を了解下さい)。
- マニフェストにPermissionが幾つか追加される
- AccountManagerは大幅な変更がある
- AnimatorSetは逆再生を実装している
- PIP、通知チャンネルの追加に伴い、android.appパッケージ(特にNotification)は変更が多い
- ショートカット、ウィジェットはPin留め機能関係で変更あり
- Intentはショートカット関係が廃止、VR_HOMEカテゴリが増えてる
- パッケージマネージャはInstantApp対応が入っている
- android.graphics、android.viewはカラープロファイルに対応
- android.location.Locationクラスに移動などの精度情報が追加
- android.mediaパッケージは機能強化で差分多め
- Wi-Fiのプロキシ設定メソッドが生えてる
- ストレージマネージャのシーク、キャッシュ対応
- TextViewがオートサイズ対応