ConcurrentLinkedQueue 的无锁队列,适合什么场景 ConcurrentLinkedQueue 的无锁队列,适合什么场景 「ConcurrentLinkedQueue 的无锁队列,适合什么场景」 去年在优化一个相机预览模块的帧缓冲区时,我把原来的 LinkedBlockingQueue 换成了 ConcurrentLinkedQueue。当时的想法很 2026-08-06 Android 3
Shizuku 权限方案,无 Root 调用系统 API 的实践 Shizuku 权限方案,无 Root 调用系统 API 的实践 「Shizuku 权限方案,无 Root 调用系统 API 的实践」 Android 14 上,我尝试在应用内直接通过反射关闭另一个应用的通知权限。代码刚跑起来就收到了一个无情的 SecurityException,日志很直白:uid 2026-08-06 Android 4
DocumentsContract 的树形文档访问,SAF 的局限 DocumentsContract 的树形文档访问,SAF 的局限 「DocumentsContract 的树形文档访问,SAF 的局限」 去年把文件管理模块重构到纯 SAF(Storage Access Framework)方案时,我在 Android 11 的测试机上遇到一个极其诡异的权限崩溃。 2026-08-03 Android 12
Macrobenchmark 测出来的启动时间,跟真实用户差多少 Macrobenchmark 测出来的启动时间,跟真实用户差多少 「Macrobenchmark 测出来的启动时间,跟真实用户差多少」 去年做完一轮启动优化,本地跑 Macrobenchmark 的数据看起来相当漂亮。StartupTimingMetric 测出来的 timeToInitialDis 2026-08-03 Android 0
Baseline Profile 启动优化实测,效果有多少 Baseline Profile 启动优化实测,效果有多少 Baseline Profile 启动优化实测,效果有多少 上个月在给一个 Jetpack Compose 项目做冷启动性能基线的时候,Macrobenchmark 跑出来的数据让我一度怀疑设备坏了。同一台 Pixel 7,同一个 APK, 2026-08-03 Android 0
Android 的 TTS 引擎选择,系统 vs 第三方 Android 的 TTS 引擎选择,系统 vs 第三方 「Android 的 TTS 引擎选择,系统 vs 第三方」 去年把 App 的 targetSdkVersion 升到 31(Android 12)之后,后台收到一条很诡异的崩溃链:用户在 Pixel 5 上点击播放按钮,应用直接闪退,堆栈 2026-07-31 Android 7
KMP 项目里的 expect/actual 是怎么工作的 KMP 项目里的 expect/actual 是怎么工作的 KMP 项目里的 expect/actual 是怎么工作的 去年把团队里的核心网络层从纯 Android 迁到 Kotlin Multiplatform 时,我碰到的第一个硬钉子不是协程在 Darwin 上的内存模型,也不是 CocoaPo 2026-07-31 Android 7
WebView 的 JsBridge 方案,现在还有必要吗 WebView 的 JsBridge 方案,现在还有必要吗 「WebView 的 JsBridge 方案,现在还有必要吗」 上个月处理一个老项目的性能工单,用户反馈在低端机上点击 H5 页面的按钮后,Native 端要卡将近半秒才有响应。抓 Systrace 一看,时间全耗在了一条 shouldOv 2026-07-29 Android 9
Notification Channel 的分组策略,太多渠道怎么办 Notification Channel 的分组策略,太多渠道怎么办 「Notification Channel 的分组策略,太多渠道怎么办」 做内容聚合类应用的工程师大概率都遇到过这个窘境:产品运营要求每个栏目单独开关通知,技术侧为了把控制权交给用户,在 Android O 之后为每个栏目都建了独 2026-07-29 Android 10
Choreographer 的帧回调,自己监听能做什么 Choreographer 的帧回调,自己监听能做什么 「Choreographer 的帧回调,自己监听能做什么」 去年把项目里的性能监控 SDK 从基于 Handler 的埋点方案切到 Choreographer 时,我满以为这只是一个简单的 API 替换。毕竟 Choreographer 从 A 2026-07-29 Android 7