$30 off During Our Annual Pro Sale. View Details »

来年に備えるために Android の知識を網羅する / Looking back on this Android year in preparation for next year.

来年に備えるために Android の知識を網羅する / Looking back on this Android year in preparation for next year.

Daichi Furiya (Wasabeef)

December 14, 2019
Tweet

More Decks by Daichi Furiya (Wasabeef)

Other Decks in Programming

Transcript

  1. 来年に備えるために Android の知識を網羅する
    Daichi Furiya / Wasabeef

    View Slide

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

    View Slide

  3. 来年に備えるために
    Android の知識を網羅する

    View Slide

  4. 黎明期の
    Android アプリ開発は...

    View Slide

  5. RetroLambda
    MVC
    VOLLEY
    JUICE
    ActionBarSherlock
    Timber

    View Slide

  6. 成熟期の
    Android アプリ開発は...

    View Slide

  7. DAGGER2
    MVVM
    FLUX
    MVI
    Timber

    View Slide

  8. activity
    ads
    annotation
    appcompat
    arch
    asynclayoutinflater
    autofill
    benchmark
    biometric
    browser
    Jetpack に含まれるライブラリを並べてみると…

    View Slide

  9. camera
    car
    cardview
    collection
    concurrent
    constraintlayout
    contentpager
    coordinatorlayout
    core
    cursoradapter
    Jetpack に含まれるライブラリを並べてみると…

    View Slide

  10. customview
    databinding
    documentfile
    drawerlayout
    dynamicanimation
    emoji
    enterprise
    exifinterface
    fragment
    gridlayout
    Jetpack に含まれるライブラリを並べてみると…

    View Slide

  11. heifwriter
    interpolator
    jetifier
    leanback
    legacy
    lifecycle
    loader
    localbroadcastmanager
    media
    media2
    Jetpack に含まれるライブラリを並べてみると…

    View Slide

  12. mediarouter
    multidex
    navigation
    paging
    palette
    percentlayout
    preference
    print
    recommendation
    recyclerview
    Jetpack に含まれるライブラリを並べてみると…

    View Slide

  13. remotecallback
    room
    savedstate
    security
    sharetarget
    slice
    slidingpanelayout
    sqlite
    swiperefreshlayout
    test
    Jetpack に含まれるライブラリを並べてみると…

    View Slide

  14. textclassifier
    transition
    tvprovider
    vectordrawable
    versionedparcelable
    viewpager
    viewpager2
    wear
    webkit
    work
    Jetpack に含まれるライブラリを並べてみると…

    View Slide

  15. activity
    ads
    annotation
    appcompat
    arch
    asynclayoutinflater
    autofill
    benchmark
    biometric
    browser
    camera
    car
    cardview
    collection
    concurrent
    constraintlayout
    contentpager
    coordinatorlayou
    core
    cursoradapter
    customview
    databinding
    documentfile
    drawerlayout
    dynamicanima
    emoji
    enterprise
    exifinterface
    fragment
    gridlayout
    heifwriter
    interpolator
    jetifier
    leanback
    legacy
    lifecycle
    loader
    localbroadcastmanager
    media
    media2
    remotecallback
    room
    savedstate
    security
    sharetarget
    slice
    slidingpanelayout
    sqlite
    swiperefreshlayout
    textclassifier
    transition
    tvprovider
    vectordrawable
    versionedparcelable
    viewpager
    viewpager2
    wear
    webkit
    work
    mediarouter
    multidex
    navigation
    paging
    palette
    percentlayout
    preference
    print
    recommendation
    recyclerview

    View Slide

  16. activity
    ads
    annotation
    appcompat
    arch
    asynclayoutinflater
    autofill
    benchmark
    biometric
    browser
    camera
    car
    cardview
    collection
    concurrent
    constraintlayout
    contentpager
    coordinatorlayout
    core
    cursoradapter
    customview
    databinding
    documentfile
    drawerlayout
    dynamicanimation
    emoji
    enterprise
    exifinterface
    fragment
    gridlayout
    heifwriter
    interpolator
    jetifier
    leanback
    legacy
    lifecycle
    loader
    localbroadcastmanager
    media
    media2
    mediarouter
    multidex
    navigation
    paging
    palette
    percentlayout
    preference
    print
    recommendation
    recyclerview
    remotecallback
    room
    savedstate
    security
    sharetarget
    slice
    slidingpanelayout
    sqlite
    swiperefreshlayout
    test
    textclassifier
    transition
    tvprovider
    vectordrawable
    versionedparcelable
    viewpager
    viewpager2
    wear
    webkit
    work

    View Slide

  17. activity
    ads
    annotation
    appcompat
    arch
    asynclayoutinflater
    autofill
    benchmark
    biometric
    browser
    camera
    car
    cardview
    collection
    concurrent
    constraintlayout
    contentpager
    coordinatorlayout
    core
    cursoradapter
    customview
    databinding
    documentfile
    drawerlayout
    dynamicanimation
    emoji
    enterprise
    exifinterface
    fragment
    gridlayout
    heifwriter
    interpolator
    jetifier
    leanback
    legacy
    lifecycle
    loader
    localbroadcastmanager
    media
    media2
    mediarouter
    multidex
    navigation
    paging
    palette
    percentlayout
    preference
    print
    recommendation
    recyclerview
    remotecallback
    room
    savedstate
    security
    sharetarget
    slice
    slidingpanelayout
    sqlite
    swiperefreshlayout
    test
    textclassifier
    transition
    tvprovider
    vectordrawable
    versionedparcelable
    viewpager
    viewpager2
    wear
    webkit
    work
    70+ 個のライブラリ群

    View Slide

  18. DAGGER2
    MVVM
    FLUX
    MVI
    Timber
    activity
    ads
    annotation
    appcompat
    arch
    asynclayoutinflater
    autofill
    benchmark
    biometric
    browser
    camera
    car
    cardview
    collection
    concurrent
    constraintlayout
    contentpager
    coordinatorlayout
    core
    cursoradapter
    customview
    databinding
    documentfile
    drawerlayout
    dynamicanimation
    emoji
    enterprise
    exifinterface
    fragment
    gridlayout
    heifwriter
    interpolator
    jetifier
    leanback
    legacy
    lifecycle
    loader
    localbroadcastmanager
    media
    media2
    mediarouter
    multidex
    navigation
    paging
    palette
    percentlayout
    preference
    print
    recommendation
    recyclerview
    remotecallback
    room
    savedstate
    security
    sharetarget
    slice
    slidingpanelayout
    sqlite
    swiperefreshlayout
    test
    textclassifier
    transition
    tvprovider
    vectordrawable
    versionedparcelable
    viewpager
    viewpager2
    wear
    webkit
    work
    70+ 個のライブラリ群

    View Slide

  19. この場で話す範囲
    Android 10
    Android Studio 4.0
    (Flutter)
    Kotlin (DSL, MPP, Coroutine, Flow)
    Architecture(MVVM)
    Jetpack (AAC, Compose)
    Networking (Retrofit+OkHttp)
    DI (Dagger2)
    Firebase (Test Lab)

    View Slide

  20. Android 10

    View Slide

  21. Security
    Updates
    Smart
    Reply
    Dark
    Theme
    Privacy
    Controls
    Family
    Link
    Live
    Caption
    Sound
    Amplifier
    Location
    Controls
    Gesture
    Navigation
    Focus
    Mode
    Android 10 Highlights

    View Slide

  22. Location
    Controls

    View Slide

  23. Location Controls

    android:name="android.permission.ACCESS_COARSE_LOCATION" />
    android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

    バックグラウンドでロケーション
    情報を取得するには、また別に権
    限を取得しないといけません。

    View Slide

  24. Gestural
    Navigation

    View Slide

  25. Gestural Navigation
    これらをテーマから透過にする必要
    があります。
    ・ NavigationBar
    ・ StatusBar

    View Slide

  26. Foldable

    View Slide

  27. https://youtu.be/7r_UgNcJtzQ

    View Slide

  28. アプリの継続性
    まだ日本で購入できる端末は少な
    くて、シェアは多くないですが、
    画面を折り畳んだ後も正常に実行
    できるように考慮しなければいけ
    ません。

    View Slide

  29. マルチウィンドウ
    そしてまた、画面を分割して、ア
    プリを複数立ち上げられるという
    ことは画面比率が変わることがあ
    るので、レイアウトが崩れないよ
    うに実装を注意する必要がありま
    す。

    View Slide

  30. マルチウィンドウ
    レイアウト崩れもそうですが、も
    う一つ大きな注意点があります。
    例えば YouTube を起動している
    ときに、Netflix を起動した場合
    は、両方とも動画が流れ続けては
    いけません。

    View Slide

  31. Android Studio
    4.0

    View Slide

  32. Motion Editor
    Jetpack
    Compose
    Multi-Preview
    Kotlin DSL Build Speed
    Emulator
    Multi-Display
    Google Map
    Integration
    Proguard
    Editing
    Desugaring
    in D8 & R8
    Live
    Layout
    Inspector
    Android Studio 4.0 Highlights

    View Slide

  33. Motion Editor

    View Slide

  34. Motion Editor
    MotionLayout と Motion
    Editor を使うことで、GUI
    上で簡単にアニメーション
    を実装できます。

    View Slide

  35. Motion Editor
    MotionLayout と Motion
    Editor を使うことで、GUI
    上で簡単にアニメーション
    を実装できます。

    View Slide

  36. Motion Editor
    MotionLayout と Motion
    Editor を使うことで、GUI
    上で簡単にアニメーション
    を実装できます。

    View Slide

  37. Multi Preview

    View Slide

  38. Multi Preview
    さまざまな解像度のデバイ
    スや、各国の言語設定をプ
    レビューすることができ、
    これにより事前にレイアウ
    ト崩れなどをチェックでき
    ます。

    View Slide

  39. Live
    Layout Inspector

    View Slide

  40. Live Layout Inspector
    エミュレータなどでデバッ
    グしているアプリの View
    構造を 3D に視覚化でき、
    設定されているプロパティ
    値などの確認を迅速に行え
    るようになります。

    View Slide

  41. Flutter

    View Slide

  42. Flutter
    一つのソースコードからモバイル、
    Web、デスクトップ向けにネイティブ
    コンパイルするための Google 製 UI
    ツールキットです。
    国内の採用事例もいくつかあります。

    View Slide

  43. Flutter の事をもっと知りたい方は..
    Flutter Overview
    17:00 〜 17:40
    B202
    上田 哲広 / Tetsuhiro Ueda

    View Slide

  44. Kotlin

    View Slide

  45. Kotlin 1.3.61
    (2019.12.14)

    View Slide

  46. 2017年 Kotlin 公式言語化
    2018年 Android Jetpack 発表
    2019年 Kotlin-first

    View Slide

  47. Kotlin-first?
    Java 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

    View Slide

  48. 60% のアプリで利用(TOP 1000)
    Kotlin-first?

    View Slide

  49. Kotlin vs Java?

    View Slide

  50. public final class Dog {
    private String name;
    private Color color;
    private LocalDate birthday;
    private float height;
    private float weight;
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public Color getColor() {
    return color;
    }
    Kotlin
    data class Dog(
    var name: String,
    var color: Color,
    var birthday: LocalDate,
    var height: Float,
    var weight: Float
    )
    Java

    View Slide

  51. Android Java にはない Kotlin の機能
    SAM 変換
    拡張関数
    データクラス
    Null-safety
    インライン関数
    スマートキャスト
    Coroutines
    Flows
    etc..

    View Slide

  52. Kotlin
    Coroutines

    View Slide

  53. Android Threading
    Android マルチスレッドにおいての画面の更新はメインス
    レッドで実行する必要があり、API 通信などはメインスレッ
    ドで通信してはいけません。
    また、Activity や Fragment が破棄された後にそれらのス
    レッドをキャンセルするためにライフサイクルを知っておく
    必要もあります。

    View Slide

  54. java.lang.Thread, android.os.Handler(API Level 1)
    もっとも古くからある原始的
    な非同期処理で、Activity
    などのライフサイクルは考慮
    されていません。Thread,
    Handler はあらゆる非同期
    処理の内部実装で使われてい
    ます。
    Thread {
    val bitmap = loadBitmap("https: //wasabeef.jp/image.png")
    Handler(mainLooper).post {
    imageView.setImageBitmap(bitmap)
    }
    }.start()

    View Slide

  55. RxJava
    非同期処理用ではなくリア
    クティブプログラミングの
    ライブラリです。ライフサ
    イクルに紐づけることもで
    きます。RxJava の機能全
    体を把握するのは難しく、
    学習コストが高めです。
    val observable = Observable.create { emitter ->
    val bitmap = loadBitmap("https: //wasabeef.jp/image.png")
    emitter.onNext(bitmap)
    emitter.onComplete()
    }.subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
    { bitmap -> imageView.setImageBitmap(bitmap) },
    { error -> /** do something **/ })
    .addTo(compositeDisposable)
    }

    View Slide

  56. Kotlin Coroutines
    軽量スレッド
    キャンセルが簡単
    失敗時のハンドリングが簡単
    ライフサイクルへの紐付けが簡単
    2019年が移行期
    1.3.3

    View Slide

  57. コルーチンビルダーで
    す。launch 関数を呼び
    出すことでコルーチンが
    開始されます。
    launch {
    println("Hello, Coroutines !!")
    }
    launch - Kotlin Coroutines

    View Slide

  58. val job = launch {
    println("Hello, Coroutines !!")
    }
    job.cancel()
    また、launch 関数は Job
    クラスを返します。この
    Job はコルーチンのライフ
    サイクルのハンドリングを
    提供します。アクティブ状
    態か完了しているかなどを
    把握でき、キャンセルする
    こともできます。
    Job - Kotlin Coroutines

    View Slide

  59. Job では Job 同士を階
    層関係で管理することが
    できます。launch 関数
    を呼ぶときに親にあた
    る Job を渡すことでそ
    れが可能となります。
    val parentJob = Job()
    val job = launch(parentJob) {
    println("Hello, Coroutines !!")
    }
    parentJob.cancel()
    Job hierarchy - Kotlin Coroutines

    View Slide

  60. Job の階層関係を作るこ
    とで、親 Job をキャン
    セルした場合には、子
    Job もキャンセルするこ
    とができます。
    Job hierarchy - Kotlin Coroutines
    Parent Job
    Child Job A Child Job B Child Job C
    .cancel()
    .cancel() .cancel() .cancel()

    View Slide

  61. Job によってコルーチ
    ンのライフサイクルを
    ハンドリングすること
    ができますが、そのコ
    ルーチンは、どういう
    スコープで生存させる
    かを決めることができ
    ます。
    CotoutineScope - Kotlin Coroutines
    val parentJob = Job()
    val job = launch(parentJob) {
    println("Hello, Coroutines !!")
    }
    parentJob.cancel()

    View Slide

  62. val scope = CoroutineScope(Job())
    val job = scope.launch {
    println("Hello, Coroutines !!")
    }
    scope.cancel()
    launch 関数は全て
    CoroutineScope の中で
    実行されます。これまで
    省略していましたが、本
    来はこのような形になっ
    ており。そのスコープ内
    のコルーチンはキャンセ
    ルすることができます。
    CotoutineScope - Kotlin Coroutines

    View Slide

  63. このスコープを
    Activity、Fragment
    や ViewModel に合わせ
    ることで、Android のラ
    イフサイクルに紐づける
    ことができます。
    CotoutineScope - Kotlin Coroutines
    val scope = CoroutineScope(Job())
    val job = scope.launch {
    println("Hello, Coroutines !!")
    }
    scope.cancel()

    View Slide

  64. launch 関数にはコルー
    チンが実行に使用するス
    レッドを指定することが
    できます。CPU に負荷
    がかかるような計算など
    はメインスレッドではな
    く Default を使用する
    ことができます。
    CotoutineDispatcher - Kotlin Coroutines
    val scope = CoroutineScope(Job())
    val job = scope.launch(Dispatchers.Default) {
    println("Hello, Coroutines !!")
    }
    scope.cancel()

    View Slide

  65. val scope = CoroutineScope(Job())
    val job = scope.launch(Dispatchers.Main) {
    println("Hello, Coroutines !!")
    }
    scope.cancel()
    Android において画面
    の更新はメインスレッド
    で行わないといけないた
    め、Main を指定するこ
    とにより UI 操作もする
    こができます。
    CotoutineDispatcher - Kotlin Coroutines

    View Slide

  66. val scope = CoroutineScope(Job())
    val job = scope.launch(Dispatchers.IO) {
    println("Hello, Coroutines !!")
    }
    scope.cancel()
    メインスレッドではな
    く、データベース、ファ
    イルの読み書きやネット
    ワーク通信をする場合に
    は IO を指定することで
    パフォーマンスも期待で
    きます。
    CotoutineDispatcher - Kotlin Coroutines

    View Slide

  67. CoroutineScope を生
    成するときに、スコープ
    のデフォルトスレッドを
    指定したい場合などに
    は、+ でつなげること
    ができます。
    val scope = CoroutineScope(Job() + Dispatchers.IO)
    val job = scope.launch {
    println("Hello, Coroutines !!")
    }
    scope.cancel()
    CotoutineDispatcher - Kotlin Coroutines

    View Slide

  68. Kotlin Flows

    View Slide

  69. Kotlin Flows
    RxJava と同様に Reactive streams specification
    Coroutines は One-shotで、Flows は Observers として使う
    RxJava に比べたらやれることが少ない
    RxJava よりもパフォーマンス向上のためシンプルな設計
    受信するまで動作しない(コールドストリーム)
    2020年が移行期??

    View Slide

  70. 簡単に使ってみるのは
    とてもシンプルで、
    flow {} ビルダーで生
    成して、launch 内で
    collect 関数を呼ぶこ
    とで、emit された
    データを受信します。
    Kotlin Flows
    val my Flow = flow {
    emit("Hello, World!")
    emit("I'm Flow?")
    }
    launch {
    my Flow.collect { data ->
    println(data)
    }
    }

    View Slide

  71. Flow はコールドスト
    リームなので、collect
    関数を何度呼んでも同じ
    データを受信します。
    ホットストリームを使い
    たい場合は RxJava か
    Kotlin Channels を調
    べてみましょう。
    Kotlin Flows
    val my Flow = flow {
    emit("Hello, World!")
    emit("I'm Flow?")
    }
    launch {
    my Flow.collect { data ->
    println(data)
    }
    my Flow.collect { data ->
    println(data)
    }
    }

    View Slide

  72. Kotlin/Native

    View Slide

  73. Kotlin/Native
    Kotlin をネイティブバイナ
    リにコンパイルするための
    技術であり、iOS などの仮
    想マシンがない環境でも実
    行できます。

    View Slide

  74. Target Platforms - Kotlin/Native
    iOS (arm32, arm64, simulator x86_64)
    macOS (x86_64)
    Android (arm32, arm64)
    Windows (mingw x86_64, x86)
    Linux
    (x86_64, arm32, MIPS, MIPS LE, Raspberry Pi)
    WebAssembly (x86_64)

    View Slide

  75. Kotlin
    Multiplatform

    View Slide

  76. Kotlin Multiplatform
    KotlinConf 2019 でも多く
    のセッションがありました
    が、iOS と Android でビジ
    ネスロジックを Kotlin で共
    通化するなどの事例が出始
    めています。
    ※ iOS の UI が作れるものではありません。
    Kotlin/LLVM
    Kotlin/JVM Kotlin/JVM
    Kotlin/JS
    Common code

    View Slide

  77. Architecture
    (MVVM)

    View Slide

  78. Architecture(MVVM) Activity/Fragment
    Repository
    ViewModel
    LiveData
    Local Source
    Room
    Remote Data Source
    Retrofit/okHttp
    https://developer.android.com/jetpack/docs/guide
    最近では Google の推奨
    アーキテクチャとして
    MVVM が取り上げられて
    います。FLUX や MVI に
    寄せて開発しているプロダ
    クトの事例もあります。

    View Slide

  79. Architecture(MVVM) Activity/Fragment
    Repository
    ViewModel
    LiveData
    Local Source
    Room
    Remote Data Source
    Retrofit/okHttp
    https://developer.android.com/jetpack/docs/guide
    Jetpack
    そして、MVVM で設計す
    る上で、使いやすいライブ
    ラリが Jetpack には多く
    存在します。

    View Slide

  80. Architecture(MVVM) Activity/Fragment
    Repository
    ViewModel
    LiveData
    Local Source
    Room
    Remote Data Source
    Retrofit/okHttp
    https://developer.android.com/jetpack/docs/guide
    Jetpack
    そして、MVVM で設計す
    る上で、使いやすいライブ
    ラリが Jetpack には多く
    存在します。

    View Slide

  81. Architecture(MVVM) Activity/Fragment
    Repository
    ViewModel
    LiveData
    Local Source
    Room
    Remote Data Source
    Retrofit/okHttp
    https://developer.android.com/jetpack/docs/guide
    Jetpack
    そして、MVVM で設計す
    る上で、使いやすいライブ
    ラリが Jetpack には多く
    存在します。

    View Slide

  82. Architecture(MVVM) Activity/Fragment
    Repository
    ViewModel
    LiveData
    Local Source
    Room
    Remote Data Source
    Retrofit/okHttp
    https://developer.android.com/jetpack/docs/guide
    Jetpack
    そして、MVVM で設計す
    る上で、使いやすいライブ
    ラリが Jetpack には多く
    存在します。
    Jetpack
    Jetpack

    View Slide

  83. Jetpack

    View Slide

  84. activity
    ads
    annotation
    appcompat
    arch
    asynclayoutinflater
    autofill
    benchmark
    biometric
    browser
    camera
    car
    cardview
    collection
    concurrent
    constraintlayout
    contentpager
    coordinatorlayout
    core
    cursoradapter
    customview
    databinding
    documentfile
    drawerlayout
    dynamicanimation
    emoji
    enterprise
    exifinterface
    fragment
    gridlayout
    heifwriter
    interpolator
    jetifier
    leanback
    legacy
    lifecycle
    loader
    localbroadcastmanager
    media
    media2
    mediarouter
    multidex
    navigation
    paging
    palette
    percentlayout
    preference
    print
    recommendation
    recyclerview
    remotecallback
    room
    savedstate
    security
    sharetarget
    slice
    slidingpanelayout
    sqlite
    swiperefreshlayout
    test
    textclassifier
    transition
    tvprovider
    vectordrawable
    versionedparcelable
    viewpager
    viewpager2
    wear
    webkit
    work
    70+ 個のライブラリ群

    View Slide

  85. Architecture UI
    Behavior
    Foundation
    Jetpack
    ボイラープレートコードの
    手間省けて、下位互換性を
    備えたアプリを簡単に作成
    するためのライブラリで
    す。androidx.* パッケー
    ジで構成されています。

    View Slide

  86. Architecture UI
    Behavior
    Foundation
    Jetpack
    Data Binding
    Lifecycles
    LiveData
    Navigation
    Paging
    Room
    ViewModel
    WorkManager

    View Slide

  87. Architecture UI
    Behavior
    Foundation
    Jetpack
    Animation & Transitions
    Auto, TV & Wear
    Emoji
    Fragment
    Layout
    Pallets

    View Slide

  88. Architecture UI
    Behavior
    Foundation
    Jetpack
    Download Manager
    Media & Playback
    Permissions
    Notifications
    Sharing
    Slices

    View Slide

  89. Architecture UI
    Behavior
    Foundation
    Jetpack
    AppCompat
    Android KTX
    Multidex
    Test

    View Slide

  90. AppCompat
    ※ JetpackͷҰ෦

    View Slide

  91. AppCompat
    必ず使うことになるライブラ
    リで Android アプリ開発で
    は、古い OS の対応などがと
    ても困難でありそれらの問題
    を吸収してくれるサポートラ
    イブラリとなります。
    import androidx.appcompat.app.AppCompatActivity
    public class AppCompatActivity
    extends FragmentActivity implements ... { }

    View Slide

  92. Android KTX
    ※ JetpackͷҰ෦

    View Slide

  93. Android KTX
    Jetpack に含まれる
    Kotlin の拡張機能セッ
    ト。コードをシンプルにす
    ることができます。
    view.viewTreeObserver.addOnPreDrawListener(
    object : ViewTreeObserver.OnPreDrawListener {
    override fun onPreDraw(): Boolean {
    viewTreeObserver.removeOnPreDrawListener(this)
    something()
    return true
    }
    }
    )

    View Slide

  94. Android KTX
    Jetpack に含まれる
    Kotlin の拡張機能セッ
    ト。コードをシンプルにす
    ることができます。
    view.doOnPreDraw {
    something()
    }

    View Slide

  95. Android Architecture Components
    (AAC)
    ※ JetpackͷҰ෦

    View Slide

  96. Android Architecture Components(AAC) Activity/Fragment
    Repository
    ViewModel
    LiveData
    Local Source
    Room
    Remote Data Source
    Retrofit/okHttp
    https://developer.android.com/jetpack/docs/guide
    AAC
    Android アーキテクチャ コ
    ンポーネントは、堅牢でテ
    ストとメンテナンスが簡単
    なアプリの設計を支援する
    ライブラリのコレクション
    です。
    Lifecycle, ViewModel,
    LiveData, Room...
    AAC
    AAC

    View Slide

  97. Lifecycle
    ※ AACͷҰ෦

    View Slide

  98. Android のライフサイク
    ルを理解するのも取り扱う
    のもとても大変です。多く
    の初学者が最初にぶつかる
    壁かもしれません。
    Lifecycle

    View Slide

  99. Lifecycle
    Repository
    Local Source
    Room
    Remote Data Source
    Retrofit/okHttp
    https://developer.android.com/jetpack/docs/guide
    Android の UI コンポーネン
    トの多くがライフサイクルに
    紐づいて作られています。そ
    のため Lifecycle ライブラリ
    では、そのライフサイクルに
    簡単に対応できるように用意
    されています。
    Activity/Fragment
    ViewModel
    LiveData

    View Slide

  100. Navigation
    ※ AACͷҰ෦

    View Slide

  101. Navigation
    Repository
    ViewModel
    LiveData
    Local Source
    Room
    Remote Data Source
    Retrofit/okHttp
    https://developer.android.com/jetpack/docs/guide
    単純なボタンクリックか
    ら、アプリバーやナビゲー
    ションドロワーなどの複雑
    なパターンまで、さまざま
    なコンテンツ間を移動する
    を実装するに便利です。
    Activity/Fragment

    View Slide

  102. Navigation
    Android Studio にあるで
    きるナビゲーションエディ
    ターを使うことで、画面間
    の遷移を視覚的に実装でき
    ます。

    View Slide

  103. ナビゲーションエディター
    で設定することもできます
    が、それらは全て XML で
    定義されています。なので
    もちろん直接編集すること
    ができますし、直接編集し
    て XML を整理したりする
    こともあります。
    Navigation

    xmlns:app="http: //schemas.android.com/apk/res-auto"
    xmlns:tools="http: //schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/fragment_home">
    android:id="@+id/fragment_home"
    android:name="jp.wasabeef.navplayground.home.HomeFragment"
    tools:layout="@layout/fragment_home">
    android:id="@+id/to_dashboard"
    app:destination="@id/fragment_dashboard" />

    android:id="@+id/fragment_dashboard"
    android:name="jp.wasabeef.navplayground.dashboard.DashboardFragment"
    tools:layout="@layout/fragment_dashboard" >
    android:name="id"
    app:argType="string" />


    View Slide

  104. Navigation
    画面間のデータを型安全に渡せる
    Bottom Navigation の画面遷移にも対応
    デープリンクの実装

    View Slide

  105. ViewModel
    + LiveData
    ※ AACͷҰ෦

    View Slide

  106. ViewModel + LiveData Activity/Fragment
    Repository
    Local Source
    Room
    Remote Data Source
    Retrofit/okHttp
    https://developer.android.com/jetpack/docs/guide
    これらを使うことによりライ
    フサイクルを意識した方法
    で UI 関連のデータを保存お
    よび管理できます。
    ViewModel
    LiveData

    View Slide

  107. アプリの画面回転時に破棄
    されないようデータを保持
    複数の Fragment 間での
    データ共有
    ライフサイクルに紐づいた
    Observable の一種
    ViewModel LiveData

    View Slide

  108. Activity および ViewModel
    はそれぞれ異なるライフサイ
    クルになっており、
    ViewModel のほうが長く生存
    するため、Activity の画面回
    転でもデータを保持してくれ
    ます。
    ViewModel

    View Slide

  109. これはかなりシンプルな
    MyViewModel というクラ
    スを作りました。その
    ViewModel のデータを
    LiveData として扱うのが一
    般的です。なのでこの二つは
    セットに説明されることが多
    くなっています。
    ViewModel + LiveData
    class MyViewModel(private val repo: UserRepo) : ViewModel() {
    private val _user = MutableLiveData()
    val user: LiveData get() = _user
    fun getUser() = repo.getUser()
    }
    class MyActivity : AppCompatActivity() {
    private val model: MyViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    model.getUser().observe(viewLifecycleOwner) {
    // update UI
    }
    }
    }
    ViewModel + LiveData
    Activity

    View Slide

  110. ViewModel を使う側の
    Activity では、その
    Activity のライフサイク
    ルを渡すことで、画面が
    破棄された後などには
    データを受診しないよう
    にすることができます。
    class MyViewModel(private val repo: UserRepo) : ViewModel() {
    private val _user = MutableLiveData()
    val user: LiveData get() = _user
    fun getUser() = repo.getUser()
    }
    class MyActivity : AppCompatActivity() {
    private val model: MyViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    model.getUser().observe(viewLifecycleOwner) {
    // update UI
    }
    }
    }
    ViewModel + LiveData
    Activity
    ViewModel + LiveData

    View Slide

  111. 実際には ViewModel の
    なかで、Coroutines や
    Flows を使って非同期処
    理、ストリーム化したり
    します。
    ViewModel + LiveData
    class MyViewModel(private val repo: UserRepo) : ViewModel() {
    private val _user = MutableLiveData()
    val user: LiveData get() = _user
    fun getUser() = repo.getUser()
    }
    class MyActivity : AppCompatActivity() {
    private val model: MyViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    model.getUser().observe(viewLifecycleOwner) {
    // update UI
    }
    }
    }
    ViewModel + LiveData
    Activity

    View Slide

  112. Jetpack Compose

    View Slide

  113. Android の UI は現在も XML で構築
    していくのが一般的ですが、今年の
    Google I/O で突然発表された宣言型
    の UI ツールキットになります。既存
    との互換性も保つよう作られており、
    2020年を目標にベータ版が公開され
    る予定です。現在でも最新の
    Android Studio を使うことで試すこ
    とができます。書き方は Flutter っぽ
    い。
    Jetpack Compose
    @Preview
    fun HomeScreen(openDrawer: () -> Unit) {
    val postTop = posts[3]
    val postsSimple = posts.subList(0, 2)
    val postsPopular = posts.subList(2, 7)
    val postsHistory = posts.subList(7, 10)
    Column {
    TopAppBar(
    title = { Text(text = "Jetnews") },
    navigationIcon = {
    VectorImageButton(R.drawable.ic_jetnews_logo) {
    openDrawer()
    }
    }
    )
    VerticalScroller(modifier = Flexible(1f)) {
    Column {
    HomeScreenTopSection(post = postTop)
    HomeScreenSimpleSection(posts = postsSimple)
    HomeScreenPopularSection(posts = postsPopular)
    HomeScreenHistorySection(posts = postsHistory)
    }
    }
    }
    }

    View Slide

  114. Jetpack Compose
    @Preview
    fun HomeScreen(openDrawer: () -> Unit) {
    val postTop = posts[3]
    val postsSimple = posts.subList(0, 2)
    val postsPopular = posts.subList(2, 7)
    val postsHistory = posts.subList(7, 10)
    Column {
    TopAppBar(
    title = { Text(text = "Jetnews") },
    navigationIcon = {
    VectorImageButton(R.drawable.ic_jetnews_logo) {
    openDrawer()
    }
    }
    )
    VerticalScroller(modifier = Flexible(1f)) {
    Column {
    HomeScreenTopSection(post = postTop)
    HomeScreenSimpleSection(posts = postsSimple)
    HomeScreenPopularSection(posts = postsPopular)
    HomeScreenHistorySection(posts = postsHistory)
    }
    }
    }
    }

    View Slide

  115. Networking

    View Slide

  116. Square 社製でデファクトスタン
    ダードになっています。Android
    5.0 以上が最低動作バージョンに
    なっており、JSON, Protobuf,
    XML などにも対応 していてとて
    も使くなっています。
    Retrofit (+ OkHttp)
    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
    }

    View Slide

  117. Dependency Injection
    (DI)

    View Slide

  118. Dagger Koin Kodein
    Java
    Google 製
    慣れるまで難しい
    利用実績が多い
    高速
    JVM, Android
    Kotlin
    軽量で簡単
    DSL
    Kotlin
    簡単
    マルチプラットフォーム
    対応 (JVM Android, JS, iOS)

    View Slide

  119. Dagger
    Java
    Google 製
    慣れるまで難しい
    利用実績が多い
    高速
    JVM, Android

    View Slide

  120. Firebase

    View Slide

  121. Firebase
    iOS、Android、ウェブ向けの
    包括的な開発プラットフォーム
    となります。Crashlytics、
    Authentication、Cloud
    Messaging、Test Lab など
    様々なプロダクトで採用実績が
    あります。

    View Slide

  122. Test Lab

    View Slide

  123. Firebase Test Lab
    アプリをアップロードするだけ
    で、Google が管理する複数の実
    機及びエミュレータ上で同時に
    動作確認ができます。Android
    の Instrumentation テストにも
    対応していて CI から実行するこ
    とも可能となっています。iOS
    の XCTest にも対応していま
    す。

    View Slide

  124. Firebase Test Lab
    Firebase Console からテストの
    実行状況が確認できます。
    赤い▲がクラッシュした場合の表
    示です。

    View Slide

  125. Firebase Test Lab
    アプリがクラッシュした場合には
    スタックトレースや Logcat を確
    認することができます。

    View Slide

  126. Firebase Test Lab
    テスト実行中の端末を終始、画面
    録画されて、CPU やメモリなどの
    グラフも確認できるようになって
    います。

    View Slide

  127. Firebase Test Lab
    画面録画だけではなく、動作中の
    スクリーンショットも確認するこ
    とができます。

    View Slide

  128. 2020年はどうなることやら。
    Conclusion
    twitter.com/wasabeef_jp
    wasabeef.jp
    github.com/wasabeef
    Photo by Annie Spratt on Unsplash

    View Slide