个人技术笔记 · 持续更新

把踩过的坑
记成能翻的页

Android、Flutter、网络协议,偶尔也写一点后端。 不追热点,只把真正花了时间才搞明白的事情写清楚。

最近的笔记

点击标题展开全文
筛选
01 Android 深链 Scheme 的注册与校验 Android网络 2026-10 · 3 分钟

声明 intent-filter 时 scheme 要小写,host 和 pathPrefix 是逐段比较的; 少一个斜杠就会静默匹配不上,只在系统日志里留一行 warning。

加上 autoVerify 之后,系统会去拉 /.well-known/assetlinks.json, 这个文件必须是 application/json 且不能跳转,否则验证状态会一直灰着。

自测最快的还是命令行:adb shell am start -a android.intent.action.VIEW -d "demo://host/path", 比在 App 里反复点链接可靠得多。

02 Flutter 与原生通道的一次排查 Flutter 2026-09 · 3 分钟

MethodChannel 的回调默认在主线程,但原生侧如果在子线程里 invokeMethod, 不切回主线程就会出现“偶尔收不到”的玄学问题。包一层 runOnUiThread 就干净了。

另一个常被忽略的点:新增插件后热重载不会注册,必须完全重启进程, 否则抛 MissingPluginException,看起来像代码写错。

03 构建产物体积的几个取舍 构建Android 2026-09 · 4 分钟

按 ABI 拆分能明显减小单个产物,但分发的文件变多,版本管理和用户选择成本都会上升; 全量包省事,代价是每个用户多下几十 MB。

资源压缩和混淆能再挤出一截,构建时间却会翻倍。 如果发布频率高,把这些放到 CI 的夜间任务里更划算。

还有一个容易忽略的:图标和字体的“全量打包”往往比代码更占体积,先查这里收益最明显。

04 用 STOMP over WebSocket 做实时消息 网络后端 2026-09 · 3 分钟

心跳不要只依赖 TCP 层,应用层的 CONNECTED 帧才是真正可信的连接状态; 断线重连用指数退避,避免服务端重启瞬间被客户端打满。

订阅要在页面销毁时 unsubscribe; 重复订阅同一个 destination 会让回调触发多次,表现就是“消息重复”。

05 多租户拦截器的边界 后端数据库 2026-08 · 3 分钟

插件式租户拦截只对注册过的表生效,手写 SQL、视图、联表查询都能绕过去。 所以“加了拦截器就安全”是错觉,关键接口还是要在服务层再校验一次。

排查时最快的办法是把最终执行的 SQL 打出来,看有没有自动拼上租户条件,比读拦截器源码直观。

06 局域网大文件传输的两个参数 网络 2026-08 · 2 分钟

想支持断点续传,服务端必须回 Accept-Ranges 并正确处理 Range 请求, 返回 206 而不是整包 200,否则客户端进度会一直从 0 重来。

传完一定要做一次摘要校验。网络看起来正常、文件却少几十 KB 的情况,比想象中多。

07 Room 迁移里的隐形炸弹 Android 2026-08 · 3 分钟

fallbackToDestructiveMigration() 能让你在开发期少写一堆迁移脚本, 但它上线后意味着“升级即清库”。有本地缓存的场景,用户会直接丢数据,而且没有任何报错。

稳妥的做法是每次升级都补迁移,再用 MigrationTestHelper 跑一遍旧版本数据; 实在要临时用它,至少限定在 debug 构建里。

08 Compose 重组次数怎么看 Android性能 2026-07 · 4 分钟

先开 Layout Inspector 的 recomposition 计数,能直观看到哪个组件在疯狂重组; 比凭感觉猜“是不是 state 放错位置了”快很多。

常见来源是 lambda 每次重建导致参数不稳定、以及把大对象塞进 remember 的依赖列表。 能 remember 就 remember,能用 derivedStateOf 就别直接算。

09 Nginx 反代 WebSocket 的两个头 运维 2026-07 · 2 分钟

Upgrade 和 Connection 两个头必须透传,缺一个就会一直 400; 同时要把 proxy_read_timeout 调大,否则空闲一会儿就被断开,表现为“每分钟重连一次”。

排查时先看 nginx -T 有没有落到正确的 server 块——配置写在错的 server 里,改动是无效的。

10 索引失效的几种常见写法 数据库 2026-07 · 3 分钟

字段上套函数、隐式类型转换、前导模糊匹配,这三类最容易让索引白建。 尤其是字符串列传了数字参数,MySQL 会做隐式转换,索引直接失效。

看执行计划别只看 type,rows 和 filtered 更能说明问题; 有时候 Using index 也未必是好事——覆盖索引扫全表一样慢。

11 Git 里安全撤回一次误提交 工具 2026-06 · 2 分钟

还没推送:git reset --soft HEAD~1 把提交退回暂存区,改动一点不丢; 已经推送:用 git revert 生成一个反向提交,别对共享分支做 force push。

误提交了大文件的情况,光 revert 不够,历史里依然有大对象;要么用 filter-repo 重写, 要么就接受这个仓库会一直偏大。

12 给博客加一层粒子背景的取舍 前端性能 2026-10 · 2 分钟

这一版用 three.js 画了一层会呼吸的点阵,GSAP 负责入场和滚动出现。 库都放在本地 vendor/,不走 CDN,国内打开更快也不会被墙拖慢。

three.js 是动态 import() 的,只在首屏可见且用户没开“减少动效”时才加载; 手机端自动降低点数,页面切到后台就暂停渲染——好看不能以掉帧为代价。

常用技术栈

顺手记录,不代表精通

移动端

  • Kotlin
  • Dart
  • Flutter
  • Jetpack Compose
  • Android SDK

服务端

  • Java
  • Spring Boot
  • MyBatis
  • MySQL
  • Redis

工程与运维

  • Git
  • Gradle
  • Nginx
  • Docker
  • CI

最近在做

按时间倒序
  1. 给笔记站换了一套纸墨排版

    首页改成纸白底、衬线标题和发丝线分栏,删掉渐变与厚投影,只留下留白和线。

  2. 整理旧笔记

    把散在各个文档里的踩坑记录搬到一起,删掉一半“当时觉得重要、现在看来只是没读文档”的内容。

  3. 补协议栈的底子

    重读《计算机网络:自顶向下方法》,很多以前“能用就行”的地方,终于想通了为什么。

  4. 开始写这个站

    一个纯静态的个人笔记站:不追热点,不做聚合,只写自己真正花时间搞明白的事。

关于

喵猫 移动端开发 / 喜欢折腾

日常工作围绕移动端和网络协议,偶尔也写一点后端。 这个站用来存放自己的技术笔记,内容都是个人整理,不代表任何机构。

写笔记的标准只有一个:三个月后自己还能照着它把问题再解决一遍。 所以这里很少有“某某技术介绍”,多是“我在这里踩了个坑,后来这么绕过去的”。

如果内容对你有帮助,或者发现哪里写错了,欢迎邮件交流: hi@lycat.top

关于本站

  • 个人技术笔记,非经营性站点
  • 纯静态页面,无注册登录、无评论
  • 不投放广告,不收集个人信息
  • 内容范围:Android / Flutter / 网络 / 后端
  • 前端:原生 HTML + CSS + 少量 WebGL