Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[JP] How to start Android Dev

[JP] How to start Android Dev

[JP] How to start Android Dev

Daichi Furiya (Wasabeef)

January 30, 2019
Tweet

More Decks by Daichi Furiya (Wasabeef)

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. IDE (Build tools)
    Java / Kotlin
    Architecture
    Jetpack
    KTX
    AAC
    Agenda
    DI
    Networking
    Testing
    CI
    Multi-platform

    View full-size slide

  5. IDE (Build tools)

    View full-size slide

  6. Android Studio
    3.3 Stable
    3.4 BETA
    3.5 Canary
    Gradle
    Bazel
    IDE (Build tools)

    View full-size slide

  7. Android Studio

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  10. MotionLayout

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    … and more

    View full-size slide

  14. Emulator では出来ないこと
    Bluetooth
    NFC
    Device-attached headphones
    USB

    View full-size slide

  15. Performance monitor

    View full-size slide

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

    View full-size slide

  17. Java / Kotlin

    View full-size slide

  18. Java / Kotlin
    Java
    Kotlin
    Dart

    View full-size slide

  19. Java
    Java 8 

    最新の Java は使えません

    ※ D8 tools によって今後変わりそう

    View full-size slide

  20. 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

    View full-size slide

  21. Kotlin
    Kotlin (1.3)
    Coroutines
    Null-safety
    Extension functions
    Lambda + Inline functions
    … and more

    View full-size slide

  22. Architecture

    View full-size slide

  23. Architecture
    MVVM
    Flux
    MVP
    MVI

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  26. Jetpack
    KTX
    Lifecycles
    ViewModel (+ LiveData)
    Navigation

    View full-size slide

  27. KTX
    Core
    Fragment
    Lifecycle
    Navigation
    … and more

    View full-size slide

  28. Samples
    view.viewTreeObserver.addOnPreDrawListener(
    object : ViewTreeObserver.OnPreDrawListener {
    override fun onPreDraw(): Boolean {
    viewTreeObserver.removeOnPreDrawListener(this)
    actionToBeTriggered()
    return true
    }
    }
    ) アニメーションの処理でよく見かけるコード

    View full-size slide

  29. Samples
    view.doOnPreDraw { actionToBeTriggered() }
    かなりシンプルに出来ました

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  32. ViewModel
    (+ LiveData)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  35. Samples
    class MyViewModel(private val repo: UserRepository) : ViewModel() {
    private val _user = MutableLiveData
    val user: LiveData 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 のサンプルです

    View full-size slide

  36. class MyViewModel(private val repo: UserRepository) : ViewModel() {
    private val _user = MutableLiveData
    val user: LiveData 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 のサンプルです

    View full-size slide

  37. Navigation
    Fragment Transaction の簡易化
    アニメーション
    ディープリンク
    BottomNavigation / Toolbar などと連携
    Fragment 間でデータを型安全に渡せる
    Navigation editor で GUI で設定可能

    View full-size slide

  38. Navigation editor
    iOS の StoryBoard ぽいものが増えました。でもXML直接書く人のほうが多そう

    View full-size slide

  39. Dependency Injection
    (DI)

    View full-size slide

  40. Dependency Injection (DI)
    Dagger
    Koin
    Kodein

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  44. 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

    View full-size slide

  45. Networking
    Retrofit (+ OkHttp)
    Ktor

    View full-size slide

  46. Retrofit
    (+ OkHttp)

    View full-size slide

  47. Retrofit (+ OkHttp)
    Square 社製
    Android 5.0+ (OkHttp)
    JSON, Protobuf, XMLに対応
    使いやすく、多くの人に使われている

    View full-size slide

  48. interface SampleService {
    @GET("users/{user}")
    fun getUser(@Path("user") user: String): Deferred
    }
    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
    よくあるサンプルコード

    View full-size slide

  49. interface SampleService {
    @GET("users/{user}")
    fun getUser(@Path("user") user: String): Deferred
    }
    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
    よくあるサンプルコード

    View full-size slide

  50. interface SampleService {
    @GET("users/{user}")
    fun getUser(@Path("user") user: String): Deferred
    }
    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
    よくあるサンプルコード

    View full-size slide

  51. Testing
    Unit Test
    Firebase Test Lab

    View full-size slide

  52. Unit Test
    主なテスト方法は二つ
    Instrument Test

    実機やエミュレータ上でテスト行う
    Local Test (Robolectric)

    PC の JVM 上で擬似的にテストを行う

    View full-size slide

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

    ※ まれに JVM と Android(ArtVM)で挙動差があることがある

    View full-size slide

  54. Firebase Test Lab

    View full-size slide

  55. Firebase Test Lab
    .apk をアップロードするだけで実行が可能
    Instrument/Robo Test の指定が可能
    実機・エミュレータの指定ができる
    iOS も対応
    ユーザ名・パスワードのログインにも対応
    動作ログ (Screenshot, Video) が見れる

    View full-size slide

  56. Firebase Test Lab
    コンソール画面

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  61. CI
    bitrise
    CircleCI
    Danger

    View full-size slide

  62. bitrise
    モバイル向け
    GUI
    Firebase Test lab が無料で使える

    ※ 指定出来るデバイスは少なめ
    メモリ不足で落ちることは殆どない

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  65. CircleCI
    並列タスクが高機能

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

    ※ Performance pricing planに変更して、メモ
    リ量を増やすこともできる。

    View full-size slide

  66. Danger
    コードレビューの自動化をCI上で行う
    Android Lint, Swift Lint, ESLint,
    HLint, CheckStyle Format.......

    View full-size slide

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

    View full-size slide

  68. Multi-platform

    View full-size slide

  69. Multi-platform
    Kotlin Multiplatform
    Flutter
    React Native

    View full-size slide

  70. Kotlin Multiplatform

    View full-size slide

  71. Kotlin Multiplatform
    iOS, macOS, Android, Windows,
    Linux, WASM に対応
    サーバも Kotlin にして、Backends for
    Frontends の流れで使われることがある
    UIを作れるものでは無い

    View full-size slide

  72. Kotlin Multiplatform
    iOS エンジニアにも Kotlin を読めるよう
    になってもらったほうが良い
    iOS は Coroutines が Single Thread で
    しか使えない
    https://aakira.app/blog/2018/12/kotlin-mpp-reason/

    View full-size slide

  73. Flutter
    Google
    Dart
    UI も作れる
    Android, iOS, (Web), (macOS),
    (Windows), (Linux), (Fuchsia) に対応

    View full-size slide

  74. Fast development
    Hot-reload に対応しているので、画面開発、動作確認までが楽

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  77. Conclusion..

    View full-size slide

  78. Conclusion.. 個人的な話
    SingleActivity にして MVVM で良いと思います。

    AAC が MVVM 向きに作られてるような感じ。
    Koin の実行速度が Dagger くらいにならないと導入はしない。

    理解が難しいけど、慣れればそこまでかな。
    RxJava はもう使わなくてもいいかな。Kotlin (Coroutines), LiveData で十分。
    Firebase Test Lab は絶対いれたい。
    Arrow で Null-safety より安全なコードを目指したい。

    Scala属性でモナドの人は是非。
    そういえば、DroidKaigi に Arrow のプロポーザル出したけど落ちた。
    デスクトップアプリ作るなら Flutter にしたいな。

    View full-size slide

  79. 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

    View full-size slide

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

    View full-size slide