［Android］ dumpsys を使って起動している Activity を確認する

# はじめに

Android で起動している Activity を確認するには Android 上で動作する dumpsys コマンドを利用します。dumpsys コマンドを利用すればシステム・サービスから情報を取得でき、起動している Activity の状態などを取得できます。ちなみにどのシステムサービスから情報が取得できるのかは `adb shell dumpsys -l` で確認できます。情報が取得できるシステムサービスはたくさんあります、今回はこの中の activity から情報を取得して起動している Activity を確認します。

```shell
adb shell dumpsys -l
Currently running services:
  DockObserver
  GuiExtService
  SurfaceFlinger
  accessibility
  account
  activity
  alarm
  android.security.keystore
  anrmanager
  appops
  appwidget
  audio
  autofill
  backup
  battery
  batteryproperties
  batterystats
  binder_calls_stats
  bluetooth_manager
  carrier_config
  clipboard
  commontime_management
  companiondevice
  connectivity
  connmetrics
  consumer_ir
  content
  contexthub
  country_detector
  cpuinfo
  crossprofileapps
  csdk
  dbinfo
  device_identifiers
  device_policy
  deviceidle
  devicestoragemonitor
  diskstats
  display
  dreams
  drm.drmManager
  dropbox
  ethernet
  gfxinfo
  gpu
  graphicsstats
  hardware_properties
  imms
  imtksms
  input
  input_method
  iphonesubinfo
  iphonesubinfoEx
  ipsec
  isms
  isub
  isubstub
  jobscheduler
  launcherapps
  location
  lock_settings
  media.audio_flinger
  media.audio_policy
  media.camera
  media.camera.proxy
  media.drm
  media.extractor
  media.metrics
  media.player
  media.resource_manager
  media.sound_trigger_hw
  media_projection
  media_resource_monitor
  media_router
  media_session
  meminfo
  midi
  mount
  mtk_telecom
  mtkconnmetrics
  mtksimphonebook
  netd_listener
  netpolicy
  netstats
  network_management
  network_score
  network_time_update_service
  network_watchlist
  notification
  oem_lock
  omadm_service
  otadexopt
  overlay
  package
  package_native
  permission
  persistent_data_block
  phone
  phoneEx
  pinner
  power
  power_hal_mgr_service
  print
  processinfo
  procstats
  recovery
  restrictions
  scheduling_policy
  search
  search_engine_service
  sec_key_att_app_id_provider
  secure_element
  sensorservice
  serial
  servicediscovery
  settings
  shortcut
  simphonebook
  slice
  soundtrigger
  stats
  statscompanion
  statusbar
  storaged
  storaged_pri
  storagestats
  system_update
  telecom
  telephony.mtkregistry
  telephony.registry
  textclassification
  textservices
  thermalservice
  timezone
  trust
  uimode
  updatelock
  usagestats
  usb
  user
  vibrator
  voiceinteraction
  vrmanager
  wallpaper
  webviewupdate
  wifi
  wificond
  wifip2p
  wifiscanner
  window
```

# `adb shell dumpsys activity activities` で起動している Activity を確認する

`adb shell dumpsys activity activities` で起動している Activity を確認できます。
例えば `jp.kaleidot725.sample` というサンプルアプリを起動した状態で取得します。

**画面状態**

![first.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/fd23457f-3d3a-1384-ae68-7217401d774b.png)

多くの情報が一気に出力されるのですが起動している Activity に関する情報は `Running activites` に記載されています。今は `jp.kaleidot725.sampole` の `MainActivity` を起動しているので次のように出力されます。

**出力結果**

```shell
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom):
         ︙ 省略
    Running activities (most recent first):
      TaskRecord{e64923a #222 A=jp.kaleidot725.sample U=0 StackId=0 sz=1}
        Run #0: ActivityRecord{18177e0 u0 jp.kaleidot725.sample/.MainActivity t222}
         ︙ 省略
  ```


`jp.lakeidot725.sample` で別の Activity の遷移が発生に応じて出力される内容も変化します。
例えば `MainActivty` から `SubActivity` に遷移させて状態を取得してみます。

**画面状態**

![second.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/265ac49f-6b6f-ae48-39ae-72f7c4617847.png)

遷移が実行されると `MainActivity` の上に `SubActivity` がスタックされるので次のように出力されます。

**出力結果**

```shell
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom):
         ︙ 省略
    Running activities (most recent first):
      TaskRecord{e64923a #222 A=jp.kaleidot725.sample U=0 StackId=0 sz=2}
        Run #1: ActivityRecord{b9c9bdd u0 jp.kaleidot725.sample/.SubActivity t222}
        Run #0: ActivityRecord{18177e0 u0 jp.kaleidot725.sample/.MainActivity t222}
         ︙ 省略
```

というように `adb shell dumpsys activity activities` の `Running activites` を確認すれば起動している Activity を確認できます。

`adb shell dumpsys activty activities` ではこの他にも onResume している Activity や 
最後に onPaused した Activity を確認できるようになっています。

なにか Activity 周りで動作がおかしかったり
想定通りにならないときには `dumpsys` を使って解析するとなにかわかりそうですね。

```shell
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom):
          ︙ 省略
 Running activities (most recent first):
      TaskRecord{e64923a #222 A=jp.kaleidot725.sample U=0 StackId=0 sz=2}
        Run #1: ActivityRecord{68c3212 u0 jp.kaleidot725.sample/.SubActivity t222}
        Run #0: ActivityRecord{18177e0 u0 jp.kaleidot725.sample/.MainActivity t222}

    mResumedActivity: ActivityRecord{68c3212 u0 jp.kaleidot725.sample/.SubActivity t222}
    mLastPausedActivity: ActivityRecord{18177e0 u0 jp.kaleidot725.sample/.MainActivity t222}
          ︙ 省略
```

# おわりに

`dumpsys` を使えば Android で動作しているサービスからたくさんの情報を取得できるみたいですね。普通には利用するケースは無いかもしれませんが端末依存の問題の解析などには使えそうですね。その他にも組込機器として Android を使う場合には重宝しそうです。（外部機器に接続できているか確認したり色々できそう！）

# 参考記事
- [dumpsys](https://developer.android.com/studio/command-line/dumpsys?hl=ja)