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

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

6dd0483f1353a4a359e92633cfd65c64?s=128

Daichi Furiya (Wasabeef)

December 14, 2019
Tweet

Transcript

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

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

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

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

  5. RetroLambda MVC VOLLEY JUICE ActionBarSherlock Timber

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

  7. DAGGER2 MVVM FLUX MVI Timber

  8. activity ads annotation appcompat arch asynclayoutinflater autofill benchmark biometric browser

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

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

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

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

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

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

    Jetpack に含まれるライブラリを並べてみると…
  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
  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
  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+ 個のライブラリ群
  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+ 個のライブラリ群
  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)
  20. Android 10

  21. Security Updates Smart Reply Dark Theme Privacy Controls Family Link

    Live Caption Sound Amplifier Location Controls Gesture Navigation Focus Mode Android 10 Highlights
  22. Location Controls

  23. Location Controls <manifest> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> </manifest>

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

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

  26. Foldable

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

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

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

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

  31. Android Studio 4.0

  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
  33. Motion Editor

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

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

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

  37. Multi Preview

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

  39. Live Layout Inspector

  40. Live Layout Inspector エミュレータなどでデバッ グしているアプリの View 構造を 3D に視覚化でき、 設定されているプロパティ

    値などの確認を迅速に行え るようになります。
  41. Flutter

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

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

    / Tetsuhiro Ueda
  44. Kotlin

  45. Kotlin 1.3.61 (2019.12.14)

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

  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
  48. 60% のアプリで利用(TOP 1000) Kotlin-first?

  49. Kotlin vs Java?

  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
  51. Android Java にはない Kotlin の機能 SAM 変換 拡張関数 データクラス Null-safety

    インライン関数 スマートキャスト Coroutines Flows etc..
  52. Kotlin Coroutines

  53. Android Threading Android マルチスレッドにおいての画面の更新はメインス レッドで実行する必要があり、API 通信などはメインスレッ ドで通信してはいけません。 また、Activity や Fragment

    が破棄された後にそれらのス レッドをキャンセルするためにライフサイクルを知っておく 必要もあります。
  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()
  55. RxJava 非同期処理用ではなくリア クティブプログラミングの ライブラリです。ライフサ イクルに紐づけることもで きます。RxJava の機能全 体を把握するのは難しく、 学習コストが高めです。 val

    observable = Observable.create<Bitmap> { 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) }
  56. Kotlin Coroutines 軽量スレッド キャンセルが簡単 失敗時のハンドリングが簡単 ライフサイクルへの紐付けが簡単 2019年が移行期 1.3.3

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

    } launch - Kotlin Coroutines
  58. val job = launch { println("Hello, Coroutines !!") } job.cancel()

    また、launch 関数は Job クラスを返します。この Job はコルーチンのライフ サイクルのハンドリングを 提供します。アクティブ状 態か完了しているかなどを 把握でき、キャンセルする こともできます。 Job - Kotlin Coroutines
  59. Job では Job 同士を階 層関係で管理することが できます。launch 関数 を呼ぶときに親にあた る Job を渡すことでそ

    れが可能となります。 val parentJob = Job() val job = launch(parentJob) { println("Hello, Coroutines !!") } parentJob.cancel() Job hierarchy - Kotlin Coroutines
  60. Job の階層関係を作るこ とで、親 Job をキャン セルした場合には、子 Job もキャンセルするこ とができます。 Job

    hierarchy - Kotlin Coroutines Parent Job Child Job A Child Job B Child Job C .cancel() .cancel() .cancel() .cancel()
  61. Job によってコルーチ ンのライフサイクルを ハンドリングすること ができますが、そのコ ルーチンは、どういう スコープで生存させる かを決めることができ ます。 CotoutineScope

    - Kotlin Coroutines val parentJob = Job() val job = launch(parentJob) { println("Hello, Coroutines !!") } parentJob.cancel()
  62. val scope = CoroutineScope(Job()) val job = scope.launch { println("Hello,

    Coroutines !!") } scope.cancel() launch 関数は全て CoroutineScope の中で 実行されます。これまで 省略していましたが、本 来はこのような形になっ ており。そのスコープ内 のコルーチンはキャンセ ルすることができます。 CotoutineScope - Kotlin Coroutines
  63. このスコープを Activity、Fragment や ViewModel に合わせ ることで、Android のラ イフサイクルに紐づける ことができます。 CotoutineScope

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

    を使用する ことができます。 CotoutineDispatcher - Kotlin Coroutines val scope = CoroutineScope(Job()) val job = scope.launch(Dispatchers.Default) { println("Hello, Coroutines !!") } scope.cancel()
  65. val scope = CoroutineScope(Job()) val job = scope.launch(Dispatchers.Main) { println("Hello,

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

    Coroutines !!") } scope.cancel() メインスレッドではな く、データベース、ファ イルの読み書きやネット ワーク通信をする場合に は IO を指定することで パフォーマンスも期待で きます。 CotoutineDispatcher - Kotlin Coroutines
  67. CoroutineScope を生 成するときに、スコープ のデフォルトスレッドを 指定したい場合などに は、+ でつなげること ができます。 val scope

    = CoroutineScope(Job() + Dispatchers.IO) val job = scope.launch { println("Hello, Coroutines !!") } scope.cancel() CotoutineDispatcher - Kotlin Coroutines
  68. Kotlin Flows

  69. Kotlin Flows RxJava と同様に Reactive streams specification Coroutines は One-shotで、Flows

    は Observers として使う RxJava に比べたらやれることが少ない RxJava よりもパフォーマンス向上のためシンプルな設計 受信するまで動作しない(コールドストリーム) 2020年が移行期??
  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) } }
  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) } }
  72. Kotlin/Native

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

  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)
  75. Kotlin Multiplatform

  76. Kotlin Multiplatform KotlinConf 2019 でも多く のセッションがありました が、iOS と Android でビジ

    ネスロジックを Kotlin で共 通化するなどの事例が出始 めています。 ※ iOS の UI が作れるものではありません。 Kotlin/LLVM Kotlin/JVM Kotlin/JVM Kotlin/JS Common code
  77. Architecture (MVVM)

  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 に 寄せて開発しているプロダ クトの事例もあります。
  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 には多く 存在します。
  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 には多く 存在します。
  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 には多く 存在します。
  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
  83. Jetpack

  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+ 個のライブラリ群
  85. Architecture UI Behavior Foundation Jetpack ボイラープレートコードの 手間省けて、下位互換性を 備えたアプリを簡単に作成 するためのライブラリで す。androidx.*

    パッケー ジで構成されています。
  86. Architecture UI Behavior Foundation Jetpack Data Binding Lifecycles LiveData Navigation

    Paging Room ViewModel WorkManager
  87. Architecture UI Behavior Foundation Jetpack Animation & Transitions Auto, TV

    & Wear Emoji Fragment Layout Pallets
  88. Architecture UI Behavior Foundation Jetpack Download Manager Media & Playback

    Permissions Notifications Sharing Slices
  89. Architecture UI Behavior Foundation Jetpack AppCompat Android KTX Multidex Test

  90. AppCompat ※ JetpackͷҰ෦

  91. AppCompat 必ず使うことになるライブラ リで Android アプリ開発で は、古い OS の対応などがと ても困難でありそれらの問題 を吸収してくれるサポートラ

    イブラリとなります。 import androidx.appcompat.app.AppCompatActivity public class AppCompatActivity extends FragmentActivity implements ... { }
  92. Android KTX ※ JetpackͷҰ෦

  93. Android KTX Jetpack に含まれる Kotlin の拡張機能セッ ト。コードをシンプルにす ることができます。 view.viewTreeObserver.addOnPreDrawListener( object

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

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

  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
  97. Lifecycle ※ AACͷҰ෦

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

  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
  100. Navigation ※ AACͷҰ෦

  101. Navigation Repository ViewModel LiveData Local Source Room Remote Data Source

    Retrofit/okHttp https://developer.android.com/jetpack/docs/guide 単純なボタンクリックか ら、アプリバーやナビゲー ションドロワーなどの複雑 なパターンまで、さまざま なコンテンツ間を移動する を実装するに便利です。 Activity/Fragment
  102. Navigation Android Studio にあるで きるナビゲーションエディ ターを使うことで、画面間 の遷移を視覚的に実装でき ます。

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

    を整理したりする こともあります。 Navigation <?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http: //schemas.android.com/apk/res/android" 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"> <fragment android:id="@+id/fragment_home" android:name="jp.wasabeef.navplayground.home.HomeFragment" tools:layout="@layout/fragment_home"> <action android:id="@+id/to_dashboard" app:destination="@id/fragment_dashboard" /> </fragment> <fragment android:id="@+id/fragment_dashboard" android:name="jp.wasabeef.navplayground.dashboard.DashboardFragment" tools:layout="@layout/fragment_dashboard" > <argument android:name="id" app:argType="string" /> </fragment> </navigation>
  104. Navigation 画面間のデータを型安全に渡せる Bottom Navigation の画面遷移にも対応 デープリンクの実装

  105. ViewModel + LiveData ※ AACͷҰ෦

  106. ViewModel + LiveData Activity/Fragment Repository Local Source Room Remote Data

    Source Retrofit/okHttp https://developer.android.com/jetpack/docs/guide これらを使うことによりライ フサイクルを意識した方法 で UI 関連のデータを保存お よび管理できます。 ViewModel LiveData
  107. アプリの画面回転時に破棄 されないようデータを保持 複数の Fragment 間での データ共有 ライフサイクルに紐づいた Observable の一種 ViewModel

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

    ます。 ViewModel
  109. これはかなりシンプルな MyViewModel というクラ スを作りました。その ViewModel のデータを LiveData として扱うのが一 般的です。なのでこの二つは セットに説明されることが多

    くなっています。 ViewModel + LiveData class MyViewModel(private val repo: UserRepo) : ViewModel() { private val _user = MutableLiveData<User>() val user: LiveData<User> 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
  110. ViewModel を使う側の Activity では、その Activity のライフサイク ルを渡すことで、画面が 破棄された後などには データを受診しないよう にすることができます。

    class MyViewModel(private val repo: UserRepo) : ViewModel() { private val _user = MutableLiveData<User>() val user: LiveData<User> 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
  111. 実際には ViewModel の なかで、Coroutines や Flows を使って非同期処 理、ストリーム化したり します。 ViewModel

    + LiveData class MyViewModel(private val repo: UserRepo) : ViewModel() { private val _user = MutableLiveData<User>() val user: LiveData<User> 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
  112. Jetpack Compose

  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) } } } }
  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) } } } }
  115. Networking

  116. Square 社製でデファクトスタン ダードになっています。Android 5.0 以上が最低動作バージョンに なっており、JSON, Protobuf, XML などにも対応 していてとて

    も使くなっています。 Retrofit (+ OkHttp) 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 }
  117. Dependency Injection (DI)

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

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

  120. Firebase

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

  122. Test Lab

  123. Firebase Test Lab アプリをアップロードするだけ で、Google が管理する複数の実 機及びエミュレータ上で同時に 動作確認ができます。Android の Instrumentation

    テストにも 対応していて CI から実行するこ とも可能となっています。iOS の XCTest にも対応していま す。
  124. Firebase Test Lab Firebase Console からテストの 実行状況が確認できます。 赤い▲がクラッシュした場合の表 示です。

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

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

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

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

    Unsplash