Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Android Day2
Search
Recruit
PRO
September 09, 2022
Technology
1
1.1k
Android Day2
2022年度リクルート エンジニアコース新人研修の講義資料です
Recruit
PRO
September 09, 2022
Tweet
Share
More Decks by Recruit
See All by Recruit
Azure Functions HTTPトリガーにおけるタイムアウトでハマったこと
recruitengineers
PRO
2
150
実務につなげる数理最適化
recruitengineers
PRO
6
690
うちにも入れたいDatadog
recruitengineers
PRO
2
380
リクルートのデータ基盤 Crois 年3倍成長!1日40,000コンテナの実行を支える AWS 活用とプラットフォームエンジニアリング
recruitengineers
PRO
2
330
Splunk Enterpriseで S3のデータを直接検索してみた!
recruitengineers
PRO
2
150
Looker APIを使い倒す ユーザーフィードバックを基にした継続的改善サイクル
recruitengineers
PRO
3
57
Kaggleふりかえり会〜LLM 20 Questions & ISIC 2024
recruitengineers
PRO
2
230
Balancing Revenue Goals and Off-Policy Evaluation Performance in Coupon Allocation
recruitengineers
PRO
2
51
Flutterによる 効率的なAndroid・iOS・Webアプリケーション開発の事例
recruitengineers
PRO
0
390
Other Decks in Technology
See All in Technology
コンテナセキュリティのためのLandlock入門
nullpo_head
2
320
10個のフィルタをAXI4-Streamでつなげてみた
marsee101
0
160
Oracle Cloudの生成AIサービスって実際どこまで使えるの? エンジニア目線で試してみた
minorun365
PRO
4
280
プロダクト開発を加速させるためのQA文化の築き方 / How to build QA culture to accelerate product development
mii3king
1
260
1等無人航空機操縦士一発試験 合格までの道のり ドローンミートアップ@大阪 2024/12/18
excdinc
0
150
権威ドキュメントで振り返る2024 #年忘れセキュリティ2024
hirotomotaguchi
2
730
re:Invent 2024 Innovation Talks(NET201)で語られた大切なこと
shotashiratori
0
300
MLOps の現場から
asei
6
630
NilAway による静的解析で「10 億ドル」を節約する #kyotogo / Kyoto Go 56th
ytaka23
3
370
第3回Snowflake女子会_LT登壇資料(合成データ)_Taro_CCCMK
tarotaro0129
0
180
サーバレスアプリ開発者向けアップデートをキャッチアップしてきた #AWSreInvent #regrowth_fuk
drumnistnakano
0
190
AIのコンプラは何故しんどい?
shujisado
1
190
Featured
See All Featured
Facilitating Awesome Meetings
lara
50
6.1k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
290
Optimizing for Happiness
mojombo
376
70k
Designing for Performance
lara
604
68k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Code Review Best Practice
trishagee
65
17k
Mobile First: as difficult as doing things right
swwweet
222
9k
The Language of Interfaces
destraynor
154
24k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
How To Stay Up To Date on Web Technology
chriscoyier
789
250k
Transcript
BootCamp2022 Android講習 Recruit BootCamp 2022 Android. 1
クロージング Recruit BootCamp 2022 Android. 2
まとめ Androidチーム配属のときに摩擦なく開発を始められる前提知識を身につける。 Kotlinの基礎 後続のコンテンツ(エンハンス体験)をする際に「知らない・読めない」を極力なくする程度の 必要最低限レベルを学習しました。 Androidの基礎 IDEの使い方や、新しいソースコードの追加、ビルド設定、AndroidManifestなど、Android 特有の知っておくべきことを満遍なく学びました。 Androidエンハンス体験 「実際の案件っぽい」テーマのエンハンスをしてみることによって、Android開発の基礎がわ
かり、経験を通してAndroid開発の初歩を学びました。 Recruit BootCamp 2022 Android. 3
もっと知る 公式のリソース 公式の情報がたくさん存在する。 Developer's Guide 公式のガイドに技術の紹介やコードサンプルがたくさん Cources Android開発のトレーニングツール(チュートリアル)が提供されている Kotlin Kotlin
リポジトリ サンプルAppリポジトリ Sunflower Now in Android Recruit BootCamp 2022 Android. 4
興味がある人はこういったところも見てみましょう UI 1, 2, 3, 4 アーキテクチャ 1, 2, 3,
4 テスト 1, 2, 3 アプリケーションコンポーネント 1, 2, 3 JavaとKotlinの併用 12, 3, 4 ソースコードに触れる 1, 2 コードサンプルを見る 1 Recruit BootCamp 2022 Android. 5
最新情報にアクセス Androidの最新News 公式のNews/Blog Android dagashi Android開発の周辺情報のアップデートをまとめてくれている。 Issue Tracker OS関連のIssueがまとめられている Google
IO Recruit BootCamp 2022 Android. 6
お疲れ様でした。 Recruit BootCamp 2022 Android. 7
Appendix Recruit BootCamp 2022 Android. 8
Androidのはなし Recruit BootCamp 2022 Android. 9
Androidがどう動いているのか ネイティブアプリならではの理解をしてみる。 このお話は「小噺」みたいなものです。こんなことを知らなくてもよしなにやってくれるの が最近のAndroid(だと思ってる)なのですが、知っている方が理解が捗ることもあります。 Android開発で困ること(困ったこと)の一つに、『用語多すぎ』というものがありました。用 語の意味に迫るためにも少し深く潜ってみましょう。 Recruit BootCamp 2022 Android.
10
Why Android Webをやるならブラウザのことや、AWSやGCPのこと(場合によってはオンプレのサーバー について)を知らないといけないように、Androidを触るなら、Androidのことを知らないと今 後学ぶお作法の意味がわからないことがあります。どうやってAndroidのアプリが動いている のかというのを少しだけ深ぼってみましょう。 この内容をざっくりとでも知っておくことで、現場で起こる「謎のクラッシュ」への調査が 捗ったり、「(直接的に)危険なコード」の臭いを察知することができたりするかなと考えてい ます。 参考:
「Androidを支える技術Ⅰ,Ⅱ」「Inside Android」 Recruit BootCamp 2022 Android. 11
Androidでのプロセスと アプリの起動 まずはOSの起動直後に、initを経て、さ まざまなデーモンとruntime、Zygoteと いうプロセスを発行する。 runtime process この中には、 Surface Flinger
とい う子プロセスが存在していて、このプロ セスが画面の描画を司っている。 Recruit BootCamp 2022 Android. 12
Zygote Zygoteが細胞分裂のように新しいプロセスを発行しながらアプリケーションを実行してい く。Android上で動くアプリケーションを実行するプロセスの親プロセスはここにあたる。 Activityの発行はSystemManagerの下にいるActivityManager Threadから発行されるので、 アプリケーションでのクラッシュ調査などで遡ろうとしても、Zygoteまでしか遡れない。新 しいプロセスを発行する際は、このZygoteが親プロセスになる。 Recruit BootCamp 2022
Android. 13
Activityの起動 Launcherからアプリの起動が走った場合、Zygoteがプロセスを生成する。 プロセスが作られると、 ActivityThread.java の main() が呼ばれる。 この中で、MainLooperが設定されている。 https://android.googlesource.com/platform/frameworks/base/+/master/core/java/and roid/app/ActivityThread.java#7834
その中で、attach()が呼ばれて、apkが呼び出される。その先の実装を追いかけていくと、同 クラスの performLaunchActivity() が呼ばれ、 Activity.java の performCreate() を 呼び、それがそれぞれのアプリのMainActivityの onCreate を呼ぶことになる。 Recruit BootCamp 2022 Android. 14
『ビルド』で何が起きているか Androidアプリをビルドするとは、 『ソースコード』と『リソース、アセット』をコンパイルしてパッケージ化すること である。 ビルドされた後は、 .apk あるいは .aab というファイル形式のものが出力される。 エミュレータでは、実行ボタンを押すことで、『アプリのビルド』『エミュレータへのイン
ストール』『実行』までを一連の流れで実施してくれている。 Recruit BootCamp 2022 Android. 15
ビルドプロセス 図からもわかる通りビルドでは、 ソースコード リソース AIDL Depemdencies が入力として必要である。 参考資料(画像の引用元) https://developer.android.com/st udio/build?hl=ja
Recruit BootCamp 2022 Android. 16
入力を元に、コンパイラがよしなにDEXファイル(Dalvik Executable File/つまりバイトコー ド)とコンパイルされたリソースを出力し、Flavorに応じたAPK(Android Application Package)を出力する。 実際に、APKの内部を見てみよう。 Device File Explorer
から、 /data/app/{ }/com.example.mygithubapp/base.apk を覗く。 - classes{0}.dex // バイトコード群 - res // コンパイルされたリソース群 - asset //asset 群 から成っているのがわかる。 dex ファイルからは、 Show Bytecode でバイトコードも見ることができる。 Recruit BootCamp 2022 Android. 17
Gradle 実際のビルドはGradleが実施している。 Gradleは、ほぼすべてのタイプのソフトウェアを構築するのに十分な柔軟性があるように設 計されたオープンソースのビルド自動化ツールである。(下記ページより) Gradle https://gradle.org https://docs.gradle.org/current/userguide/what_is_gradle.html 現在は、Kotlin Script(build.gradle.kts)かGroovy(build.gradle)の二通りの方法でビルド設定を 記述することができる。プログラマブルにビルド設定を記述できるが、ここではAndroidにお
いて必要な部分だけ抜き出して説明した。 参考 build.gradleの説明 Recruit BootCamp 2022 Android. 18
Contextの話 実装をしていると、いろいろなところで引数として Context を渡している。 ContextはActivityやApplicationのスーパークラスとして存在する。 アプリケーション環境に関するグローバルな情報を提供するインターフェース。Androidのシ ステムが実装を提供する抽象クラス。アプリケーション固有のリソースやクラスへのアクセ スや、アクティビティの起動、インテントのブロードキャストや受信など、アプリケーショ ンレベルの操作のアップコールが可能。というのが説明。 参考
https://developer.android.com/reference/android/content/Context https://android.googlesource.com/platform/frameworks/base/+/master/core/java/and roid/content/Context.java Recruit BootCamp 2022 Android. 19
このContext自体はアプリケーションの稼働中の状態を持つということはなく、あくまでリソ ースへのアクセスや自身のメタ情報へのアクセス、他のActivityの起動のためなどに使われ る。 引数として要求されることが多く、意識してContext内の要素にアクセスすることは多くな い。 より具体的な使用シーンとしては下記などである。 1. リソースやアセットなどのファイルを読み込むとき 2. DB/SharedPreferenceなどのデータを読み書きするとき
3. 他のActivityを起動するとき 4. AlermManagerでローカル通知を受信するとき Recruit BootCamp 2022 Android. 20
Application ContextとActivity Contextの違いと注意 ApplicationもActivityもそのSuper ClassにContextとContextWrapperを持っている。 それぞれ、 // Application Context applicationContext
(Context!) // Activity Context context (Context?) requireContext() (Context) などで取得ができるが、若干の違いがある。 Activity ContextはActivityが破棄されるごとに消滅するのに対し、Application Contextは Activityが破棄されても残り続ける。従って、アプリ実行中であればApplication Contextが nullになることはないので、Non-null型で返すことができる。 一方で、Activity ContextはActivityと共に破棄されるので、nullになることがありうる。 Recruit BootCamp 2022 Android. 21
ここで、Contextを破棄してくれる役割を果たすのが、ガベージコレクションなのだが、参照 が残っているContextがあると、期待通り処理してくれずメモリリークになる危険性がある。 Activityに紐づくContextはその中からの参照のみにすることを意識しておく必要がある。例 えば、シングルトンで運用されている箇所でContextを用いるときはActivityに紐づくContext を渡してしまうとインスタンスが残り続けるため、その参照先も残り続けメモリリークの一 因になりうる。 Recruit BootCamp 2022 Android.
22
ProcessとThread Processについて Processは各アプリケーションに対して立てられる。 adb コマンドが使える状態であれば、 $ adb shell ps で実行中のプロセスを見ることができる。
Recruit BootCamp 2022 Android. 23
$ adb shell ps -ef UID PID PPID C STIME
TTY TIME CMD root 1 0 0 14:09:28 ? 00:00:01 init second_stage ... root 20930 1 0 08:32:22 ? 00:00:11 zygote64 ... u0_a155 19425 20930 16 18:22:49 ? 00:00:00 com.example.mygithubapp initのあと、zygote64が起動して、mygithubappがzygote64をparent PIDにして起動してい る。実行中のプロセスの中で、mygithubappはこのプロセスのみである。 プロセスについて https://developer.android.com/guide/components/processes-and- threads?hl=ja#Processes 但し、複数のプロセスを起動して処理をすることも可能である。 その際は、プロセス間通信(IPC)を利用することになる。 参考:https://developer.android.com/guide/components/services?hl=ja Recruit BootCamp 2022 Android. 24
Threadについて 立ち上がっているThreadもadbコマンドで見ることができる。 $ adb shell ps -T 19425 USER PID
TID PPID VSZ RSS WCHAN ADDR S CMD u0_a155 19425 19425 20930 13709528 140096 do_epoll_wait 0 S ple.mygithubapp u0_a155 19425 19434 20930 13709528 140096 do_sigtimedwait 0 S Signal Catcher u0_a155 19425 19435 20930 13709528 140096 pipe_read 0 S perfetto_hprof_ u0_a155 19425 19436 20930 13709528 140096 do_sys_poll 0 S ADB-JDWP Connec u0_a155 19425 19437 20930 13709528 140096 futex_wait_queue_me 0 S Jit thread pool u0_a155 19425 19438 20930 13709528 140096 futex_wait_queue_me 0 S HeapTaskDaemon u0_a155 19425 19439 20930 13709528 140096 futex_wait_queue_me 0 S ReferenceQueueD u0_a155 19425 19440 20930 13709528 140096 futex_wait_queue_me 0 S FinalizerDaemon u0_a155 19425 19441 20930 13709528 140096 futex_wait_queue_me 0 S FinalizerWatchd u0_a155 19425 19442 20930 13709528 140096 binder_thread_read 0 S Binder:19425_1 u0_a155 19425 19443 20930 13709528 140096 binder_thread_read 0 S Binder:19425_2 u0_a155 19425 19444 20930 13709528 140096 binder_thread_read 0 S Binder:19425_3 u0_a155 19425 19445 20930 13709528 140096 futex_wait_queue_me 0 S Profile Saver u0_a155 19425 19446 20930 13709528 140096 do_epoll_wait 0 S RenderThread 一番上が、 com.sample.mygithubapp でMainThreadである。 Recruit BootCamp 2022 Android. 25
このように複数のThreadが一つのプロセスに対して存在する。 Main Threadは主にUIの描画に使われる。処理が重たい動作をこのThreadで実行すると、UI の描画に時間がかかることになる。ユーザ目線ではアプリが停止したようにも見えるので、 このThreadが数秒ロックされると『アプリケーションが応答しません』というダイアログが 表示される仕様になっている。 時間のかかるファイルIOやAPIアクセスは別のThreadをたてて実装する必要がある。 下記の参考ページではAsyncTaskが紹介されているが、これは現在ではdeprecateになってお り、最近はKotlin Coroutinesの利用が推奨されている。
参考 https://developer.android.com/guide/components/processes-and-threads? hl=ja#Threads Recruit BootCamp 2022 Android. 26
Kotlin Coroutines Threadを分けて実行する代わりに、『中断』をサポートすることで非同期処理を実現する技 術。 CoroutineContextというContextの中に、実行したいJobとDispatcherを持っており、この DispatherにはそのJobを実行させたいThreadを選択する役割があるので、実際にはThreadセ ーフな実装をする上でも役に立つ。 コルーチンガイド https://kotlinlang.org/docs/coroutines-guide.html Recruit
BootCamp 2022 Android. 27
LooperとHandler UIに関する処理はMainThreadでしか行うことができない。但し、メインスレッド以外からも UIに関する処理をしたい時がある。例えば、通信処理に失敗した場合に『通信に失敗しまし た』というダイアログ(AndroidではToast)を描画したいという要望があったとする。 通信に関する処理は基本的にMainThread外で行っているので、原則通信の成否はMainThread は知らないことになる。 こういったときに、LooperとHandlerについて理解が必要になる。 Recruit BootCamp 2022
Android. 28
Looperの仕事 Looperは内部にMessageQueueのインスタンスを持っており、Queueを一つずつ処理してい くクラスである。MessageQueueの中には、『いつ・何を』処理するのかを示すmessageが 含まれており、LooperはMessageQueueが空になるまでloop()を回し続ける。特に、 MainThreadはLooperが既に実装されており、UI要素の描画などはこれを用いて行われてい る。 https://developer.android.com/reference/android/os/Looper https://android.googlesource.com/platform/frameworks/base/+/master/core/java/and roid/os/Looper.java Recruit
BootCamp 2022 Android. 29
Handlerの仕事 HandlerはこのMessageQueueに仕事を渡す役割を果たす。 Threadに対してLooperを実装し、LooperはThreadのMessageQueueを処理するが、この HandlerはLooper(実質はThread)を指定してインスタンスを生成する。(特に指定がない場合 はHandlerとLooperは同一Threadになる) このHandlerのインスタンスに対してさらに別のThreadからRunnableのPostがあった場合、 Handlerのインスタンス自身とRunnableをMessageに詰めてQueueに入れる。そして、 Messageを実行する場合は、Handlerのインスタンスが持っているLooperが存在するThread で処理が行われることになるので、Threadを跨いだ処理が実現できる。 Recruit
BootCamp 2022 Android. 30
例えば、下記のような実装だと、 MainThreadでのLooperを引数にHandlerのインスタンスを生成する。 新しいThreadを発行する。 MainThread以外ではToastを表示できないので、handlerにpostする。 handlerが持っているlooperが5000ms後にToast描画の処理をする。 fun onClick() { val handler
= Handler(Looper.getMainLooper()) // ① Thread(Runnable { // ② val statement = "HelloWorld" handler.postDelayed({ Toast.makeText(context, statement,Toast.LENGTH_LONG).show() // ③ },5000) // ④ }).start() } という流れで処理が実現する。 Recruit BootCamp 2022 Android. 31
最後に流れの整理 MainThreadはLooperを既に持っていて、Looper.getMainLooper()でそのインスタンスを 取得できる。 Handlerはインスタンス生成時に必ずLooperのインスタンスが必要。 handler.post(run: Runnable) をすると、messageにhandler自身と引数のrunを詰め 込んでMainThreadのMessageQueueに入れる。 MainThreadのLooperがMessageQueueの中身を取り出し、Messageに含まれるhandler でrunを実行する。
Recruit BootCamp 2022 Android. 32
クラッシュ調査の話 開発側が意図していないクラッシュが頻発すると障害になります。 障害は価値損失につながるので、早急に止血・対応をする必要があります。 過去の事例を見ながら、クラッシュ対応に触れてみましょう。 Recruit BootCamp 2022 Android. 33
クラッシュ対応の流れ クラッシュ検知 原因調査 対応策検討 暫定対応実施→リリース 恒久対応実施→リリース ※ 別途、障害管理チームへの連携や振り返りが必要。 Recruit BootCamp
2022 Android. 34
クラッシュ検知 Androidアプリのクラッシュ検知には、 1. Firebase Crashlytics 2. Android vitals が便利。ユーザのクラッシュログや非重大ログをリアルタイムで蓄積してる。多数の新規ク ラッシュが発生したり、直近リリースの影響箇所でのクラッシュが発生したりしていると、
原因調査のフェイズに移ることになる。 モニタリング環境の整備と、それを定期的に確認する人が必要だが、この環境を作ること で、いち早く異常に気づくことができる。 Recruit BootCamp 2022 Android. 35
原因調査 調査対象のクラッシュがあれば、どこでクラッシュが起きているのかを確認する。クラッシ ュログが前述のサービスから見られるので、原因がどこにあるのかを特定する。実装由来で あれば、その発生条件と発生理由まで調査をし、OS/端末由来であれば、どんな条件下でおき るのかの調査まで行う。ユーザの行動がわからず、どういった条件下で発生しているかわか らない問題の場合は実装にログを仕込んでより詳細な状態を確認したりする。 調査をした上で、影響の大きな問題であれば、 対応策検討以降のフェーズに移る。 Recruit BootCamp
2022 Android. 36
対応策検討 クラッシュの原因がわかれば対応策の検討を実施する。 急を要するような状態であれば、 暫定対応での止血が必要になる。 小さい工数でまずは異常な状態を食い止め、のちに 恒久対応で対応を完了させるという流 れをとる。 Recruit BootCamp 2022
Android. 37
ActivityとFragment ActivityもFragmentも画面全体を構成するViewを構成することができる。どう違いがあっ て、どう使い分けるべきなのか。 Recruit BootCamp 2022 Android. 38
Activity Activityは最も古くから存在するViewの一つであり、古のAndroidでは全ての画面を異なる Activityで記述し、その間の遷移にはIntentを使って実施していた。 すべてアプリに含まれるActivityはAndroidManifestに記述する必要があり、Activityは他の View要素に依存することはない。 Fragment FragmentはHoneycombから導入された『画面の断片』を表現するViewである。Fragmentは Activityの上に乗っている必要があり、Activityのライフサイクルに依存する。ActivityがGC に処理されるタイミングでFragmentもGCされる。画面遷移はActivityに比べて簡単に管理が でき、要素もActivityに比べて柔軟で軽量である。
Recruit BootCamp 2022 Android. 39
ActivityとFragmentの使い分け 通知からの起動やURLスキームでの起動などの可能性があるページや、一連のナビゲーショ ンを持っているベースの画面・機能についてそれぞれひとまとまりのActivityに実装すること になる。AndroidManifestから起動種別や、起動時のタスク管理の指定ができるからである。 一方で、タブによるページングを実装したり、情報を持ちながら画面遷移をしたりする挙動 については、画面の一要素に適用することができる、軽量で柔軟なFragmentを用いるのが便 利だろう。 Recruit BootCamp 2022
Android. 40
永続DBとSharedPreference ViewModelのライフサイクルは紐づいているFragmentより少し長い。しかしながら、 Fragmentが消失すると間もなくViewModel自体も消えるし、当然そこで持っていた一時デー タも消失する。ただ、アプリとしては永続的に情報を持っておきたいものもたくさんある。 通信をせず永続的に持っているためには、端末に書き込む必要があるので、アプリケーショ ンのライフサイクルによらないスペースに書き込む必要がある。大きくその方法は2種類存 在している。 1. SQLiteによるデータベース 2.
SharedPreference である。 Recruit BootCamp 2022 Android. 41
アプリから端末に保存しているデータはどこで格納しているか。 Emulatorでは Device File Explorer で端末の内部のDir構造を見ることができる。(ADBコ マンドでターミナルから入ることもできる) 実際に見てみよう。 /data/user/0/com.google.android.youtube を覗いてみると、
- cache - code_cache - databases - files - no_backup - shared_prefs となっていることがわかる。 Recruit BootCamp 2022 Android. 42
どこに何がいるのか databases この直下にSQLiteベースの永続DB層が存在する。 files 端末に保存しようとしているデータは基本的にここに含まれる。 スコープは該当アプリ内部に限られるので、ほかのアプリから参照したいようなファイルは ここに保存しない。(画像や動画ファイルなど) 詳細 https://developer.android.com/training/data-storage/app-specific shared_prefs
Key-Value形式で比較的小さい情報を保持する。 Recruit BootCamp 2022 Android. 43
Javaと共存しているために起こること 2019年にGoogleがKotlinを公式にAndroid開発の推奨言語に選定した。 KotlinはJavaよりもさまざまな面で安全に開発ができる。そのため、新しくAndroid Appの開 発をするなら基本的にはKotlinを採用するべきだろう。しかし、Android OSを積んだ端末が 日本ではじめて発売されたのは2009年である。KotlinでAndroid開発ができるようになった のは2012年。そもそも使えなかったのが3年、公式推奨まで10年かかっている。タウンワー クは2011年にアプリ公開されており、そもそもKotlinが使えなかった時期であったため未だに JavaとKotlinが併用されている。同様に、この世に存在する多くのAndroid
AppがJavaを含ん だソースコードで動いていることが想像に難くない。(尤も、大規模なリファクタリングによ りKotlin化されているプロダクトも存在するのだろう) Recruit BootCamp 2022 Android. 44
ライブラリやフレームワークがJavaで書かれている ライブラリやフレームワークにはまだたくさんのJavaコードが残っている。実装を遡ってみ ると、Androidの主要部分はかなりの部分がJavaで書かれている。なので、あらゆるところで Javaとの接点を意識する必要がある。 ぜひ、公式のドキュメントを読みにいきましょう。 参考:https://developer.android.com/kotlin/interop?hl=ja 参考:https://developer.android.com/kotlin/faq?hl=ja Recruit BootCamp 2022
Android. 45