Kotlin + Material Design, 覆盖版块浏览、帖子阅读、回复/发帖、个人中心、多账号、人机验证兜底等功能。
本仓库基于 MTForum v2.2 (build83) 源码做二次修正,非官方,与论坛站点及原作者无关。 当前版本 v2.3.4。
minifyEnabled false(proguard-rules.pro已接上但未启用混淆)。项目大量依赖 Jsoup 反射式 解析与viewBinding,且ThreadDetailActivity是反编译产物,开启混淆需先补 keep 规则并回归。
.
├── build.gradle # 根配置
├── settings.gradle
├── gradle.properties
├── gradlew / gradlew.bat
├── gradle/
│ ├── libs.versions.toml # 依赖版本
│ └── wrapper/
├── app/
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/main/
│ ├── AndroidManifest.xml
│ ├── java/com/solosu/mtforum/
│ │ ├── network/ # HttpClient / ForumParser / WafChallenge / RateLimiter
│ │ ├── session/ # 登录态 / 多账号 / 黑名单
│ │ ├── ui/ # 各页面与自定义控件
│ │ ├── adapter/ model/ util/ # util 含 AiLog(运行日志)
│ └── res/ # 布局 / 资源
└── README.md
OkHttp(网络)、Jsoup(HTML 解析)、Glide(图片)、Material Components(UI)、 ViewPager2、DrawerLayout、SwipeRefreshLayout、RecyclerView。
全量 Kotlin(103 个 .kt,0 个 .java)。迁移前的 Java 基线为 27,553 行 / 76 个文件。
迁移实测要点见 KOTLIN_MIGRATION.md,其中 27 条规则均由本项目 编译错误倒推。典型几条:
- Kotlin 只对
is开头的属性名生成isXxx(),其余生成getXxx()。故hasImage/followed/likedStateKnown等需@get:JvmName固定方法名。 object的公开成员需@JvmStatic才有静态形式;public 字段需@JvmField。- 不用
data class:其equals/hashCode值语义与「解析器逐字段填充」的用法不符。
代码基线本身是反编译产物(
ThreadDetailActivity含 117 个lambda$合成方法), 迁移时把这些合成方法内联回了原调用点,逻辑与参数顺序保持一致。
- 评论区:用户名不透明度改为 80%;表情内联图统一缩放至 24dp(原按图片原始像素显示,在 高密度屏上只有约 7dp);楼中楼「本帖最后由…编辑」整句剥离,时间改显示在用户名行末; 「回复 xxx:」前缀改为小一号斜体。
- 楼中楼:修复子回复附件图不显示(恢复 file/zoomfile 里的真实地址),修复图片无法点击放大。
- 帖子详情:正文里与文字同行的图片改为独占一行,消除文字中间与图片下方的大片空白; 版块名由标题下方移至顶栏右侧。
- 帖子列表:卡片左右边距与卡片间距对齐「热帖排行」(左右 6dp、间距 5dp)。
- 发帖/评论插入面板对齐网页端:文字链接补「链接文字」输入框;免费信息、隐藏内容改为多行并 补回对应提示;隐藏内容支持「积分大于」「隐藏天数」参数(不填即回复可见)。
- 修复附件/图片上传解析崩溃:Kotlin
Regex.split不能接收 Java 习惯的limit=-1, 该值会抛IllegalArgumentException(表现为 toast「Limit must be non-negative, but was -1」), 导致服务端上传已成功却解析不出 aid、附件未插入正文。
- 移除整个 AI 模块与自动化:AI 助手/一键总结/AI 接口配置、自动回复与自动解锁隐藏内容、 演练模式、自动签到,以及发帖页「优化」「AI发帖」入口与相关逻辑。
AiLog(侧边栏「运行日志」)保留,并由ai/迁至util/。- 侧边栏重排为:主题设置 / 人机验证 / 底部栏自动隐藏 / 运行日志 / 设置;设置与主题设置入口 由「我的」页迁移至侧边栏。
- 修复连续切换主题时的闪退(后台线程在 Fragment 解绑后调用
requireActivity())。
- 代码基线为 build83 (v2.2),当前开发版本 v2.3.4。
HttpClient.USER_AGENT写死为三星 S918B / Chrome 120;站点风控严时可调整。bbs.binmt.cc挂了阿里云 ESA,请求过频会被 IP 级拦截,勿短时间连发。WafChallenge的置换表与 XOR 密钥取自站点当前挑战实现,站点改版后会失配。 失配时不会静默:HttpClient.DEBUG_WAF打开时会记录命中挑战页但求解失败(算法可能已失配)。