最近的笔记
点击标题展开全文01 Android 深链 Scheme 的注册与校验
声明 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 与原生通道的一次排查
MethodChannel 的回调默认在主线程,但原生侧如果在子线程里 invokeMethod,
不切回主线程就会出现“偶尔收不到”的玄学问题。包一层 runOnUiThread 就干净了。
另一个常被忽略的点:新增插件后热重载不会注册,必须完全重启进程,
否则抛 MissingPluginException,看起来像代码写错。
03 构建产物体积的几个取舍
按 ABI 拆分能明显减小单个产物,但分发的文件变多,版本管理和用户选择成本都会上升; 全量包省事,代价是每个用户多下几十 MB。
资源压缩和混淆能再挤出一截,构建时间却会翻倍。 如果发布频率高,把这些放到 CI 的夜间任务里更划算。
还有一个容易忽略的:图标和字体的“全量打包”往往比代码更占体积,先查这里收益最明显。
04 用 STOMP over WebSocket 做实时消息
心跳不要只依赖 TCP 层,应用层的 CONNECTED 帧才是真正可信的连接状态;
断线重连用指数退避,避免服务端重启瞬间被客户端打满。
订阅要在页面销毁时 unsubscribe;
重复订阅同一个 destination 会让回调触发多次,表现就是“消息重复”。
05 多租户拦截器的边界
插件式租户拦截只对注册过的表生效,手写 SQL、视图、联表查询都能绕过去。 所以“加了拦截器就安全”是错觉,关键接口还是要在服务层再校验一次。
排查时最快的办法是把最终执行的 SQL 打出来,看有没有自动拼上租户条件,比读拦截器源码直观。
06 局域网大文件传输的两个参数
想支持断点续传,服务端必须回 Accept-Ranges 并正确处理 Range 请求,
返回 206 而不是整包 200,否则客户端进度会一直从 0 重来。
传完一定要做一次摘要校验。网络看起来正常、文件却少几十 KB 的情况,比想象中多。
07 Room 迁移里的隐形炸弹
fallbackToDestructiveMigration() 能让你在开发期少写一堆迁移脚本,
但它上线后意味着“升级即清库”。有本地缓存的场景,用户会直接丢数据,而且没有任何报错。
稳妥的做法是每次升级都补迁移,再用 MigrationTestHelper 跑一遍旧版本数据;
实在要临时用它,至少限定在 debug 构建里。
08 Compose 重组次数怎么看
先开 Layout Inspector 的 recomposition 计数,能直观看到哪个组件在疯狂重组; 比凭感觉猜“是不是 state 放错位置了”快很多。
常见来源是 lambda 每次重建导致参数不稳定、以及把大对象塞进 remember 的依赖列表。
能 remember 就 remember,能用 derivedStateOf 就别直接算。
09 Nginx 反代 WebSocket 的两个头
Upgrade 和 Connection 两个头必须透传,缺一个就会一直 400;
同时要把 proxy_read_timeout 调大,否则空闲一会儿就被断开,表现为“每分钟重连一次”。
排查时先看 nginx -T 有没有落到正确的 server 块——配置写在错的 server 里,改动是无效的。
10 索引失效的几种常见写法
字段上套函数、隐式类型转换、前导模糊匹配,这三类最容易让索引白建。 尤其是字符串列传了数字参数,MySQL 会做隐式转换,索引直接失效。
看执行计划别只看 type,rows 和 filtered 更能说明问题;
有时候 Using index 也未必是好事——覆盖索引扫全表一样慢。
11 Git 里安全撤回一次误提交
还没推送:git reset --soft HEAD~1 把提交退回暂存区,改动一点不丢;
已经推送:用 git revert 生成一个反向提交,别对共享分支做 force push。
误提交了大文件的情况,光 revert 不够,历史里依然有大对象;要么用 filter-repo 重写,
要么就接受这个仓库会一直偏大。
12 给博客加一层粒子背景的取舍
这一版用 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
最近在做
按时间倒序-
给笔记站换了一套纸墨排版
首页改成纸白底、衬线标题和发丝线分栏,删掉渐变与厚投影,只留下留白和线。
-
整理旧笔记
把散在各个文档里的踩坑记录搬到一起,删掉一半“当时觉得重要、现在看来只是没读文档”的内容。
-
补协议栈的底子
重读《计算机网络:自顶向下方法》,很多以前“能用就行”的地方,终于想通了为什么。
-
开始写这个站
一个纯静态的个人笔记站:不追热点,不做聚合,只写自己真正花时间搞明白的事。
关于
日常工作围绕移动端和网络协议,偶尔也写一点后端。 这个站用来存放自己的技术笔记,内容都是个人整理,不代表任何机构。
写笔记的标准只有一个:三个月后自己还能照着它把问题再解决一遍。 所以这里很少有“某某技术介绍”,多是“我在这里踩了个坑,后来这么绕过去的”。
如果内容对你有帮助,或者发现哪里写错了,欢迎邮件交流:
hi@lycat.top
关于本站
- 个人技术笔记,非经营性站点
- 纯静态页面,无注册登录、无评论
- 不投放广告,不收集个人信息
- 内容范围:Android / Flutter / 网络 / 后端
- 前端:原生 HTML + CSS + 少量 WebGL