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

Android Day2

Recruit
September 09, 2022

Android Day2

2022年度リクルート エンジニアコース新人研修の講義資料です

Recruit

September 09, 2022
Tweet

More Decks by Recruit

Other Decks in Technology

Transcript

  1. 興味がある人はこういったところも見てみましょう 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
  2. 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
  3. 入力を元に、コンパイラがよしなに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
  4. 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
  5. $ 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
  6. 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
  7. 例えば、下記のような実装だと、 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
  8. クラッシュ検知 Androidアプリのクラッシュ検知には、 1. Firebase Crashlytics 2. Android vitals が便利。ユーザのクラッシュログや非重大ログをリアルタイムで蓄積してる。多数の新規ク ラッシュが発生したり、直近リリースの影響箇所でのクラッシュが発生したりしていると、

    原因調査のフェイズに移ることになる。 モニタリング環境の整備と、それを定期的に確認する人が必要だが、この環境を作ること で、いち早く異常に気づくことができる。 Recruit BootCamp 2022 Android. 35