Pro Yearly is on sale from $80 to $50! »

Android at IO 19 Recap

Android at IO 19 Recap

Android at IO 19 Recap

Transcript

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

  2. About me Daichi Furiya (降矢 大地) Google Developers Expert CATS,

    CyberAgent @wasabeef_jp wasabeef
  3. Android @I/O’19 Recap

  4. Keynote / Developer Keynote Kotlin Android Q Jetpack New/Updated Jetpack

    libraries Index
  5. Keynote

  6. Kotlin

  7. Kotlin

  8. 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
  9. None
  10. コミュニティ主導で Android、GCP、MPP などで用いた Kotlin の基本とベストプラク ティスを学べるイベント郡 Kotlin/Everywhere

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

  12. Google Play

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

  14. In-app updates

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

  16. Android -

  17. Foldable Live Caption Dark theme New location controls Android Q

    Scoped storage Bubbles Gestual Navigation And more..
  18. Foldable

  19. Foldable https://youtu.be/7r_UgNcJtzQ

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

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

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

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

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

  25. Live Caption

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

  27. Dark theme

  28. Dark theme

  29. Dark theme <style name="AppTheme" parent="Theme.MaterialComponents.DayNight"> Force Dark (android:forceDarkAllowed) を使うと明示的にやらなくても自動的に適用 ※ただ、ちゃんと動作検証はする必要がある

  30. New location controls

  31. New location controls <manifest> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" "/> <uses-permission android:name=“android.permission.ACCESS_BACKGROUND_LOCATION" "/>

    "</manifest> バックグラウンドからアクセスする場合は、ACCESS_BACKGROUND_LOCATION も必要
  32. Scoped Storage

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

    を使用すること
  34. Scoped Storage ファイル場所 権限取得 アクセス方法 アンインストール時に削除 アプリ領域 - getExternalFilesDir() Yes

    メディア (写真, 動画, 音声) READ_EXTERNAL_STORAGE (他アプリのファイルを参照時) MediaStore No ダウンロード (書類など) - Storage Access Framework (システムピッカー) No
  35. Bubbles

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

  37. 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)
  38. Gestural Navigation

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

  40. Jetpack

  41. 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
  42. Jetpack compose

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

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

  45. CameraX

  46. CameraX

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

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

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

  50. Benchmark

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

    を使用する Benchmark
  52. Benchmark @RunWith(AndroidJUnit4"::class) class MyBenchmark { @get:Rule val benchmarkRule = BenchmarkRule()

    @Test fun benchmarkSomeWork() = benchmarkRule.measureRepeated { doSomeWork() } }
  53. Benchmark

  54. Security

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

  56. 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) { ""... }
  57. SavedState (ViewModel)

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

  59. SavedState (ViewModel) val vm = ViewModelProvider(this, SavedStateVMFactory(this)) .get(SavedStateViewModel"::class.java) class SavedStateViewModel(

    private val state: SavedStateHandle ) : ViewModel() { "// ""... } SavedStateVMFactory を使い、SavedStateHandle をもらうだけ
  60. ViewBinding

  61. Data binding に似ている Android Gradle plugin (3.6+) レイアウトに <layout> タグを追加しない

    Annotation processors を使用しない 双方向バインディングは出来ない ViewBinding
  62. ViewPager2

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

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

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

  66. Biometric Prompt

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

  68. 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)
  69. Conclusion..

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

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

    - https://www.irasutoya.com
  72. twitter.com/wasabeef_jp wasabeef.jp github.com/wasabeef