Skip to content

94 - 插件启动流程与 WebView 双向消息映射

概述

本文档分析 iFlyCode 插件的完整启动时序、Agent 进程管理、WebSocket 通信链路,以及 WebView Java-JS 双向消息映射体系。


Part 1: 插件启动流程

1.1 启动时序图

IDE 启动


PluginStartupActivity.runActivity()
  │  (AppLifecycleListener / Runnable)

  ├─► InitService.init()                    ─── 初始化服务层
  │     │
  │     ├─► PluginAgentProcessServiceImpl.startAgent()
  │     │     │
  │     │     ├─► PluginAgentCommandLine.build()   ─── 构造命令行
  │     │     │     返回: GeneralCommandLine
  │     │     │
  │     │     ├─► PluginAgentProcessHandler(cmdLine)
  │     │     │     │
  │     │     │     ├─► ProcessHandler.startNotify()
  │     │     │     │
  │     │     │     └─► PluginAgentProcessHandler$01 (内部类)
  │     │     │           监听进程输出,解析 stdout
  │     │     │
  │     │     └─► PluginWebsocketClient.connect()
  │     │           │
  │     │           ├─► OkHttp WebSocket 连接
  │     │           │     URL: ws://127.0.0.1:{port}/ws
  │     │           │
  │     │           └─► PluginWebsocketListener
  │     │                 │
  │     │                 ├─► onOpen()   → 连接成功回调
  │     │                 ├─► onMessage() → 接收 Agent 消息
  │     │                 ├─► onClosing() → 连接关闭
  │     │                 └─► onFailure() → 连接失败/重连
  │     │                       │
  │     │                       └─► SocketMessageListener.onMessage()
  │     │                             解析 JSON → 分发到 UI/Service
  │     │
  │     └─► RestartableAgentProcessService
  │           管理 Agent 进程生命周期、重启策略

  └─► WebViewWindowPanel 初始化

        ├─► JBCefBrowser 创建
        ├─► 加载 webview/assets/index.html
        └─► 注册 JS→Java 桥接 (handleRequest / handleAgentAction)

1.2 PluginStartupActivity — 插件启动入口

: com.aicode.PluginStartupActivity接口: 实现 AppLifecycleListener + Runnable

核心方法:

方法说明
runActivity()IDE 启动时自动调用,触发整个插件初始化链
run()Runnable 实现,执行异步初始化逻辑

启动内部类 PluginStartupActivity$01:

  • 实现 Runnable,在后台线程执行
  • 调用 InitService.init() 完成服务层初始化
  • 处理启动异常,记录日志

1.3 PluginAgentCommandLine — Agent 命令行构造

: com.aicode.agent.PluginAgentCommandLine

核心方法: build() → 返回 GeneralCommandLine

命令行参数构造

Agent 二进制路径:
  {pluginPath}/agent/iflycode-agent

命令行参数:
  --port {websocketPort}        WebSocket 服务端口 (Agent 侧监听)
  --host 127.0.0.1             绑定地址 (本地回环)
  --log-level {level}          日志级别 (debug/info/warn/error)
  --config {configPath}        配置文件路径
  --ide-type idea              IDE 类型标识
  --plugin-version {ver}       插件版本号
  --ide-version {ver}          IDE 版本号
  --project-path {path}        当前项目路径
  --language {lang}            项目主语言
  --temp-dir {path}            临时文件目录
  --data-dir {path}            数据目录

环境变量:

IFLYCODE_HOME={pluginPath}/agent
PATH={agentPath}:$PATH

工作目录: {pluginPath}/agent

1.4 PluginAgentProcessHandler — Agent 进程处理

: com.aicode.agent.PluginAgentProcessHandler父类: 继承 ProcessHandler (IntelliJ Platform)

核心方法:

方法说明
startNotify()启动进程并通知监听器
onTextAvailable()接收进程 stdout 输出

内部类 PluginAgentProcessHandler$01:

  • 实现 ProcessListener / OutputListener
  • 解析 Agent 进程的 stdout 输出
  • 检测 Agent 就绪信号 (如 "Agent started on port XXXX")
  • 提取 Agent 分配的 WebSocket 端口号
  • 触发 WebSocket 连接建立

1.5 PluginWebsocketClient — WebSocket 客户端

: com.aicode.agent.PluginWebsocketClient

连接建立流程:

1. 从 Agent 进程输出解析端口号
2. 构造 WebSocket URL: ws://127.0.0.1:{port}/ws
3. 创建 OkHttp WebSocket 请求
   Request.Builder()
     .url(wsUrl)
     .header("Authorization", token)     // 认证令牌
     .header("X-Plugin-Version", ver)    // 插件版本
     .build()
4. OkHttpClient.newWebSocket(request, listener)
5. 连接建立 → PluginWebsocketListener.onOpen()

重连机制:

  • 连接失败时触发指数退避重连
  • 最大重试次数: 5
  • 重连间隔: 1s → 2s → 4s → 8s → 16s
  • 重连成功后重新发送初始化消息

1.6 PluginWebsocketListener — WebSocket 监听器

: com.aicode.agent.PluginWebsocketListener接口: WebSocketListener (OkHttp)

回调方法说明
onOpen(webSocket, response)连接成功,发送初始化握手消息
onMessage(webSocket, text)接收文本消息,转发给 SocketMessageListener
onMessage(webSocket, bytes)接收二进制消息 (暂未使用)
onClosing(webSocket, code, reason)连接正在关闭,执行清理
onClosed(webSocket, code, reason)连接已关闭,触发重连
onFailure(webSocket, t, response)连接失败,触发重连逻辑

1.7 SocketMessageListener — 消息监听器

: com.aicode.agent.SocketMessageListener接口: 消息分发接口

消息处理流程:

WebSocket onMessage(text)


SocketMessageListener.onMessage(jsonString)

  ├─► JSON 解析 → MessageDTO
  │     字段: module, command, data, requestId

  ├─► 按 module 分发
  │     ├─ CHAT     → ChatService.handleMessage()
  │     ├─ COMMON   → CommonService.handleMessage()
  │     ├─ LOGIN    → LoginService.handleMessage()
  │     ├─ UNIT_TEST → UnitTestService.handleMessage()
  │     ├─ GIT      → GitService.handleMessage()
  │     ├─ CODE_SEARCH → CodeSearchService.handleMessage()
  │     ├─ SQL_CHAT → SqlChatService.handleMessage()
  │     ├─ SETTING  → SettingService.handleMessage()
  │     ├─ CODE_CHECK → CodeCheckService.handleMessage()
  │     ├─ BATCH_UNIT_TEST → BatchUnitTestService.handleMessage()
  │     └─ CODE_REVIEW → CodeReviewService.handleMessage()

  └─► UI 更新 / WebView 消息推送

Part 2: WebView Java→JS 消息映射

2.1 Java→JS 消息发送机制

Java 端通过 WebViewWindowPanel.sendMessage2webView() 方法向 WebView 发送消息:

java
// 核心发送方法
void sendMessage2webView(String type, Object data) {
    String json = new Gson().toJson(Map.of(
        "type", type,
        "data", data
    ));
    browser.getCefBrowser().executeJavaScript(
        "window.receiveData(" + json + ")",
        browser.getCefBrowser().getURL(),
        0
    );
}

调用链:

Java Service
  → WebViewWindowPanel.sendMessage2webView(type, data)
    → CefBrowser.executeJavaScript("window.receiveData(...)")
      → JS window.receiveData(msg)
        → JS handlerReceivedMsg(msg)
          → JS 按 type 分发到各处理函数

2.2 Java→JS 消息类型完整映射表

基于 WebViewDataTypeEnum 枚举和 WebViewWindowPanel 代码分析:

#消息类型 (type)数据内容 (data)说明
1initConfig{theme, language, ideType, version, ...}初始化配置信息
2loginStatus{isLogin, userName, avatar, token, ...}登录状态更新
3loginSuccess{token, userInfo}登录成功
4loginFail{error, message}登录失败
5logoutSuccess{}登出成功
6chatMessage{messageId, content, role, ...}聊天消息
7chatStreamStart{messageId, conversationId}流式消息开始
8chatStreamChunk{messageId, content, index}流式消息片段
9chatStreamEnd{messageId, conversationId}流式消息结束
10chatStreamError{messageId, error}流式消息错误
11chatHistory{conversations: [...]}聊天历史列表
12chatConversation{messages: [...]}对话消息列表
13newConversation{conversationId, title}新建对话
14deleteConversation{conversationId}删除对话
15renameConversation{conversationId, title}重命名对话
16clearConversation{conversationId}清空对话
17agentStatus{status, message}Agent 状态更新
18agentThinking{isThinking, content}Agent 思考状态
19agentAction{actionType, content, ...}Agent 操作指令
20agentActionStart{actionId, actionType}Agent 操作开始
21agentActionEnd{actionId, result}Agent 操作结束
22agentActionUpdate{actionId, progress, content}Agent 操作进度
23codeApply{filePath, content, range}代码应用
24codeDiff{filePath, oldContent, newContent}代码差异
25codeApplyResult{success, filePath, message}代码应用结果
26fileTree{files: [...]}文件树
27fileContent{filePath, content}文件内容
28fileCreate{filePath, content}创建文件
29fileModify{filePath, content, range}修改文件
30fileDelete{filePath}删除文件
31unitTestResult{testName, status, output, ...}单元测试结果
32unitTestGenerate{filePath, testCode}单元测试生成
33unitTestRun{testId, status, output}单元测试运行
34batchUnitTestResult{results: [...]}批量单元测试结果
35codeSearchResult{results: [...], query}代码搜索结果
36codeCheckResult{issues: [...], filePath}代码检查结果
37codeReviewResult{review: [...], summary}代码审查结果
38gitDiff{diff, filePath}Git 差异
39gitStatus{modified, added, deleted}Git 状态
40gitLog{commits: [...]}Git 日志
41gitBranch{branches: [...], current}Git 分支
42sqlChatResult{sql, explanation, results}SQL 聊天结果
43settingUpdate{key, value}设置更新
44settingConfig{settings: {...}}设置配置
45themeChange{theme}主题切换
46languageChange{language}语言切换
47error{code, message, detail}错误消息
48warning{message}警告消息
49progress{percent, message}进度更新
50notification{type, title, message}通知消息
51websocketStatus{connected, url}WebSocket 状态
52connectionStatus{status, message}连接状态
53projectInfo{name, path, language}项目信息
54editorContent{filePath, content, selection}编辑器内容
55selectionRange{startLine, endLine, text}选区范围
56inlineChatTrigger{position, context}内联聊天触发
57templateList{templates: [...]}模板列表
58versionInfo{pluginVersion, agentVersion}版本信息
59heartbeat{timestamp}心跳
60restartAgent{reason}重启 Agent

2.3 JS 端消息接收处理

JS 端通过 window.receiveData 接收 Java 消息:

javascript
// JS 接收入口
window.receiveData = function(msg) {
    handlerReceivedMsg(msg);
};

// 消息分发
function handlerReceivedMsg(msg) {
    const { type, data } = msg;
    switch (type) {
        case 'initConfig':        handleInitConfig(data); break;
        case 'loginStatus':       handleLoginStatus(data); break;
        case 'chatMessage':       handleChatMessage(data); break;
        case 'chatStreamChunk':   handleStreamChunk(data); break;
        case 'chatStreamEnd':     handleStreamEnd(data); break;
        case 'agentStatus':       handleAgentStatus(data); break;
        case 'agentAction':       handleAgentAction(data); break;
        case 'codeApply':         handleCodeApply(data); break;
        case 'codeDiff':          handleCodeDiff(data); break;
        case 'unitTestResult':    handleUnitTestResult(data); break;
        case 'codeSearchResult':  handleCodeSearchResult(data); break;
        case 'codeCheckResult':   handleCodeCheckResult(data); break;
        case 'codeReviewResult':  handleCodeReviewResult(data); break;
        case 'gitDiff':           handleGitDiff(data); break;
        case 'sqlChatResult':     handleSqlChatResult(data); break;
        case 'settingUpdate':     handleSettingUpdate(data); break;
        case 'themeChange':       handleThemeChange(data); break;
        case 'error':             handleError(data); break;
        case 'progress':          handleProgress(data); break;
        case 'notification':      handleNotification(data); break;
        // ... 更多类型
        default:
            console.warn('Unknown message type:', type);
    }
}

Part 3: WebView JS→Java 消息映射

3.1 JS→Java 消息发送机制

JS 端通过 sendMsgToIdea() 向 Java 端发送消息:

javascript
// JS 发送入口
function sendMsgToIdea(module, command, data) {
    const msg = {
        module: module,      // 模块标识
        command: command,    // 命令类型
        data: data           // 数据载荷
    };
    // 通过 JBCefBrowser JS→Java 桥接
    window.javaCallback(JSON.stringify(msg));
}

调用链:

JS sendMsgToIdea(module, command, data)
  → window.javaCallback(JSON.stringify(msg))
    → Java WebViewWindowPanel.handleRequest(jsonString)
      → JSON 解析 → 按 module/command 分发
        → 对应 Service 处理

3.2 JS→Java 消息模块 (Module) 列表

基于 ModuleEnum / AgentModuleEnum 枚举:

模块标识说明对应 Service
CHAT聊天模块ChatService
COMMON通用模块CommonService
LOGIN登录模块LoginService
UNIT_TEST单元测试模块UnitTestService
GITGit 模块GitService
CODE_SEARCH代码搜索模块CodeSearchService
SQL_CHATSQL 聊天模块SqlChatService
SETTING设置模块SettingService
CODE_CHECK代码检查模块CodeCheckService
BATCH_UNIT_TEST批量单元测试模块BatchUnitTestService
CODE_REVIEW代码审查模块CodeReviewService

3.3 JS→Java 消息类型完整映射表

CHAT 模块消息

#commanddata 字段说明Java 处理方法
1sendMessage{conversationId, content, mode}发送聊天消息ChatService.sendMessage()
2sendStreamMessage{conversationId, content, mode}发送流式消息ChatService.sendStreamMessage()
3stopGenerate{messageId}停止生成ChatService.stopGenerate()
4getHistory{page, pageSize}获取历史ChatService.getHistory()
5getConversation{conversationId}获取对话ChatService.getConversation()
6newConversation{title, mode}新建对话ChatService.newConversation()
7deleteConversation{conversationId}删除对话ChatService.deleteConversation()
8renameConversation{conversationId, title}重命名对话ChatService.renameConversation()
9clearConversation{conversationId}清空对话ChatService.clearConversation()
10applyCode{messageId, codeBlock}应用代码ChatService.applyCode()
11rejectCode{messageId, codeBlock}拒绝代码ChatService.rejectCode()
12copyCode{messageId, codeBlock}复制代码ChatService.copyCode()
13regenerate{messageId}重新生成ChatService.regenerate()
14switchMode{mode}切换聊天模式ChatService.switchMode()
15feedback{messageId, type, content}消息反馈ChatService.feedback()

COMMON 模块消息

#commanddata 字段说明Java 处理方法
16getInitConfig{}获取初始化配置CommonService.getInitConfig()
17getProjectInfo{}获取项目信息CommonService.getProjectInfo()
18getEditorContent{filePath}获取编辑器内容CommonService.getEditorContent()
19getSelection{}获取选区内容CommonService.getSelection()
20openFile{filePath, line}打开文件CommonService.openFile()
21closePanel{}关闭面板CommonService.closePanel()
22resizePanel{width, height}调整面板大小CommonService.resizePanel()
23getVersion{}获取版本信息CommonService.getVersion()
24heartbeat{timestamp}心跳CommonService.heartbeat()
25reportEvent{eventName, properties}上报事件CommonService.reportEvent()

LOGIN 模块消息

#commanddata 字段说明Java 处理方法
26login{username, password}登录LoginService.login()
27logout{}登出LoginService.logout()
28getLoginStatus{}获取登录状态LoginService.getLoginStatus()
29refreshToken{token}刷新令牌LoginService.refreshToken()
30oauthLogin{provider, code}OAuth 登录LoginService.oauthLogin()

UNIT_TEST 模块消息

#commanddata 字段说明Java 处理方法
31generateTest{filePath, className, methods}生成单元测试UnitTestService.generateTest()
32runTest{testFilePath, testName}运行测试UnitTestService.runTest()
33getTestResult{testRunId}获取测试结果UnitTestService.getTestResult()
34applyTest{testFilePath, testCode}应用测试代码UnitTestService.applyTest()

GIT 模块消息

#commanddata 字段说明Java 处理方法
35getDiff{filePath}获取差异GitService.getDiff()
36getStatus{}获取状态GitService.getStatus()
37getLog{count, branch}获取日志GitService.getLog()
38getBranches{}获取分支GitService.getBranches()
39commit{message, files}提交GitService.commit()
40checkout{branch}切换分支GitService.checkout()

CODE_SEARCH 模块消息

#commanddata 字段说明Java 处理方法
41search{query, scope, maxResults}代码搜索CodeSearchService.search()
42searchBySymbol{symbol, type}符号搜索CodeSearchService.searchBySymbol()
43searchByReference{symbol, filePath, line}引用搜索CodeSearchService.searchByReference()

SQL_CHAT 模块消息

#commanddata 字段说明Java 处理方法
44query{question, schema}SQL 查询SqlChatService.query()
45explain{sql}SQL 解释SqlChatService.explain()
46optimize{sql}SQL 优化SqlChatService.optimize()

SETTING 模块消息

#commanddata 字段说明Java 处理方法
47getSettings{}获取设置SettingService.getSettings()
48updateSetting{key, value}更新设置SettingService.updateSetting()
49resetSettings{}重置设置SettingService.resetSettings()
50changeTheme{theme}切换主题SettingService.changeTheme()
51changeLanguage{language}切换语言SettingService.changeLanguage()

CODE_CHECK 模块消息

#commanddata 字段说明Java 处理方法
52check{filePath, rules}代码检查CodeCheckService.check()
53getCheckResult{checkId}获取检查结果CodeCheckService.getCheckResult()
54ignoreIssue{issueId}忽略问题CodeCheckService.ignoreIssue()

BATCH_UNIT_TEST 模块消息

#commanddata 字段说明Java 处理方法
55batchGenerate{filePaths, options}批量生成测试BatchUnitTestService.batchGenerate()
56batchRun{testFilePaths}批量运行测试BatchUnitTestService.batchRun()
57getBatchResult{batchId}获取批量结果BatchUnitTestService.getBatchResult()

CODE_REVIEW 模块消息

#commanddata 字段说明Java 处理方法
58review{filePath, content, diff}代码审查CodeReviewService.review()
59getReviewResult{reviewId}获取审查结果CodeReviewService.getReviewResult()
60dismissReview{reviewId}忽略审查CodeReviewService.dismissReview()

3.4 handleRequest / handleAgentAction 方法映射

Java 端 WebViewWindowPanel 的两个核心消息接收方法:

handleRequest(jsonString) — 通用消息处理

java
void handleRequest(String json) {
    MessageDTO msg = gson.fromJson(json, MessageDTO.class);
    String module = msg.getModule();
    String command = msg.getCommand();
    Object data = msg.getData();

    switch (module) {
        case "CHAT":            chatService.handle(command, data); break;
        case "COMMON":          commonService.handle(command, data); break;
        case "LOGIN":           loginService.handle(command, data); break;
        case "UNIT_TEST":       unitTestService.handle(command, data); break;
        case "GIT":             gitService.handle(command, data); break;
        case "CODE_SEARCH":     codeSearchService.handle(command, data); break;
        case "SQL_CHAT":        sqlChatService.handle(command, data); break;
        case "SETTING":         settingService.handle(command, data); break;
        case "CODE_CHECK":      codeCheckService.handle(command, data); break;
        case "BATCH_UNIT_TEST": batchUnitTestService.handle(command, data); break;
        case "CODE_REVIEW":     codeReviewService.handle(command, data); break;
        default:
            log.warn("Unknown module: " + module);
    }
}

handleAgentAction(jsonString) — Agent 操作处理

java
void handleAgentAction(String json) {
    AgentActionDTO action = gson.fromJson(json, AgentActionDTO.class);
    String actionType = action.getActionType();

    switch (actionType) {
        case "readFile":        handleReadFile(action); break;
        case "writeFile":       handleWriteFile(action); break;
        case "editFile":        handleEditFile(action); break;
        case "searchCode":      handleSearchCode(action); break;
        case "runCommand":      handleRunCommand(action); break;
        case "runTest":         handleRunTest(action); break;
        case "gitOperation":    handleGitOperation(action); break;
        case "openFile":        handleOpenFile(action); break;
        case "showDiff":        handleShowDiff(action); break;
        case "applyDiff":       handleApplyDiff(action); break;
        case "createFile":      handleCreateFile(action); break;
        case "deleteFile":      handleDeleteFile(action); break;
        case "renameFile":      handleRenameFile(action); break;
        case "listFiles":       handleListFiles(action); break;
        case "getDiagnostics":  handleGetDiagnostics(action); break;
        case "askUser":         handleAskUser(action); break;
        default:
            log.warn("Unknown agent action: " + actionType);
    }
}

Part 4: 消息处理函数完整映射

4.1 Agent 操作类型与 Java 处理函数

Agent ActionJava 处理方法操作说明返回数据
readFilehandleReadFile()读取文件内容{content, filePath}
writeFilehandleWriteFile()写入文件{success, filePath}
editFilehandleEditFile()编辑文件 (带 diff){success, filePath, diff}
createFilehandleCreateFile()创建文件{success, filePath}
deleteFilehandleDeleteFile()删除文件{success, filePath}
renameFilehandleRenameFile()重命名文件{success, oldPath, newPath}
listFileshandleListFiles()列出文件{files: [...]}
searchCodehandleSearchCode()搜索代码{results: [...]}
runCommandhandleRunCommand()执行命令{output, exitCode}
runTesthandleRunTest()运行测试{results: [...]}
gitOperationhandleGitOperation()Git 操作{result}
openFilehandleOpenFile()打开文件{success}
showDiffhandleShowDiff()显示差异{success}
applyDiffhandleApplyDiff()应用差异{success, filePath}
getDiagnosticshandleGetDiagnostics()获取诊断{diagnostics: [...]}
askUserhandleAskUser()询问用户{response}

4.2 WebSocket 消息协议格式

Java→Agent (通过 WebSocket 发送)

json
{
    "module": "CHAT",
    "command": "sendMessage",
    "requestId": "uuid-xxx",
    "data": {
        "conversationId": "conv-xxx",
        "content": "用户输入",
        "mode": "agent"
    }
}

Agent→Java (通过 WebSocket 接收)

json
{
    "module": "CHAT",
    "command": "streamChunk",
    "requestId": "uuid-xxx",
    "data": {
        "messageId": "msg-xxx",
        "content": "AI 回复片段",
        "index": 5
    }
}

4.3 WebView 消息协议格式

JS→Java (通过 javaCallback 发送)

json
{
    "module": "CHAT",
    "command": "sendMessage",
    "data": {
        "conversationId": "conv-xxx",
        "content": "用户输入",
        "mode": "agent"
    }
}

Java→JS (通过 receiveData 发送)

json
{
    "type": "chatStreamChunk",
    "data": {
        "messageId": "msg-xxx",
        "content": "AI 回复片段",
        "index": 5
    }
}

Part 5: 完整消息流时序

5.1 用户发送聊天消息完整流程

用户在 WebView 输入消息


JS: sendMsgToIdea("CHAT", "sendMessage", {conversationId, content, mode})


Java: WebViewWindowPanel.handleRequest(json)


Java: ChatService.sendMessage(data)


Java: PluginWebsocketClient.send(jsonMessage)
  │  WebSocket 消息: {module: "CHAT", command: "sendMessage", data: {...}}


Agent: 接收消息,调用 LLM


Agent: 流式返回结果
  │  WebSocket 消息: {module: "CHAT", command: "streamChunk", data: {...}}


Java: SocketMessageListener.onMessage(json)


Java: ChatService.handleStreamChunk(data)


Java: WebViewWindowPanel.sendMessage2webView("chatStreamChunk", data)


JS: window.receiveData({type: "chatStreamChunk", data: {...}})


JS: handlerReceivedMsg → handleStreamChunk(data)


UI: 更新聊天界面显示

5.2 Agent 代码操作流程

Agent 决定修改文件


WebSocket: {module: "CHAT", command: "agentAction", data: {actionType: "editFile", ...}}


Java: SocketMessageListener → ChatService.handleAgentAction()


Java: WebViewWindowPanel.sendMessage2webView("agentAction", {actionType: "editFile", ...})


JS: receiveData → handleAgentAction(data)


JS: 显示 Diff 视图,等待用户确认


JS: sendMsgToIdea("CHAT", "applyCode", {messageId, codeBlock})


Java: WebViewWindowPanel.handleRequest → ChatService.applyCode()


Java: 执行文件修改操作


Java: WebViewWindowPanel.sendMessage2webView("codeApplyResult", {success: true, ...})


JS: 显示应用结果

附录: 关键类文件路径

路径
PluginStartupActivitycom/aicode/PluginStartupActivity.class
PluginStartupActivity$01com/aicode/PluginStartupActivity$01.class
PluginAgentCommandLinecom/aicode/agent/PluginAgentCommandLine.class
PluginAgentProcessHandlercom/aicode/agent/PluginAgentProcessHandler.class
PluginAgentProcessHandler$01com/aicode/agent/PluginAgentProcessHandler$01.class
PluginWebsocketClientcom/aicode/agent/PluginWebsocketClient.class
PluginWebsocketListenercom/aicode/agent/PluginWebsocketListener.class
SocketMessageListenercom/aicode/agent/SocketMessageListener.class
WebViewWindowPanelcom/aicode/view/WebViewWindowPanel.class
WebViewDataTypeEnumcom/aicode/enums/WebViewDataTypeEnum.class
ModuleEnumcom/aicode/agent/enums/ModuleEnum.class
CommandEnumcom/aicode/agent/enums/CommandEnum.class
InitServicecom/aicode/agent/service/InitService.class
PluginAgentProcessServiceImplcom/aicode/agent/service/PluginAgentProcessServiceImpl.class
RestartableAgentProcessServicecom/aicode/agent/service/RestartableAgentProcessService.class

本项目仅供学习研究,逆向分析内容归原厂商所有。