rwadurian/backend/mpc-system/services/service-party-android
hailin 26ef03a1bc fix(android): 配置 OkHttpClient 连接池并添加资源清理 [P1-2]
【架构安全修复 - 防止 OkHttpClient 资源泄漏】

## 问题背景

OkHttpClient 内部维护多种资源:
1. ConnectionPool - 连接池,复用 HTTP 连接
2. Dispatcher - 调度器,管理线程池
3. Cache - 可选的响应缓存

如果不配置连接池参数和不清理资源,会导致:
1. 连接池无限增长 → 内存泄漏
2. 空闲连接永久保持 → 占用系统资源(文件描述符、Socket)
3. Dispatcher 线程池未关闭 → 线程泄漏

## 修复方案

### 1. 配置连接池参数

限制连接池大小和空闲连接保活时间:
- maxIdleConnections: 5 (最多保留 5 个空闲连接)
- keepAliveDuration: 5 分钟 (空闲连接保活时间)

修改位置:
- TssRepository.kt httpClient
- TransactionUtils.kt client

代码示例:

### 2. 在 cleanup() 中清理资源

TssRepository.cleanup() 中添加:

### 3. TransactionUtils 提供清理方法

虽然 TransactionUtils 是 object 单例,但提供 cleanup() 方法允许:
1. 测试环境清理资源
2. 应用完全退出时释放资源
3. 内存紧张时主动清理

## 修复的内存泄漏风险

### 场景 1: 连接池无限增长
- 原问题: 没有配置 maxIdleConnections,连接池可能无限增长
- 后果: 每个连接占用一个 Socket,文件描述符耗尽 → 无法创建新连接
- 修复: 限制最多 5 个空闲连接

### 场景 2: 空闲连接永久保持
- 原问题: 没有配置 keepAliveDuration,空闲连接永久保持
- 后果: 占用服务器资源,网络中间设备可能断开长时间不活动的连接
- 修复: 5 分钟后自动关闭空闲连接

### 场景 3: 应用退出时资源未释放
- 原问题: cleanup() 没有清理 OkHttpClient 资源
- 后果: 线程池和连接未关闭,延迟应用退出,可能导致 ANR
- 修复: cleanup() 中显式关闭连接池和调度器

### 场景 4: Activity 快速重建时资源累积
- 原问题: 虽然 TssRepository 是单例,但快速重建时临时创建的 client 未清理
- 后果: 临时 client 的资源累积(如 getBalance, getTokenBalance 中的临时 client)
- 注意: 这些临时 client 应该使用共享的 httpClient 而非每次创建新的

## 影响范围

### 修改的文件
1. TssRepository.kt
   - 配置 httpClient 的 ConnectionPool
   - cleanup() 中添加 OkHttpClient 资源清理

2. TransactionUtils.kt
   - 配置 client 的 ConnectionPool
   - 添加 cleanup() 方法

### 行为变化
- BEFORE: 连接池无限制,资源不清理
- AFTER: 连接池限制 5 个空闲连接,5 分钟保活,cleanup() 时释放所有资源

## 测试验证

编译状态:  BUILD SUCCESSFUL in 39s
- 无编译错误
- 仅有警告 (unused parameters),不影响功能

## 潜在改进

建议进一步优化:
1. 统一使用单例 OkHttpClient - 避免在 TssRepository 中创建多个临时 client
2. 监控连接池使用情况 - 添加日志记录连接池大小
3. 根据实际使用调整参数 - 如果并发请求较多,可增大 maxIdleConnections

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-26 21:47:39 -08:00
..
app fix(android): 配置 OkHttpClient 连接池并添加资源清理 [P1-2] 2026-01-26 21:47:39 -08:00
contracts feat(blockchain): 切换到dUSDT(绿积分)合约 - KAVA主网 2026-01-02 04:31:11 -08:00
gradle/wrapper feat(android): add Android TSS Party app with full API implementation 2025-12-31 23:27:29 -08:00
tsslib feat(tss): add real-time round progress from msg.Type() parsing 2026-01-01 22:41:51 -08:00
.gitignore feat(android): strengthen gRPC connection reliability 2026-01-01 06:44:42 -08:00
IMPLEMENTATION_PLAN.md feat(android): 实现 2-of-3 钱包服务器备份参与签名功能 2026-01-26 17:32:36 -08:00
README.md feat(android): add Android TSS Party app with full API implementation 2025-12-31 23:27:29 -08:00
build-apk.bat fix(android): simplify build-apk.bat with official gomobile setup 2026-01-01 00:53:04 -08:00
build.gradle.kts feat(android): add Android TSS Party app with full API implementation 2025-12-31 23:27:29 -08:00
gradle.properties feat(android): add Android TSS Party app with full API implementation 2025-12-31 23:27:29 -08:00
gradlew feat(android): add Android TSS Party app with full API implementation 2025-12-31 23:27:29 -08:00
gradlew.bat feat(android): add Android TSS Party app with full API implementation 2025-12-31 23:27:29 -08:00
settings.gradle.kts feat(android): add Android TSS Party app with full API implementation 2025-12-31 23:27:29 -08:00

README.md

TSS Party Android

Android 版本的 TSS (Threshold Signature Scheme) Party 应用,用于多方共管钱包的密钥生成和签名。

项目结构

service-party-android/
├── app/                          # Android 应用模块
│   ├── src/main/
│   │   ├── java/com/durian/tssparty/
│   │   │   ├── data/             # 数据层
│   │   │   │   ├── local/        # 本地存储 (Room, TSS Bridge)
│   │   │   │   ├── remote/       # 远程通信 (gRPC)
│   │   │   │   └── repository/   # 数据仓库
│   │   │   ├── domain/model/     # 领域模型
│   │   │   ├── presentation/     # UI 层
│   │   │   │   ├── screens/      # Compose 屏幕
│   │   │   │   └── viewmodel/    # ViewModels
│   │   │   ├── di/               # Hilt 依赖注入
│   │   │   ├── ui/theme/         # Material Theme
│   │   │   └── util/             # 工具类
│   │   ├── proto/                # gRPC Proto 文件
│   │   └── res/                  # Android 资源
│   └── libs/                     # TSS 原生库 (.aar)
├── tsslib/                       # Go TSS 库源码
│   ├── tsslib.go                 # gomobile 绑定
│   ├── go.mod
│   ├── build.sh                  # Linux/macOS 构建脚本
│   └── build.bat                 # Windows 构建脚本
└── gradle/                       # Gradle Wrapper

技术栈

  • UI: Jetpack Compose + Material 3
  • 架构: MVVM + Repository Pattern
  • 依赖注入: Hilt
  • 数据库: Room
  • 网络: gRPC (protobuf-lite)
  • TSS 核心: Go + gomobile (BnB Chain tss-lib v2)

构建步骤

1. 构建 TSS 原生库 (可选,需要 Go 环境)

# 安装 gomobile
go install golang.org/x/mobile/cmd/gomobile@latest
gomobile init

# 构建 Android AAR
cd tsslib
./build.sh  # Linux/macOS
# 或
build.bat   # Windows

这将在 app/libs/ 生成 tsslib.aar

注意: 当前版本使用 Kotlin stub 实现,无需编译 Go 库即可构建 APK。 实际运行需要真正的 tsslib.aar

2. 构建 APK

# Debug 版本
./gradlew assembleDebug

# Release 版本 (需要签名配置)
./gradlew assembleRelease

APK 输出路径: app/build/outputs/apk/debug/app-debug.apk

功能

  1. 加入 Keygen 会话 - 扫描/输入邀请码,参与多方密钥生成
  2. 查看钱包 - 显示已创建的共管钱包列表
  3. 签名交易 - 使用密钥份额参与多方签名
  4. 设置 - 配置 Message Router 服务器地址

配置

默认服务器配置:

  • Message Router: localhost:50051
  • Kava RPC: https://evm.kava.io

与 Electron 版本的对应关系

Electron 版本 Android 版本
electron/main.ts TssNativeBridge.kt + GrpcClient.kt
electron/preload.ts TssRepository.kt
src/pages/*.tsx presentation/screens/*.kt
tss-party/ (Go 子进程) tsslib/ (gomobile .aar)
sql.js Room Database

许可证

MIT