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

Android Day2

Avatar for Recruit Recruit
September 09, 2022

Android Day2

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

Avatar for Recruit

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