Slide 1

Slide 1 text

Android @I/O’19 Recap Wasabeef #io19jp #next19 #tokushima

Slide 2

Slide 2 text

About me Daichi Furiya (降矢 大地) Google Developers Expert CATS, CyberAgent @wasabeef_jp wasabeef

Slide 3

Slide 3 text

Android @I/O’19 Recap

Slide 4

Slide 4 text

Keynote / Developer Keynote Kotlin Android Q Jetpack New/Updated Jetpack libraries Index

Slide 5

Slide 5 text

Keynote

Slide 6

Slide 6 text

Kotlin

Slide 7

Slide 7 text

Kotlin

Slide 8

Slide 8 text

Kotlin First? Java Language Kotlin Platform SDK support Yes Yes Android Studio support Yes Yes Lint Yes Yes Guided docs support Yes Yes API docs support Yes Yes AndroidX support Yes Yes AndroidX Kotlin-specific APIs (e.g. KTX, coroutines) N/A Yes Online training Best effort Yes Samples Best effort Yes Multi-platform Projects No Yes Jetpack Compose No Yes

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

コミュニティ主導で Android、GCP、MPP などで用いた Kotlin の基本とベストプラク ティスを学べるイベント郡 Kotlin/Everywhere

Slide 11

Slide 11 text

Kotlin/Everywhere 日本だと GDG 九州 (in 大分) で開催したらしい

Slide 12

Slide 12 text

Google Play

Slide 13

Slide 13 text

Google Play 2019/8 から最新の評価に重み付けした計算方式に変わる

Slide 14

Slide 14 text

In-app updates

Slide 15

Slide 15 text

In-app updates Play Store にアクセスすることなくアプリアップデートを促すことが出来る

Slide 16

Slide 16 text

Android -

Slide 17

Slide 17 text

Foldable Live Caption Dark theme New location controls Android Q Scoped storage Bubbles Gestual Navigation And more..

Slide 18

Slide 18 text

Foldable

Slide 19

Slide 19 text

Foldable https://youtu.be/7r_UgNcJtzQ

Slide 20

Slide 20 text

Foldable アプリの継続性 マルチウィンドウ マルチディスプレイ

Slide 21

Slide 21 text

アプリの継続性 android:configChanges を考慮すること New Aspect Ratio

Slide 22

Slide 22 text

マルチウィンドウ Nougat から android:resizeableActivity=true で有効できる。

Slide 23

Slide 23 text

マルチウィンドウ すべてが Resume になりうるので、動画再生、カメラなどは考慮が必要

Slide 24

Slide 24 text

マルチディスプレイ ActivityOptions.get/setLaunchDisplayId() でどのでディスプレイに表示するか指定できる

Slide 25

Slide 25 text

Live Caption

Slide 26

Slide 26 text

Live Caption 動画再生時の音声をリアルタイムで認識し て、画面上に字幕を表示するこができる 字幕位置の変更 オフラインでの動作

Slide 27

Slide 27 text

Dark theme

Slide 28

Slide 28 text

Dark theme

Slide 29

Slide 29 text

Dark theme Force Dark (android:forceDarkAllowed) を使うと明示的にやらなくても自動的に適用 ※ただ、ちゃんと動作検証はする必要がある

Slide 30

Slide 30 text

New location controls

Slide 31

Slide 31 text

New location controls " バックグラウンドからアクセスする場合は、ACCESS_BACKGROUND_LOCATION も必要

Slide 32

Slide 32 text

Scoped Storage

Slide 33

Slide 33 text

Scoped Storage 自アプリ領域にはサンドボックスという形 でアクセスできるが、他アプリ領域は Storage Access Framework を利用する 写真、動画、音声を取得する場合は MediaStore を使用すること

Slide 34

Slide 34 text

Scoped Storage ファイル場所 権限取得 アクセス方法 アンインストール時に削除 アプリ領域 - getExternalFilesDir() Yes メディア (写真, 動画, 音声) READ_EXTERNAL_STORAGE (他アプリのファイルを参照時) MediaStore No ダウンロード (書類など) - Storage Access Framework (システムピッカー) No

Slide 35

Slide 35 text

Bubbles

Slide 36

Slide 36 text

これまで、オーバーレイで何かを表示する場 合などは SYSTEM_ALART_WINDOW を使っ ていたが、それを表示しているアプリのプロ セスが動作することになるので、バッテリー などのパフォーマンスがよくない背景から Bubbles

Slide 37

Slide 37 text

Bubbles "// Create bubble intent val target = Intent(context, BubbleActivity"::class.java) val bubbleIntent = PendingIntent.getActivity(context, 0, target, flags) "// Create bubble metadata val bubbleData = Notification.BubbleMetadata.Builder() .setIcon(drawable) .setIntent(bubbleIntent) .build() "// Create notification val chatBot = Person.Builder() .setBot(true) .setName("BubbleBot") .setImportant(true) .build() val builder = Notification.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .setBubbleMetadata(bubbleData) .addPerson(chatBot)

Slide 38

Slide 38 text

Gestural Navigation

Slide 39

Slide 39 text

Gestural Navigation これらをテーマから透過にする必要 がある android:navigationBarColor android:statusBarColor

Slide 40

Slide 40 text

Jetpack

Slide 41

Slide 41 text

Jetpack compose CameraX Benchmark Security SavedState (ViewModel) ViewBinding New/Updated Jetpack libraries LiveData/Lifecycle Coroutines ViewPager2 Biometrics Prompt Enterprise Android for Cars ConstraintLayout 2.0

Slide 42

Slide 42 text

Jetpack compose

Slide 43

Slide 43 text

Kotlin リアクティブ 新しい UI ツールキット マテリアルデザインとアニメーション対応 既存との互換性 Jetpack compose

Slide 44

Slide 44 text

Jetpack compose https://android-developers.googleblog.com/2019/05/whats-new-with-android-jetpack.html

Slide 45

Slide 45 text

CameraX

Slide 46

Slide 46 text

CameraX

Slide 47

Slide 47 text

カメラ実装の簡素化 Android 5.0+ (API 21+) 拡張サポート
 (Portrait、Night、HDR、Beautyなど) CameraX

Slide 48

Slide 48 text

CameraX HDR モード、Night モードなどの拡張機能や、ML Kit との連携が簡単

Slide 49

Slide 49 text

CameraX Automated CameraX test lab を用意し、Google 内部では様々な端末の検証を行っている

Slide 50

Slide 50 text

Benchmark

Slide 51

Slide 51 text

Kotlin、Java を簡単にベンチマーク出来る Android Studio Integration のサポート アプリ全体のプロファイリングではない
 ※その場合は Android Profiler を使用する Benchmark

Slide 52

Slide 52 text

Benchmark @RunWith(AndroidJUnit4"::class) class MyBenchmark { @get:Rule val benchmarkRule = BenchmarkRule() @Test fun benchmarkSomeWork() = benchmarkRule.measureRepeated { doSomeWork() } }

Slide 53

Slide 53 text

Benchmark

Slide 54

Slide 54 text

Security

Slide 55

Slide 55 text

キーの作成・検証、保存データの読み書き に関するベストプラクティスの実装を提供 銀行系やチャット系アプリなどの実装をす るときに強力 Android 6.0+ (API 23+) Security

Slide 56

Slide 56 text

Security val encryptedFile = EncryptedFile.Builder( File(context.getFilesDir(), "my_other_sensitive_data.txt"), context, masterKeyAlias, EncryptedFileKeyset.FileEncryptionScheme.AES256_GCM_HKDF_4KB ).build() "// Write to a file. try { val outputStream: FileOutputStream? = encryptedFile.openFileOutput() outputStream"?.apply { write("MY SUPER SECRET INFORMATION".toByteArray(Charset.forName("UTF-8"))) flush() close() } } catch (ex: IOException) { ""... }

Slide 57

Slide 57 text

SavedState (ViewModel)

Slide 58

Slide 58 text

プロセスまたいでの復帰が可能 Key-Value で簡単なデータを格納できる
 ※複雑なデータなどは DB などに SavedState (ViewModel)

Slide 59

Slide 59 text

SavedState (ViewModel) val vm = ViewModelProvider(this, SavedStateVMFactory(this)) .get(SavedStateViewModel"::class.java) class SavedStateViewModel( private val state: SavedStateHandle ) : ViewModel() { "// ""... } SavedStateVMFactory を使い、SavedStateHandle をもらうだけ

Slide 60

Slide 60 text

ViewBinding

Slide 61

Slide 61 text

Data binding に似ている Android Gradle plugin (3.6+) レイアウトに タグを追加しない Annotation processors を使用しない 双方向バインディングは出来ない ViewBinding

Slide 62

Slide 62 text

ViewPager2

Slide 63

Slide 63 text

ViewPager2 https://android-developers.googleblog.com/2019/05/whats-new-with-android-jetpack.html

Slide 64

Slide 64 text

ViewPager2 https://android-developers.googleblog.com/2019/05/whats-new-with-android-jetpack.html

Slide 65

Slide 65 text

RecyclerView.Adapter が使える DiffUtil 縦方向のサポート Right-to-left (RTL) サポート offscreenPageLimit ViewPager2

Slide 66

Slide 66 text

Biometric Prompt

Slide 67

Slide 67 text

FingerprintManagerの機能拡張 顔、指紋、虹彩などに対応
 (端末メーカーが対応すれば) Biometric Prompt

Slide 68

Slide 68 text

Biometric Prompt BiometricPrompt(this, executor, object : BiometricPrompt.AuthenticationCallback() { override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { super.onAuthenticationError(errorCode, errString) "//todo } override fun onAuthenticationSucceeded(result: AuthenticationResult) { super.onAuthenticationSucceeded(result) "// todo } override fun onAuthenticationFailed() { super.onAuthenticationFailed() "// todo } }).authenticate(promptInfo)

Slide 69

Slide 69 text

Conclusion..

Slide 70

Slide 70 text

References: - https://d.android.com - https://android-developers.googleblog.com/2019/05/whats-new-with- android-jetpack.html Doc Resources

Slide 71

Slide 71 text

Image Resources Photos: - https://unsplash.com - https://www.pexels.com Illustrations: - http://www.chojugiga.com - https://www.irasutoya.com

Slide 72

Slide 72 text

twitter.com/wasabeef_jp wasabeef.jp github.com/wasabeef