MCPcopy Index your code
hub / github.com/Jacksgong/ThreadDebugger

github.com/Jacksgong/ThreadDebugger @v1.6.3

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.6.3 ↗ · + Follow
226 symbols 422 edges 25 files 58 documented · 26%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

ThreadDebugger

[![ThreadDebugger][thread_debugger_svg]][thread_debugger_link] [![ThreadPools][thread_pools_svg]][thread_pools_link] [![Build Status][build_status_svg]][build_status_link]

README|中文文档


这个库包含: 线程调试器(threaddebugger)、线程池创建工具(threadpools)。

线程调试器

虽然我们知道已经有很多方法进行线程调试,如通过Android Studio Monitor 进行Allocation Tracking,在分析结果中会带有期间线程的一些信息;或者是通过Android Device Monitor进行Method Profiling,在分析结果中也会带有期间线程的一些信息。但是每次都需要进行启动关闭,并且每次结果分析都要几秒,几十秒甚至更久,显得不是很灵活。

ThreadDebugger是一个简单易用的线程调试器,可以帮助您随时查看应用中所有线程的使用情况,以及变化情况。

线程池创建工具

该线程池创建工具,相比系统的Executors强制要求每次执行任务的时候都需要指定任务的名称,以便于更好的调试与监控,并且提供非常便捷的创建相关规则的线程池。


I. 安装

添加下面的依赖到build.gradle中:

dependencies {
    // If you need use ThreadDebugger.
    debugImplementation'cn.dreamtobe.threaddebugger:threaddebugger:1.6.2'
    releaseImplementation'cn.dreamtobe.threaddebugger:threaddebugger-no-op:1.6.2'
    // If you need use ThreadPool.
    implementation'cn.dreamtobe.threaddebugger:threadpool:1.6.2'
}
  • ThreadDebugger: Download
  • ThreadDebugger-no-op: Download
  • ThreadPool: Download

II. 启动监控

```java IThreadDebugger debugger = ThreadDebugger.install( ThreadDebuggers.createWithCommonThreadKey() / The ThreadDebugger with known thread Categories / // add Thread Category .add("IO", "IO") .add("computation", "computation") .add("network", "network") .add("test1", "test1") .add("test2", "test2") .add("test3", "test3") .add("test4", "test4"),

     2000, /** The frequent of Updating Thread Activity information **/

     new ThreadDebugger.ThreadChangedCallback() { /** The threads changed callback **/
         @Override
         public void onChanged(IThreadDebugger debugger) {
             // callback this method when the threads in this application has changed.
             Log.d(TAG, debugger.drawUpEachThreadInfoDiff());
             Log.d(TAG, debugger.drawUpEachThreadSizeDiff());
             Log.d(TAG, debugger.drawUpEachThreadSize());
             Log.d(TAG, debugger.drawUpEachThreadInfo());
             Log.d(TAG, debugger.drawUpUnknownInfo());
         }
     });

```

III. Logcat的输出

1. drawUpEachThreadInfoDiff

adb logcat -v raw | grep drawUpEachThreadInfoDiff:

drawUpEachThreadInfoDiff: Thread count = 13. Thread differ : +13. main: +1 [(+)main] | Binder: +2 [(+)Binder_2, (+)Binder_1] | Finalizer: +2 [(+)FinalizerWatchdogDaemon, (+)FinalizerDaemon] | RenderThread: +1 [(+)RenderThread] | HeapTaskDaemon: +1 [(+)HeapTaskDaemon] | ReferenceQueueDaemon: +1 [(+)ReferenceQueueDaemon] | JDWP: +1 [(+)JDWP] | unknown: +4 [(+)hwuiTask1, (+)hwuiTask2, (+)ThreadDebugger, (+)Signal Catcher]
drawUpEachThreadInfoDiff: Thread count = 15. Thread differ : +2. computation: +1 [(+)computation-1::running-Test1:7s] | test1: +1 [(+)test1-ExceedDiscard-1::running-RandomThreadWork]
drawUpEachThreadInfoDiff: Thread count = 16. Thread differ : +1. test1: +1 [(+)test1-ExceedDiscard-2::running-Test2:1s]
drawUpEachThreadInfoDiff: Thread count = 17. Thread differ : +1. computation: +1 [(+)computation-2::running-Test3:8s] | test1: SWAP [(+)test1-ExceedDiscard-2::idle, (-)test1-ExceedDiscard-2::running-Test2:1s]
drawUpEachThreadInfoDiff: Thread count = 17. Thread differ : 0. computation: SWAP [(+)computation-1::idle, (-)computation-1::running-Test1:7s]
drawUpEachThreadInfoDiff: Thread count = 18. Thread differ : +1. computation: +1 [(+)computation-3::running-Test4:9s]
drawUpEachThreadInfoDiff: Thread count = 19. Thread differ : +1. network: +1 [(+)network-1::running-Test5:1s]
drawUpEachThreadInfoDiff: Thread count = 19. Thread differ : 0. network: SWAP [(+)network-1::idle, (-)network-1::running-Test5:1s]
drawUpEachThreadInfoDiff: Thread count = 20. Thread differ : +1. IO: +1 [(+)io-1::running-Test6:1s]
drawUpEachThreadInfoDiff: Thread count = 20. Thread differ : 0. IO: SWAP [(+)io-1::idle, (-)io-1::running-Test6:1s]
drawUpEachThreadInfoDiff: Thread count = 20. Thread differ : 0. computation: SWAP [(+)computation-2::idle, (-)computation-2::running-Test3:8s] | test1: SWAP [(+)test1-ExceedDiscard-1::idle, (-)test1-ExceedDiscard-1::running-RandomThreadWork]
drawUpEachThreadInfoDiff: Thread count = 20. Thread differ : 0. computation: SWAP [(+)computation-3::idle, (-)computation-3::running-Test4:9s]

2. drawUpEachThreadSizeDiff

adb logcat -v raw | grep drawUpEachThreadSizeDiff:

drawUpEachThreadSizeDiff: Thread count = 13. Thread differ : +13. main: +1 | Binder: +2 | Finalizer: +2 | RenderThread: +1 | HeapTaskDaemon: +1 | ReferenceQueueDaemon: +1 | JDWP: +1 | unknown: +4 [(+)hwuiTask1, (+)hwuiTask2, (+)ThreadDebugger, (+)Signal Catcher]
drawUpEachThreadSizeDiff: Thread count = 15. Thread differ : +2. computation: +1 | test1: +1
drawUpEachThreadSizeDiff: Thread count = 16. Thread differ : +1. test1: +1
drawUpEachThreadSizeDiff: Thread count = 17. Thread differ : +1. computation: +1
drawUpEachThreadSizeDiff: Thread count = 17. Thread size has not changed.
drawUpEachThreadSizeDiff: Thread count = 18. Thread differ : +1. computation: +1
drawUpEachThreadSizeDiff: Thread count = 19. Thread differ : +1. network: +1
drawUpEachThreadSizeDiff: Thread count = 19. Thread size has not changed.
drawUpEachThreadSizeDiff: Thread count = 20. Thread differ : +1. IO: +1
drawUpEachThreadSizeDiff: Thread count = 20. Thread size has not changed.
drawUpEachThreadSizeDiff: Thread count = 20. Thread size has not changed.
drawUpEachThreadSizeDiff: Thread count = 20. Thread size has not changed.

3. drawUpEachThreadSize

adb logcat -v raw | grep drawUpEachThreadSize:

drawUpEachThreadSize: Thread count = 13. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | unknown: 4
drawUpEachThreadSize: Thread count = 15. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 1 | test1: 1 | unknown: 4
drawUpEachThreadSize: Thread count = 16. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 1 | test1: 2 | unknown: 4
drawUpEachThreadSize: Thread count = 17. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 2 | test1: 2 | unknown: 4
drawUpEachThreadSize: Thread count = 17. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 2 | test1: 2 | unknown: 4
drawUpEachThreadSize: Thread count = 18. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 3 | test1: 2 | unknown: 4
drawUpEachThreadSize: Thread count = 19. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 3 | network: 1 | test1: 2 | unknown: 4
drawUpEachThreadSize: Thread count = 19. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 3 | network: 1 | test1: 2 | unknown: 4
drawUpEachThreadSize: Thread count = 20. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | IO: 1 | computation: 3 | network: 1 | test1: 2 | unknown: 4
drawUpEachThreadSize: Thread count = 20. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | IO: 1 | computation: 3 | network: 1 | test1: 2 | unknown: 4
drawUpEachThreadSize: Thread count = 20. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | IO: 1 | computation: 3 | network: 1 | test1: 2 | unknown: 4
drawUpEachThreadSize: Thread count = 20. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | IO: 1 | computation: 3 | network: 1 | test1: 2 | unknown: 4

4. drawUpEachThreadInfo

adb logcat -v raw | grep drawUpEachThreadInfo:

``` drawUpEachThreadInfo: Thread count = 13. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerWatchdogDaemon, FinalizerDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | unknown[hwuiTask1, hwuiTask2, ThreadDebugger, Signal Catcher] drawUpEachThreadInfo: Thread count = 15. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::running-Test1:7s] | test1[test1-ExceedDiscard-1::running-RandomThreadWork] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher] drawUpEachThreadInfo: Thread count = 16. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::running-Test1:7s] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::running-Test2:1s] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher] drawUpEachThreadInfo: Thread count = 17. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::running-Test1:7s, computation-2::running-Test3:8s] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher] drawUpEachThreadInfo: Thread count = 17. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::idle, computation-2::running-Test3:8s] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher] drawUpEachThreadInfo: Thread count = 18. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::idle, computation-2::running-Test3:8s, computation-3::running-Test4:9s] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher] drawUpEachThreadInfo: Thread count = 19. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::idle, computation-2::running-Test3:8s, computation-3::running-Test4:9s] | network[network-1::running-Test5:1s] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher] drawUpEachThreadInfo: Thread count = 19. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::idle, computation-2::running-Test3:8s, computation-3::running-Test4:9s] | network[network-1::idle] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher] drawUpEachThreadInfo: Thread count = 20. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | IO[io-1::running-Test6:1s] | computation[computation-1::idle, computation-2::running-Test3:8s, computation-3::running-Test4:9s] | network[network-1::idle] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher] drawUpEachThreadInfo: Thread count = 20. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | IO[io-1::idle] | computation[computation-1::idle, computation-2::running-Test3:8s, computation-3::running-Test4:9s] | network[network-1::idle] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher] drawUpEachThreadInfo: Thread count = 20. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP]

Extension points exported contracts — how you extend this code

IThreadDebugger (Interface)
The thread debugger. @see ThreadDebuggers [3 implementers]
threaddebugger/src/main/java/cn/dreamtobe/threaddebugger/IThreadDebugger.java
IThreadDebugger (Interface)
A no-op of the thread debugger. [2 implementers]
threaddebugger-no-op/src/main/java/cn/dreamtobe/threaddebugger/IThreadDebugger.java
IExecutor (Interface)
The executor running command with exactly their own task-name. [2 implementers]
threadpool/src/main/java/cn/dreamtobe/threadpool/IExecutor.java
ThreadChangedCallback (Interface)
The thread changed callback. [1 implementers]
threaddebugger/src/main/java/cn/dreamtobe/threaddebugger/ThreadDebugger.java
CommonThreadKey (Interface)
Some common key of thread.
threaddebugger-no-op/src/main/java/cn/dreamtobe/threaddebugger/CommonThreadKey.java
CommonThreadKey (Interface)
Some common key of thread.
threaddebugger/src/main/java/cn/dreamtobe/threaddebugger/CommonThreadKey.java
ThreadChangedCallback (Interface)
(no doc) [1 implementers]
threaddebugger-no-op/src/main/java/cn/dreamtobe/threaddebugger/ThreadDebugger.java

Core symbols most depended-on inside this repo

add
called by 41
threaddebugger/src/main/java/cn/dreamtobe/threaddebugger/IThreadDebugger.java
size
called by 25
threaddebugger/src/main/java/cn/dreamtobe/threaddebugger/ThreadCategory.java
clone
called by 17
threaddebugger/src/main/java/cn/dreamtobe/threaddebugger/ThreadCategory.java
d
called by 16
threadpool/src/main/java/cn/dreamtobe/threadpool/ThreadPoolLog.java
addTaskToExecutor
called by 7
demo/src/main/java/cn/dreamtobe/threaddebugger/demo/MainActivity.java
toString
called by 6
threaddebugger/src/main/java/cn/dreamtobe/threaddebugger/ThreadCategory.java
execute
called by 5
threadpool/src/main/java/cn/dreamtobe/threadpool/IExecutor.java
remove
called by 4
threadpool/src/main/java/cn/dreamtobe/threadpool/IExecutor.java

Shape

Method 173
Class 37
Interface 16

Languages

Java100%

Modules by API surface

threaddebugger/src/main/java/cn/dreamtobe/threaddebugger/DefaultThreadDebugger.java23 symbols
threadpool/src/main/java/cn/dreamtobe/threadpool/RealExecutors.java20 symbols
demo/src/main/java/cn/dreamtobe/threaddebugger/demo/MainActivity.java20 symbols
threaddebugger/src/main/java/cn/dreamtobe/threaddebugger/ThreadCategory.java17 symbols
threadpool/src/main/java/cn/dreamtobe/threadpool/ThreadExecutor.java15 symbols
threaddebugger-no-op/src/main/java/cn/dreamtobe/threaddebugger/ThreadDebuggers.java14 symbols
threadpool/src/main/java/cn/dreamtobe/threadpool/ExceedWait.java13 symbols
threaddebugger-no-op/src/main/java/cn/dreamtobe/threaddebugger/ThreadCategory.java12 symbols
threaddebugger/src/main/java/cn/dreamtobe/threaddebugger/IThreadDebugger.java11 symbols
threaddebugger-no-op/src/main/java/cn/dreamtobe/threaddebugger/IThreadDebugger.java11 symbols
threadpool/src/main/java/cn/dreamtobe/threadpool/ThreadPools.java9 symbols
demo/src/main/java/cn/dreamtobe/threaddebugger/demo/DemoThreadPoolCentral.java8 symbols

For agents

$ claude mcp add ThreadDebugger \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact