[JP] How to start Android Dev

[JP] How to start Android Dev

[JP] How to start Android Dev

6dd0483f1353a4a359e92633cfd65c64?s=128

Daichi Furiya (Wasabeef)

January 30, 2019
Tweet

Transcript

  1. How to start dev Wasabeef GDG Tokyo New Year Party

    2019 #gdgtokyo
  2. About me Daichi Furiya Google Developers Expert CATS @wasabeef_jp wasabeef

  3. 今年から Android アプリを 作るなら知っておきたいこと January 2019

  4. IDE (Build tools) Java / Kotlin Architecture Jetpack KTX AAC

    Agenda DI Networking Testing CI Multi-platform
  5. IDE (Build tools)

  6. Android Studio 3.3 Stable 3.4 BETA 3.5 Canary Gradle Bazel

    IDE (Build tools)
  7. Android Studio

  8. Android Studio 見た目はこんな感じ。DL→https://d.android.com/studio

  9. Layout editor 直接XMLを書くこと多いですが、Layout Editorは高機能です

  10. MotionLayout

  11. Motion editor 今現在は実装されていませんが、Flash pro のようなエディタも実装される予定です

  12. Motion editor 今現在は実装されていませんが、Flash pro のようなエディタも実装される予定です

  13. Emulator 数年前と比べると格段に高機能で高速になりま した。 Quick-boot Snapshots ARCore Screen Record Wifi, Location,

    Camera, Battery
 … and more
  14. Emulator では出来ないこと Bluetooth NFC Device-attached headphones USB

  15. Performance monitor

  16. Gradle

  17. Gradle ビルド自動化 Android 開発におけるスタンダード DSL Groovy DSL ※ デフォルト Kotlin

    DSL
  18. Java / Kotlin

  19. Java / Kotlin Java Kotlin Dart

  20. Java

  21. Java Java 8 
 最新の Java は使えません
 ※ D8 tools

    によって今後変わりそう
  22. Java 8 - Unsupported features and APIs Java 8 Language

    API Compatible minSdkVersion java.lang.annotation.Repeatable Android 7 (API24) + AnnotatedElement.getAnnotationsByType(Class) java.util.stream java.lang.FunctionalInterface java.lang.reflect.Method.isDefault() java.util.function
  23. Kotlin

  24. Kotlin Kotlin (1.3) Coroutines Null-safety Extension functions Lambda + Inline

    functions … and more
  25. Architecture

  26. Architecture MVVM Flux MVP MVI

  27. MVVM

  28. Google 推奨で AAC と相性が良い google/iosched nickbutcher/plaid MVVM

  29. Flux

  30. 日本で数件の事例あり DroidKaigi/ conference-app-2019 Flux

  31. Jetpack

  32. Jetpack

  33. Jetpack KTX Lifecycles ViewModel (+ LiveData) Navigation

  34. KTX

  35. KTX Core Fragment Lifecycle Navigation … and more

  36. Samples view.viewTreeObserver.addOnPreDrawListener( object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean

    { viewTreeObserver.removeOnPreDrawListener(this) actionToBeTriggered() return true } } ) アニメーションの処理でよく見かけるコード
  37. Samples view.doOnPreDraw { actionToBeTriggered() } かなりシンプルに出来ました

  38. Lifecycles

  39. Lifecycles 見えなくて 大丈夫です..

  40. Lifecycles ライフサイクルを知りたい時がある 動画の開始停止 画面閉じた時の終了処理 … and more LiveData でも使われている

  41. ViewModel (+ LiveData)

  42. ViewModel Activity/ViewModel はそれぞれ異なるライ フサイクルがあります が、ViewModelのほ うが長生きします

  43. ViewModel (+ LiveData) ViewModel Activity の画面回転・破棄のデータ保持 Fragments 間のデータ共有 永続化ではない LiveData

    Observable の一種
  44. Samples class MyViewModel(private val repo: UserRepository) : ViewModel() { private

    val _user = MutableLiveData<User> val user: LiveData<User> get() = _user fun getUser() = return repo.getUser() } class MyActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { val model = ViewModelProviders.of(this).get(MyViewModel::class.java) model.getUser().observe(this, Observer { user -> // update UI }) } } よく見かける ViewModel + LiveData のサンプルです
  45. class MyViewModel(private val repo: UserRepository) : ViewModel() { private val

    _user = MutableLiveData<User> val user: LiveData<User> get() = _user fun getUser() = return repo.getUser() } class MyActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { val model = ViewModelProviders.of(this).get(MyViewModel::class.java) model.getUser().observe(this, Observer { user -> // update UI }) } } Samples よく見かける ViewModel + LiveData のサンプルです
  46. Navigation

  47. Navigation Fragment Transaction の簡易化 アニメーション ディープリンク BottomNavigation / Toolbar などと連携

    Fragment 間でデータを型安全に渡せる Navigation editor で GUI で設定可能
  48. Navigation editor iOS の StoryBoard ぽいものが増えました。でもXML直接書く人のほうが多そう

  49. Dependency Injection (DI)

  50. Dependency Injection (DI) Dagger Koin Kodein

  51. Dagger Java Google (+ Square) 少し難しいが一番利用されている Annotation Processing なので実行時は高速 Android

    Support
  52. Koin Kotlin 軽量で簡単 ランタイム Daggerよりは実行時が遅い

  53. Kodein Kotlin 簡単 ランタイム Daggerよりは実行時が遅い JVM, Android, JS, iOS でも動作する

  54. Android Injection Performance Library Setup Kotlin Setup Java Inject Kotlin

    Inject Java Koin 19.80 ms 20.43 ms 0.45 ms 0.35 ms Kodein 21.48 ms 21.02 ms 0.74 ms 0.62 ms Dagger 0.03 ms 0.03 ms 0.22 ms 0.15 ms Sloy/android-dependency-injection-performance
  55. Networking

  56. Networking Retrofit (+ OkHttp) Ktor

  57. Retrofit (+ OkHttp)

  58. Retrofit (+ OkHttp) Square 社製 Android 5.0+ (OkHttp) JSON, Protobuf,

    XMLに対応 使いやすく、多くの人に使われている
  59. interface SampleService { @GET("users/{user}") fun getUser(@Path("user") user: String): Deferred<User> }

    val retrofit = Retrofit.Builder().baseUrl("https://wasabeef.jp/").client(okHttpClient).build() val service = retrofit.create(SampleService::class.java) launch { val user = service.getUser("wasabeef").await() // Do something } Samples よくあるサンプルコード
  60. interface SampleService { @GET("users/{user}") fun getUser(@Path("user") user: String): Deferred<User> }

    val retrofit = Retrofit.Builder().baseUrl("https://wasabeef.jp/").client(okHttpClient).build() val service = retrofit.create(SampleService::class.java) launch { val user = service.getUser("wasabeef").await() // Do something } Samples よくあるサンプルコード
  61. interface SampleService { @GET("users/{user}") fun getUser(@Path("user") user: String): Deferred<User> }

    val retrofit = Retrofit.Builder().baseUrl("https://wasabeef.jp/").client(okHttpClient).build() val service = retrofit.create(SampleService::class.java) launch { val user = service.getUser("wasabeef").await() // Do something } Samples よくあるサンプルコード
  62. Testing

  63. Testing Unit Test Firebase Test Lab

  64. Unit Test

  65. Unit Test 主なテスト方法は二つ Instrument Test
 実機やエミュレータ上でテスト行う Local Test (Robolectric)
 PC

    の JVM 上で擬似的にテストを行う
  66. Unit Test Robolectric を使ったテストでは、実機 やエミュレータの無い CI 上でテストを 実行できる事や、それらを起動する必要 がないので、高速で行うことができる。
 ※

    まれに JVM と Android(ArtVM)で挙動差があることがある
  67. Firebase Test Lab

  68. Firebase Test Lab .apk をアップロードするだけで実行が可能 Instrument/Robo Test の指定が可能 実機・エミュレータの指定ができる iOS

    も対応 ユーザ名・パスワードのログインにも対応 動作ログ (Screenshot, Video) が見れる
  69. Firebase Test Lab コンソール画面

  70. Firebase Test Lab Console で1件クラッシュしたことがわかる

  71. Firebase Test Lab クラッシュ時のログも確認できる

  72. Firebase Test Lab 実行時のスクリーンショットも確認できる

  73. Firebase Test Lab どの時間、どの画面で負荷が上がったかがわかる

  74. CI

  75. CI bitrise CircleCI Danger

  76. bitrise

  77. bitrise モバイル向け GUI Firebase Test lab が無料で使える
 ※ 指定出来るデバイスは少なめ メモリ不足で落ちることは殆どない

  78. bitrise CircleCI と比べるとデザインが良い

  79. bitrise Console で1件クラッシュしたことがわかる

  80. CircleCI

  81. CircleCI 並列タスクが高機能
 Build, Lint, Test などを簡単に並列で出来る GUIがない (ので設定は慣れが必要) Android だとメモリ不足でよく落ちる


    ※ Performance pricing planに変更して、メモ リ量を増やすこともできる。
  82. None
  83. Danger コードレビューの自動化をCI上で行う Android Lint, Swift Lint, ESLint, HLint, CheckStyle Format.......

  84. Danger CI で Danger の連携をすると、Github コードレビューしてくれる

  85. Multi-platform

  86. Multi-platform Kotlin Multiplatform Flutter React Native

  87. Kotlin Multiplatform

  88. Kotlin Multiplatform iOS, macOS, Android, Windows, Linux, WASM に対応 サーバも

    Kotlin にして、Backends for Frontends の流れで使われることがある UIを作れるものでは無い
  89. Kotlin Multiplatform iOS エンジニアにも Kotlin を読めるよう になってもらったほうが良い iOS は Coroutines

    が Single Thread で しか使えない https://aakira.app/blog/2018/12/kotlin-mpp-reason/
  90. Flutter

  91. Flutter Google Dart UI も作れる Android, iOS, (Web), (macOS), (Windows),

    (Linux), (Fuchsia) に対応
  92. Fast development Hot-reload に対応しているので、画面開発、動作確認までが楽

  93. Expressive, beautiful UIs Material Design のウィジットが豊富で画面を作りやすい

  94. Native Performance Dart で書いたものが C/C++ でコンパイルされ、 iOS/Android にネイティブとして動く

  95. Conclusion..

  96. Conclusion.. 個人的な話 SingleActivity にして MVVM で良いと思います。
 AAC が MVVM 向きに作られてるような感じ。

    Koin の実行速度が Dagger くらいにならないと導入はしない。
 理解が難しいけど、慣れればそこまでかな。 RxJava はもう使わなくてもいいかな。Kotlin (Coroutines), LiveData で十分。 Firebase Test Lab は絶対いれたい。 Arrow で Null-safety より安全なコードを目指したい。
 Scala属性でモナドの人は是非。 そういえば、DroidKaigi に Arrow のプロポーザル出したけど落ちた。 デスクトップアプリ作るなら Flutter にしたいな。
  97. References: - https://d.android.com - https://kotlinlang.org - https://flutter.io - https://danger.systems -

    https://bitrise.io - https://circleci.com Resources Photos: - https://unsplash.com - https://www.pexels.com Illustrations: - http://www.chojugiga.com - https://www.irasutoya.com
  98. twitter.com/wasabeef_jp wasabeef.jp github.com/wasabeef