Android 系统中没有提供 pstree 命令,需要借助 busybox 里的 pstree 命令。
busybox 下载地址(根据手机 CPU 架构来选择对应的版本):
https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch
我的手机 CPU 是 armv8l 架构,所以下载:
https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-armv8l
下载完成后
adb push busybox-armv8l /system/bin/busybox
adb shell
chmod a+x /system/bin/busybox
/system/bin/busybox pstree
得到一个三星 Android 7.0 手机里的用户进程树如下:
(部分树叶为线程,其实在 Linux 中,同一进程中的不同线程就是由共享资源的不同进程来实现的;
只保留了 com.android.phone 和 com.tecent.mm 两个 App 进程,其他 App 进程已被删除)
init─┬─ATFWD-daemon─┬─2*[{ATFWD-daemon}]
│ ├─{Binder:717_1}
│ └─{Binder:717_2}
├─Binder:664_2───{Binder:664_1}
├─Binder:710_2─┬─{Binder:710_1}
│ ├─{Binder:710_2}
│ ├─{Binder:710_3}
│ ├─{Binder:710_4}
│ ├─{Binder:710_5}
│ ├─{Binder:710_6}
│ ├─{Binder:710_7}
│ └─8*[{netd}]
├─adbd─┬─busybox
│ ├─{->transport}
│ ├─{<-transport}
│ ├─{shell srvc 7800}
│ └─{usb ffs open}
├─adsprpcd───2*[{adsprpcd}]
├─apaservice───{Binder:652_1}
├─audiod─┬─{AudioDaemon}
│ └─{Binder:721_1}
├─audioserver─┬─{ApmAudio}
│ ├─{ApmOutput}
│ ├─{ApmTone}
│ ├─{AudioOut_15}
│ ├─{AudioOut_D}
│ ├─{Binder:685_1}
│ ├─{Binder:685_2}
│ ├─{Binder:685_3}
│ ├─{Binder:685_4}
│ ├─{FastMixer}
│ └─3*[{audioserver}]
├─auditd
├─cameraserver─┬─{Binder:687_1}
│ ├─{Binder:687_2}
│ └─{Binder:687_3}
├─connfwexe───{connfwexe}
├─ddexe───4*[{ddexe}]
├─debuggerd───debuggerd:sig
├─debuggerd64───debuggerd64:sig
├─drmserver─┬─{Binder:649_1}
│ ├─{Binder:649_2}
│ ├─{Binder:649_3}
│ ├─{Binder:649_4}
│ ├─{Binder:649_5}
│ └─{Binder:649_6}
├─edmaudit
├─fingerprintd───{POSIX timer 0}
├─gatekeeperd
├─healthd
├─imsd─┬─{Binder:668_1}
│ └─4*[{imsd}]
├─installd
├─ipacm─┬─{ipa driver ntfy}
│ ├─{ipacm}
│ └─{netlink socket}
├─ipacm-diag───{ipacm-diag}
├─jackservice───{Binder:653_1}
├─keystore
├─lmkd
├─loc_launcher─┬─lowi-server───4*[{lowi-server}]
│ └─{loc_launcher}
├─logd─┬─{logd.control}
│ ├─{logd.daemon}
│ ├─{logd.reader}
│ └─{logd.writer}
├─zygote64─┬─m.android.phone─┬─{Binder:2690_1}
│ │ ├─{Binder:2690_2}
│ │ ├─{Binder:2690_3}
│ │ ├─{Binder:2690_4}
│ │ ├─{Binder:2690_5}
│ │ ├─{Binder:2690_6}
│ │ ├─{Cat Icon Loader}
│ │ ├─{Cat Telephony s}
│ │ ├─2*[{CdmaInboundSmsH}]
│ │ ├─2*[{CdmaServiceCate}]
│ │ ├─2*[{CellBroadcastHa}]
│ │ ├─{ConnectivityThr}
│ │ ├─2*[{DcHandlerThread}]
│ │ ├─{FinalizerDaemon}
│ │ ├─{FinalizerWatchd}
│ │ ├─2*[{GsmCellBroadcas}]
│ │ ├─2*[{GsmInboundSmsHa}]
│ │ ├─{HeapTaskDaemon}
│ │ ├─{ImsAdaptorThrea}
│ │ ├─2*[{ImsModemReceive}]
│ │ ├─{ImsModemSender}
│ │ ├─{JDWP}
│ │ ├─{Jit thread pool}
│ │ ├─{Profile Saver}
│ │ ├─{RILReceiver0}
│ │ ├─{RILReceiver1}
│ │ ├─{RILSender0}
│ │ ├─{RILSender1}
│ │ ├─{ReferenceQueueD}
│ │ ├─{RenderThread}
│ │ ├─{RilMessageDecod}
│ │ ├─{Signal Catcher}
│ │ ├─2*[{Stk App Service}]
│ │ ├─{SyncHandler-0}
│ │ ├─{Thread-7}
│ │ ├─{emergencymodema}
│ │ ├─{ervice.Executor}
│ │ ├─{hwuiTask1}
│ │ ├─{hwuiTask2}
│ │ └─{pool-2-thread-1}
│ ├─system_server─┬─3*[{ActivityManager}]
│ │ ├─{AdaptiveDisplay}
│ │ ├─{AlarmManager}
│ │ ├─{AsyncQueryWorke}
│ │ ├─{AudioService}
│ │ ├─{AutoWifi}
│ │ ├─{BarTender Handl}
│ │ ├─{BatteryStats_wa}
│ │ ├─{Binder:1512_10}
│ │ ├─{Binder:1512_11}
│ │ ├─{Binder:1512_1}
│ │ ├─{Binder:1512_2}
│ │ ├─{Binder:1512_3}
│ │ ├─{Binder:1512_4}
│ │ ├─{Binder:1512_5}
│ │ ├─{Binder:1512_6}
│ │ ├─{Binder:1512_7}
│ │ ├─{Binder:1512_8}
│ │ ├─{Binder:1512_9}
│ │ ├─{Binder:1512_A}
│ │ ├─{Binder:1512_B}
│ │ ├─{Binder:1512_C}
│ │ ├─{Binder:1512_D}
│ │ ├─{Binder:1512_E}
│ │ ├─{Binder:1512_F}
│ │ ├─{CAEMgr}
│ │ ├─{CAESHubEvtHler}
│ │ ├─{CCM InternalHan}
│ │ ├─{CallAudioModeSt}
│ │ ├─2*[{CallbackHandler}]
│ │ ├─{CameraService_p}
│ │ ├─{CaptivePortalHa}
│ │ ├─{CheckTouchThrea}
│ │ ├─{ConnectivityMan}
│ │ ├─{ConnectivitySer}
│ │ ├─{ConnectivityThr}
│ │ ├─{CpuTracker}
│ │ ├─{CredentialManag}
│ │ ├─{CryptdConnector}
│ │ ├─{DLPManagerServi}
│ │ ├─{DeviceRootKeySe}
│ │ ├─{DirEncryptConne}
│ │ ├─{DirEncryptServi}
│ │ ├─{EMPackageHandle}
│ │ ├─{EnterpriseParti}
│ │ ├─{EthernetService}
│ │ ├─{FgCheckThread}
│ │ ├─{FileObserver}
│ │ ├─{FinalizerDaemon}
│ │ ├─{FinalizerWatchd}
│ │ ├─{FirewallPolicyS}
│ │ ├─{GNPProxy}
│ │ ├─{GeofenceService}
│ │ ├─{HS20StateMachin}
│ │ ├─{HeapTaskDaemon}
│ │ ├─{HongbaoModeServ}
│ │ ├─{Hs20UtilityHand}
│ │ ├─{InputDeviceLigh}
│ │ ├─{InputDispatcher}
│ │ ├─{InputReader}
│ │ ├─{InternalHandler}
│ │ ├─{IpManager.wlan0}
│ │ ├─3*[{IzatServiceBase}]
│ │ ├─{JDWP}
│ │ ├─{KeyManagementUt}
│ │ ├─{KiesUsbManager}
│ │ ├─{KioskModeServic}
│ │ ├─{KnoxCustomManag}
│ │ ├─{KnoxVpnFirewall}
│ │ ├─{KnoxVpnHandler}
│ │ ├─{LBSSystemMonito}
│ │ ├─{LazyTaskWriterT}
│ │ ├─{LicenseLogServi}
│ │ ├─2*[{LocTime}]
│ │ ├─4*[{Loc_hal}]
│ │ ├─{LocationManager}
│ │ ├─{MARsDBThread}
│ │ ├─{MARsUpdatePacka}
│ │ ├─{MDMAppUsageHand}
│ │ ├─{MdnieScenarioCo}
│ │ ├─{MountService}
│ │ ├─{NapHandler}
│ │ ├─{NetdConnector}
│ │ ├─{NetworkDatausag}
│ │ ├─{NetworkMonitorN}
│ │ ├─{NetworkPolicy}
│ │ ├─{NetworkStatsObs}
│ │ ├─{NetworkStatsThr}
│ │ ├─{NetworkStats}
│ │ ├─{NetworkTimeUpda}
│ │ ├─{NotifierInSeper}
│ │ ├─{NsdService}
│ │ ├─{PKMService}
│ │ ├─{PackageInstalle}
│ │ ├─{PackageManager}
│ │ ├─{PersonaManagerS}
│ │ ├─{PersonaPolicyMa}
│ │ ├─{PhotonicModulat}
│ │ ├─{PmsDisplayThrea}
│ │ ├─{PmsTraceDumper}
│ │ ├─{PowerManagerSer}
│ │ ├─{QualityResultHa}
│ │ ├─{QualitySocketHa}
│ │ ├─{ReferenceQueueD}
│ │ ├─{RegisterInSeper}
│ │ ├─{RenderThread}
│ │ ├─{RollbackRefresh}
│ │ ├─{SATServiceAt}
│ │ ├─{SATServiceData}
│ │ ├─{SEAMService}
│ │ ├─{SLocationeServi}
│ │ ├─{SPD}
│ │ ├─{SSRM Handler Th}
│ │ ├─{SdpLogService}
│ │ ├─{SdpManagerServi}
│ │ ├─{SensorEventAckR}
│ │ ├─{SensorHubThread}
│ │ ├─{SensorService}
│ │ ├─{SettingsProvide}
│ │ ├─{Signal Catcher}
│ │ ├─{SoundPoolThread}
│ │ ├─{SoundPool}
│ │ ├─{SyncHandler-0}
│ │ ├─{Tethering}
│ │ ├─{Thread-12}
│ │ ├─{Thread-16}
│ │ ├─{Thread-17}
│ │ ├─{Thread-19}
│ │ ├─{Thread-21}
│ │ ├─{Thread-7}
│ │ ├─{Thread-9}
│ │ ├─{TimaService}
│ │ ├─{Timer-0}
│ │ ├─{UEventObserver}
│ │ ├─{UsbHostNotifica}
│ │ ├─{UsbPortManager}
│ │ ├─{UsbService host}
│ │ ├─{VoldConnector}
│ │ ├─{WWSMPatcherThre}
│ │ ├─{WifiMaliciousHo}
│ │ ├─{WifiP2pService}
│ │ ├─{WifiRttService}
│ │ ├─{WifiScanningSer}
│ │ ├─{WifiService}
│ │ ├─{WifiStateMachin}
│ │ ├─{WifiWatchdogSta}
│ │ ├─{android.bg}
│ │ ├─{android.display}
│ │ ├─{android.fg}
│ │ ├─{android.io}
│ │ ├─{android.ui}
│ │ ├─{backup}
│ │ ├─{batterystats-sy}
│ │ ├─{context_aware}
│ │ ├─{mDnsConnector}
│ │ ├─{mSvcLEDThread}
│ │ ├─{motion_recognit}
│ │ ├─{notification-sq}
│ │ ├─{packagescan-1}
│ │ ├─{packagescan-2}
│ │ ├─{packagescan-3}
│ │ ├─{packagescan-4}
│ │ ├─{packagescan-5}
│ │ ├─{packagescan-6}
│ │ ├─{ranker}
│ │ ├─{roid.pacmanager}
│ │ ├─{scontext}
│ │ ├─{sensorThread}
│ │ ├─2*[{system_server}]
│ │ ├─{ulp_monitor}
│ │ ├─{ulp_msg}
│ │ ├─{uteStateMachine}
│ │ └─{watchdog}
│ ├─{FinalizerDaemon}
│ ├─{FinalizerWatchd}
│ ├─{HeapTaskDaemon}
│ └─{ReferenceQueueD}
├─zygote─┬─com.tencent.mm─┬─{.mm_ANRWatchDog}
│ │ ├─{Binder:5444_1}
│ │ ├─{Binder:5444_2}
│ │ ├─{Binder:5444_3}
│ │ ├─{Binder:5444_4}
│ │ ├─{Binder:5444_5}
│ │ ├─{ConnectivityThr}
│ │ ├─{FinalizerDaemon}
│ │ ├─{FinalizerWatchd}
│ │ ├─{HalleyTempTaskT}
│ │ ├─{HeapTaskDaemon}
│ │ ├─{HttpPlatformCon}
│ │ ├─{InflateThread}
│ │ ├─{JDWP}
│ │ ├─{Jit thread pool}
│ │ ├─14*[{MM_Thread_Pool_}]
│ │ ├─{Profile Saver}
│ │ ├─{ReferenceQueueD}
│ │ ├─{Signal Catcher}
│ │ ├─{Vending-HeavyWo}
│ │ ├─{Vending-LogicTh}
│ │ ├─2*[{com.tencent.mm}]
│ │ ├─{default}
│ │ ├─{mars::cdn}
│ │ └─{pool-1-thread-1}
│ ├─{FinalizerDaemon}
│ ├─{FinalizerWatchd}
│ ├─{HeapTaskDaemon}
│ └─{ReferenceQueueD}
├─mcDriverDaemon─┬─{McDaemon.Server}
│ └─{mcDriverDaemon}
├─mediacodec─┬─{Binder:705_1}
│ ├─{Binder:705_2}
│ └─{Binder:705_3}
├─mediadrmserver───{Binder:707_1}
├─mediaextractor─┬─{Binder:708_1}
│ ├─{Binder:708_2}
│ └─{Binder:708_3}
├─mediaserver─┬─{Binder:709_1}
│ ├─{Binder:709_2}
│ ├─{Binder:709_3}
│ └─{Binder:709_4}
├─mm-qcamera-daem─┬─20*[{CAM_imgTh}]
│ ├─{POSIX timer 0}
│ └─10*[{mm-qcamera-daem}]
├─msm_irqbalance
├─netmgrd───8*[{netmgrd}]
├─otp_server───{Binder:2539_1}
├─perfd─┬─{POSIX timer 0}
│ └─3*[{perfd}]
├─perfprofd
├─pm-proxy─┬─{Binder:497_1}
│ ├─{Binder:497_2}
│ └─{Binder:497_3}
├─pm-service─┬─{Binder:477_1}
│ ├─{Binder:477_2}
│ ├─{POSIX timer 0}
│ └─{pm-service}
├─qmuxd───3*[{qmuxd}]
├─qseecomd───qseecomd───9*[{qseecomd}]
├─rild─┬─{Binder:692_1}
│ ├─{Binder:692_2}
│ └─15*[{rild}]
├─rild───15*[{rild}]
├─rmt_storage───4*[{rmt_storage}]
├─sdp_cryptod───{sdp_cryptod}
├─secure_storage_
├─sensorhubservic─┬─{Binder:651_1}
│ ├─{Binder:651_2}
│ ├─{Binder:651_3}
│ └─{SensorHubServic}
├─servicemanager
├─smdexe───3*[{smdexe}]
├─ss_conn_daemon───5*[{ss_conn_daemon}]
├─surfaceflinger─┬─{Binder:482_1}
│ ├─{Binder:482_2}
│ ├─{Binder:482_3}
│ ├─{Binder:482_4}
│ ├─{Binder:482_5}
│ ├─{DispSync}
│ ├─{EventControl}
│ ├─2*[{EventThread}]
│ ├─{HWC_UeventThrea}
│ ├─{POSIX timer 0}
│ ├─{POSIX timer 1}
│ ├─{SDM_EventThread}
│ ├─{VSyncThread}
│ └─{surfaceflinger}
├─tftp_server
├─thermal-engine───7*[{thermal-engine}]
├─time_daemon───5*[{time_daemon}]
├─tlc_server───{Binder:2505_1}
├─tlc_server───{Binder:2506_1}
├─ueventd
├─vold─┬─sdcard
│ └─8*[{vold}]
└─wcnss_service
注:Binder:717_1 中的 717 为进程号,1为线程号,参见源码:
String8 ProcessState::makeBinderThreadName() {
int32_t s = android_atomic_add(1, &mThreadPoolSeq);
pid_t pid = getpid(); //获取进程pid
String8 name;
name.appendFormat("Binder:%d_%X", pid, s); //为binder命名
return name;
}
另:
/system/bin/busybox pstree -p 0 命令可以查看 Android 系统的所有进程树(内核进程+用户进程)
/system/bin/busybox pstree -p 2 命令可以查看 Android 系统的内核进程树
pstree 命令使用说明如下:
Usage: pstree [-p] [PID|USER]
Display process tree, optionally start from USER or PID
-p Show pids