Files
SMB_Android/README.md
T

120 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SmbFast 极速 SMB 客户端
一个以**传输速度为第一目标**的安卓 SMB 客户端,基于 SMB2/SMB3 协议(SMBJ 库)+ Jetpack Compose Material3,专为局域网 NAS 场景打造。当前版本 **v20(1.18.0)**。
[English](#english) · 极光玻璃界面 · 后台不断连 · HyperOS 灵动岛
---
## ✨ 功能总览
- **连接管理**:添加/编辑/删除连接,支持域账号与匿名登录;「自动发现共享」一键枚举服务器上全部共享(自研 DCERPC srvsvc 枚举,fnOS/群晖/Samba/Windows 实测可用),**支持多选共享批量创建连接**
- **文件浏览**:目录浏览、面包屑导航、新建文件夹、重命名、删除、按类型显示图标
- **高速下载/上传**:下载与上传均为**多流条带并行**(默认 4 流、1MB 分块,可调 16 流 / 8MB),交错式写入对机械盘友好
- **后台传输**:前台服务(dataSync)+ WiFi 低延迟锁 + CPU 唤醒锁,退后台/熄屏不断连;通知栏显示进度与速度,可「全部停止」
- **HyperOS 灵动岛**:小米 HyperOS 2 焦点通知 / HyperOS 3 超级岛适配,传输进度上岛(其他品牌自动忽略、零副作用)
- **传输中心**:实时速度仪表(EMA 平滑)、会话峰值、失败任务一键重试、下载失败自动重试一次
- **健壮性**:填错 IP 5 秒内给出中文原因(TCP 预探测 + 异常链穿透翻译);下载前磁盘空间预检;上传自动改名防覆盖远端文件
- **安全**:NAS 凭据使用 AndroidKeyStore AES/GCM 加密存储;独立签名密钥
- **诊断**:崩溃与传输错误自动写入日志,设置页可查看/复制
## 🚀 为什么快
| 手段 | 说明 |
| --- | --- |
| SMB 3.1.1 协商 | 优先协商 SMB3(大 MTU),单请求 MaxRead/MaxWrite 可达 8MB(SMB2 仅 1MB) |
| 多流条带并行 | 大文件切成条带,每条带独立打开 SMB 句柄并行读写,靠 credits 在单 TCP 连接上流水线并发 |
| 轮转交错写入 | 各条带按块轮转推进,任意时刻写入聚在一个 ~8MB 连续窗口内整体前移——机械盘不再来回寻道,速度稳 |
| 大分块 | 减少 RTT 往返,请求粒度默认 1MB、可调 8MB(自动按服务器协商值截断) |
| 连接复用 | Connection / Session / Share 全程池化,浏览与续传无重复握手开销 |
| 关闭签名/加密 | 默认不做 SMB 签名与加密以换取吞吐(服务器强制时自动回退) |
| 本地零拷贝拼装 | FileChannel 定位写 + positioned read(pread),多协程并发安全 |
| 内存护栏 | 全部条带缓冲合计硬性上限 48MB,配置拉满也不会堆溢出闪退 |
> 实测建议:手机连 **5GHz Wi-Fi**、靠近路由器;NAS 开 SMB3(Windows 8+/Server 2012+ 默认开启)。千兆内网理论 ~110MB/s;手机无线一般可跑到 50~80MB/s。机械盘 NAS 追求稳定可把并行流数调到 2~4,固态盘 4~6。
## 📡 后台传输与灵动岛
- 传输任务自动拉起前台服务(`foregroundServiceType="dataSync"`),通知栏常驻进度(任务名、总进度条、速度),支持「全部停止」;任务结束服务自动退出
- 持有 `PARTIAL_WAKE_LOCK` + `WIFI_MODE_FULL_LOW_LATENCY`,熄屏不断流
- 小米 HyperOS:客户端本地上岛协议 `miui.focus.param`(`param` 双轨根节点兼容 HyperOS 2 / `param_v2` 兼容 HyperOS 3),首次上岛自动展开大岛,之后静默更新小岛;若系统未授予「焦点通知」权限则退回普通通知
- Android 14+ 对 dataSync 前台服务有单日累计 6 小时政策上限,常规传输足够
## 🛠 构建
要求:JDK 17+,Android SDK(platform 35、build-tools 34+)。Gradle 仓库默认走阿里云镜像(`settings.gradle.kts`),国内环境无需代理。
```bash
./gradlew :app:assembleDebug # 产物: app/build/outputs/apk/debug/app-debug.apk
./gradlew :app:assembleRelease # 签名 release(密钥库 smbfast.keystore 已含在仓库)
./gradlew :app:testReleaseUnitTest # 单元测试
```
`local.properties` 配置 `sdk.dir`。签名配置见 `app/build.gradle.kts`(store: `smbfast.keystore`)。
> ⚠️ 仓库内含签名密钥与密码,便于克隆后构建同签名 APK(升级不冲突)。**若要公开仓库,请先把密钥移出 git 历史并更换密码。**
## 📖 使用
1. 首页点 **+** 添加连接:填服务器 IP(如 `192.168.31.10`)、用户名密码(或勾选匿名)
2. 点「自动发现共享」枚举全部共享 → **可连点多个胶囊批量勾选** → 「测试并连接(N 个)」一次建多条连接
3. 浏览目录,点文件操作菜单选择 **下载 / 下载并打开**;工具栏可上传本机文件
4. 「传输」页看实时速度与峰值;失败任务点 ↻ 重试
5. 设置页可调并行流数、分块大小、查看下载目录与错误日志
下载保存位置:优先 `Download/SMBFast/`,受限存储回退应用私有目录。
### 局域网分发
电脑(如 `192.168.31.3`)在 `dist/` 目录起 `python -m http.server 8080`,手机浏览器访问 `http://192.168.31.3:8080/SmbFast-release-v20.apk` 直接安装,避免聊天工具传输截断(「解析软件包出现问题 33」多为此因)。
## 🧪 测试
- `ShareParseTest`:用真实 fnOS 服务器抓取的 NetShareEnumAll 响应(884 字节样本)做回归,锁定 DCERPC 解析正确性
- `PathsTest`:SMB 路径工具(拼接/父路径/文件名)回归
## 📁 项目结构
```
app/src/main/java/com/smbfast/app/
├── smb/ # SMBJ 封装:连接池、错误翻译、自研 DCERPC 共享枚举、多流传输引擎
├── transfer/ # 传输管理器(任务队列/进度/重试)+ 前台服务(保活/通知/灵动岛)
├── ui/ # Compose 界面:极光组件库、全屏连接编辑器、浏览/传输/设置页
├── data/ # 连接配置与设置(AndroidKeyStore 加密持久化)
└── util/ # 崩溃日志、文件工具
```
## 📜 版本历程
| 版本 | 主要变化 |
| --- | --- |
| 1.0 ~ 1.8 | 基础功能、Compose 界面、多流下载、崩溃日志体系、DCERPC 共享枚举字节级攻坚(fnOS 实测) |
| 1.9.0 (v11) | 连接编辑改为全屏分区页面,视觉全面华丽化 |
| 1.10.0 (v12) | 共享多选、批量建连;整体 UI 缩小一号 |
| 1.11.0 (v13) | 前台服务保活 + WiFi/CPU 锁,修复后台传输被系统断连 |
| 1.12.0 (v14) | 上传多流条带化;修复条带句柄互相截断的 bug |
| 1.13 ~ 1.14 (v15/v16) | HyperOS 焦点通知/超级岛适配;修复横幅轰炸(islandFirstFloat 只在首条生效)与双轨协议 |
| 1.15.0 (v17) | TCP 预探测 + 异常链穿透翻译:填错 IP 5 秒内中文报错 |
| 1.16.0 (v18) | 编辑模式同样支持多选共享(当前连接用第一个,其余新建) |
| 1.17.0 (v19) | 内存护栏、下载自动重试、空间预检、上传防覆盖、凭据加密、通知「全部停止」 |
| 1.18.0 (v20) | 全局单层极光背景,修复切页闪烁 |
## ⚠️ 已知限制
- SMBJ 不支持 SMB3 Multichannel(多网卡聚合),多流并行在同一 TCP 连接上实现
- 暂不支持 SMB over QUIC / 直连 TLS,未做流媒体边下边播
- 下载断点续传未实现(失败重试为从头重传,已在路线图)
- HyperOS 岛能否点亮最终取决于系统侧「焦点通知」权限,个别固件对侧载应用收紧
## <a id="english"></a>English
SmbFast is a speed-first SMB2/SMB3 client for Android (SMBJ + Jetpack Compose). Highlights: multi-stream striping transfers with rotationally-interleaved writes, persistent foreground service with WiFi/CPU wakelocks for background transfers, Xiaomi HyperOS Focus-Notification/"Super Island" integration, batch share discovery & multi-select connection creation (hand-rolled DCERPC srvsvc enumeration), AndroidKeyStore-encrypted credentials, and a glitch-free single global aurora UI. Build with JDK 17 + Android SDK 35: `./gradlew :app:assembleRelease`.
## 🧰 技术栈
Kotlin · Jetpack Compose (Material 3) · SMBJ 0.15.0 (SMB2/SMB3) · BouncyCastle · Gson · Coroutines · AndroidKeyStore
## 📄 许可
个人项目,仅供学习交流。请遵守所在网络环境的服务条款,勿用于未授权的文件访问。