fkm blog

software開発に関することを書いていきます

Google I/O 2019: What's New in Android

www.youtube.com

なぜか冒頭の数分が録画されていなかったようで、いきなりBubblesの説明の途中から始まる。。。

Bubbles

Facebookメッセンジャーのような、他のアプリの上に重ねて何かを表示するための機能。今まではSYSTEM_ALERT_WINDOWにViewを追加することで実現していたが、将来的に廃止される予定。

Android Q(API 29)では、開発者オプションで有効にしたら使える機能。正式に出るときはユーザーのオプトインになるっぽい。

ダークテーマ

ユーザーの設定で「ダークテーマを使う」が追加。

アプリ側で対応するには、次の3つの方法がある。

テーマを使う

Theme.AppCompat.DayNight
Theme.DeviceDefault.DayNight
ThemeOverlay.DeviceDefault.Accent.DayNight

強制する

AndroidManifest.xmlandroid:forceDarkAllowed="true" をつけるか、 view.setForceDarkAllowed(true) を呼ぶか。

-nightを使う

がんばろう

共有

共有時に、コンテンツのプレビューが表示されるようになるよ。Facebookでリンクを共有しようとしたとき、OGPの内容がプレビューとして表示されるようなイメージ。

クリップボードにコピー」が右上に表示されるようになるよ。今までは共有先の1つだったけど、クリップボードへのコピー、よく使うよね!

sharing shortcut API

アプリを起動することなく共有する機能が作れるようになったよ。詳細は別セッションにて。

通知

gentleとpriorityの2セクションにわけて表示されるようになるよ。priorityとして表示されるのは、

  • アプリ:優先度の高いもの
  • OS:端末の機能として大事なやつ/人との会話/イベント/アラーム

通知アクション

コンテンツからOSが勝手に「マップで開く」とかをアクションとして追加してくれる機能。スマートリプライのもっといい版。

ジェスチャーナビゲーション

画面の左右端と下端を使って、ジェスチャーによるナビゲーションが導入されそう。そのため、iOSのように「画面の一番下にタップ可能なものを置かない」といった対応がアプリ側で必要。とはいえNavigationDrawerのようなやつもあるので、「左端はアプリが使う!」といった指定も可能になるっぽい。

ここから下はplatformに関するもの。

WebView

レンダリングがハングしたときのcallbackが追加。

アクセシビリティ

ワンライナーアクセシビリティアクションが追加できるように。

テキスト

hyphenation(ハイフネーション)が再びデフォルトでオフに。英語の時に自動でハイフンで繋ぐ機能で、パフォーマンス的にイケてないから。

他にも追加機能たくさん。詳細はテキストのセッションにて。

大鏡

Magnifier.Builder でより設定可能に。

ART

アプリのプロファイルをクラウドで集めて、いいかんじにプリコンパイルする仕組みが追加。アプリの起動時間が15%ほど早くなるらしい。

また、Generational Garbage Collectorを導入。新しいオブジェクトを早めに回収する感じかな?

Kotlin

Qで追加されるAPIにはnullability annotationがついてる。またnullabilityは強制エラーに。今までは警告だった。

kapt 1.3.30でインクリメンタルなアノテーションプロセッシングが導入。

セキュリティ

TLS 1.3がデフォルトに。生体認証ダイアログも改善。パスコード認証にフォールバックさせる仕組みも。Jetpack セキュリティライブラリ使ってみてね。

電源管理

端末の温度が一定以上になったらコールバックを受け取る仕組みが追加。

NN API

60以上の新しいAPIが追加。より低レイテンシに。

ここからはJetpack

Preferences

android.preference はdeprecatedに。androidx.preference を使おう。XMLを読ませるだけでいい感じに設定画面を作ってくれる。

Architecture Component

  • WorkManager: 1.0.1/2.0.1がstableに
  • Navigation: 1.0/2.0がstableに
  • SavedState for ViewModel: 1.0がアルファ
  • Benchmarking: 1.0がアルファ
  • Lifecycler/LiveData/Room: コルーチンサポート

CameraX

より、カメラ使うのが簡単に。機種依存もなんとかする仕組みあり。

Jetpack Compose

多分今年のI/Oで一番すごいやつ。まだまだpreviewな感じなのでみんなで作り上げていこうという感じ。一言で言うとFlutterみたいな感じでUIを作る仕組み。Kotlin compiler plugin使ってる。さよならレイアウトXML

setContent {
    Scaffold {
        Counter(title = "Bad joke")
    }
}

https://d.android.com/jetpackcompose を見てみよう。

ViewPager2

状態はalpha_04。RecyclerViewベースになっている。上下のページングにも対応。

ViewBinding

DataBindingのいい感じ版(という認識)。 <layout> で囲む必要なくなるみたい。

BlendMode

もともと、PorterDuff.Mode というのがあったけど、ドキュメント化されてなかった。さらに困ったことに porterduff とは関係ないモードまであった。なので android.graphics.BlendMode を新しく追加したよ。忘れられてた HARD_LIGHTSOFT_LIGHT とかも追加したよ。

RenderNodeとかは使う機会少なそうなので割愛

Vulkan

64bitデバイスでは1.1がrequiredになるよ。

ANGLE

Vulkan上でOpenGL ESを動かすしくみ。現時点では開発者オプションでONにしないと使えない。

Audio Playback Capture

他のアプリが再生している音をキャプチャーできるよ。キャプチャーされたら困る場合は、AndroidManifest.xmlandroid:allowAudioPlaybackCapture="..." を追加。Qではデフォルトでoff。

ここからは、プライバシーに関する変更

External Storage

Qからはサンドボックスモードがデフォルトになるよ。メディアや画像とかへのアクセスはちゃんとpermissionとる必要がある。ファイルマネージャーのようなアプリの場合は、さらに設定が必要(作れなくなるわけじゃない)。

位置情報

iOSのように、位置情報の取得を「アプリがフォアグラウンドの時だけ許す」「バックグラウンドでも許す」の選択ができるように。

バックグラウンドからのアクティビティ起動

アクティビティを起動するには、

  • フォアグラウンドからの起動
  • フォアグラウンドにいるアプリからのPendingIntent
  • システムからのPendingIntent(例:通知をタップした)
  • システムからのブロードキャスト

のみ。

カメラ

getCameraCharacteristics() はデバイス固有のデータに対しては CAMERAパーミッションが必要になる。

Connectivity

アプリでWifiのON/OFFはできなくなる。Settings Panelを使おう。

盛りだくさんだなぁ