Android O(オレオ)の勘所

こんにちは!
Android OSのバージョンアップ情報が流れるたびガクブルするイシヤマです。

早速ですが、今回はAndroidの最新バージョン8.0(APIレベル26)通称Oreoの勘所についてお話したいと思います。

Android Oの気を付けるべき変更点

今回のバージョンアップもこれまでと同様、既存アプリへの影響が大きな変更が行われています。

その中でも、僕が特に気を付けるべきだと思った変更点はこちらです。

  1. バックグラウンド動作抑制の強化
  2. オートフィル(フォーム自動入力)機能の追加
  3. PermisionGroupの動作変更(不具合修正)
  4. Notificationのカテゴリ分け

では、1つづつ詳細を見ていきましょう!!

バックグラウンド動作抑制の強化

バックグラウンド動作抑制は、端末の電池持ちを良くするための省電力対応の一つです。
最近では、無操作中にCPUをスリープさせるDozeモードなどもその仲間となります。

Android Nでもそれらの省電力対応は行われていましたが、Oではこれがより強力になっています。

その中でも、既存のアプリにとって特にヤバいのがバックグラウンドサービスの強制停止。これは、他アプリの裏に回ったり、ホームに戻ったりするとサービスが動がなくなるというものです。

アプリ非表示でもニュースの内容は最新にしておこう

AM5時ごろに重い処理をさせておこう

なんてことを今までやってきたアプリは、O端末でその機能が動かない可能性があります。

アプリの情報が更新されないとか、アプリ起動時に溜まっていた処理が動き出してもっさりする、最悪は機能そのものが動かないなんてことにもなりかねません。

これを回避するためには、バックグラウンドサービス(通常のサービス)をやめてジョブスケジューラーで作り直すという方法がありますが、作り直す部分が多く正直やりたくないですよね。

現在のサービスのままで行くなら、フォアグラアンドサービスにしてしまうという手が最も簡単に使えます。

「既存の実査をそのまま使えるじゃんっ!」と喜ぶのはまだ早い!

フォアグラアンドサービスにすると、副作用として漏れなく端末画面の最上部にあるシステム領域に処理中アイコンが付いてきます。

ユーザーからすると、アプリが勝手に何かやってるというのがバレバレです。嫌がられてアプリを消されてしまうかもしれません。

そのリスクを取るか、作り直しのリスクを取るかは悩ましいところですね。

オートフィル(フォーム自動入力)機能の追加

こちら、アプリユーザーにはメリットの大きな新機能で、住所など一度入力した内容を覚えておいて別の画面やアプリで自動入力できるというものです。

が、開発者やセキュリティ重視な方の目線ではちょっと気になる動作があります。

それは、Androidが入力内容を自動的に収集するという点です。

パスワードなんかも自動的に収集されてしまうため、テキストエディタなどでパスワード入力フォームを作っているアプリでは、気づかないうちに個人情報を収集するアプリになってしまうのです。

ユーザーが便利になるなら良いんじゃない?

という考えもありますし、僕自身もそう思いますがアプリ発注元の見解を確認しておくに越したことはないでしょう。

自動収集されるのが嫌な場合、View毎にAutoFill無効を設定することで入力内容を収集されることが無くなりました。
DP3までは自動収集を回避することが出来なかったので、とても素晴らしい変更ですね。

無効にする設定は、レイアウトのXMLファイルかJavaコードから

・IMPORTANT_FOR_AUTOFILL_NO

・IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS

のどちらかを設定します。
前者は対象のViewと子ViewにもAutoFillモードを反映、後者は対象Viewのみに設定を行うという点が異なります。

Javaの場合は下記のような感じで無効化が可能です。

view.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO);

PermisionGroupの動作変更(不具合修正)

実はこれO未満のAndroidのバグを直した対応なのですが、既存アプリにかなりの影響を与えてきます。

しかも、バグ修正と言ってもそのバグを開発者が知らずに使っていることが多く、地味に便利だったりするのがやらしいところ。

Androidのパーミッションは、Android端末の機能、つまり電話帳などの個人情報にアクセスしたり、外部メディア(microSD)の読み書きやインターネット通信などを使うアプリだとユーザーに教える役目を担っています。

今回修正されたのはパーミッショングループというもので、似たようなパーミッションをグループ化してわかりやすくしましょうというものです。

Android Developerサイトにグループ一覧が載っているので、自分のアプリが該当するかチェックして見ましょう!

Android Developers パーミッショングループ

例えば、外部メディアの読みと書きはパーミッションとしては個別に分かれているのですが、パーミッショングループは同じです。

この場合、読みか書きのどちらかをManifestで宣言しておけばどちらも宣言したことになっていたのですが、これ実はバグだったのです。

本当は、個別に必要なものは全て宣言しなくてはならなかった、と。

対応しないとOにバージョンアップした途端にセキュリティ例外が出て強制終了祭りなんてことに……

Notificationのチャネル設定

buildTargetSDKのバージョンを26にすると、Notificationの再生時にデフォルトチャネルを設定する必要があります。

チャネルとは、バイブや鳴動音などのパターンや色なんかを定義したものですが、これをNotification作成毎に指定するよう仕様が変わっているので注意してください。

デフォルトチャネルの設定を行わないと、作成時に強制終了するのでお気を付けを。

ぶっちゃけ、強制終了させるくらいならビルド通らないようにしてくれれば良いのに……

以上、Android Oで気をつけなくてはならない変更点について記載しましたが、お役に立ったでしょうか。

こんな回避方法あるよ、という情報提供や間違ってるところなどありましたらコメント記載してもらえるとありがたいです。

※本投稿は具体例などを交えて見やすくなるように再構成する予定です!乞うご期待!