📄🦌🙌🐟🏖️
ccc2
探 索 星 辰 大 海
精选文章
按住 Shift 横向滚动
我收集的性能优化资料和工具链

我收集的性能优化资料和工具链

我收集的性能优化资料和工具链 我收集的性能优化资料和工具链 Android 性能优化这个领域有个特点:官方文档永远滞后于实际需求,社区里的经验贴又往往停留在"打开 Profile GPU Rendering 看看红条"这种层面。过去五年里我陆陆续续攒了一些真正在生产环境验证过的工具、文档和调试思路,

国内安卓厂商的推送联盟,到底救活了没有

国内安卓厂商的推送联盟,到底救活了没有

国内安卓厂商的推送联盟,到底救活了没有 国内安卓厂商的推送联盟,到底救活了没有 推送这件小事,怎么就成了安卓中国的绝症 国内安卓生态有个老笑话:你的 App 明明已经杀了后台,凌晨三点它还是能爬起来给你推一条"您关注的商品降价了"。这不是什么黑科技,是厂商自己的推送通道在搞鬼——但换个 App,同样

Android 15 预测性返回手势,我试了一下

Android 15 预测性返回手势,我试了一下

Android 15 预测性返回手势,我试了一下 Android 15 预测性返回手势,我试了一下 Android 15 在 2024 年 9 月正式发布,预测性返回手势(Predictive Back Gesture)从开发者选项里的实验性功能变成了系统默认行为。这个特性最早在 Android 1

Gradle 构建慢的问题,有人找到了新解法

Gradle 构建慢的问题,有人找到了新解法

Gradle 构建慢的问题,有人找到了新解法 「Gradle 构建慢的问题,有人找到了新解法」 从那个熟悉的 coffee break 说起 每个 Android 开发者都经历过这种时刻:按完 Run 键,看着 Gradle 进度条开始蠕动,然后起身去接水、上厕所、跟同事寒暄一圈回来,发现还在 "R

Dynamic Feature Module 上线一年后的真实体验

Dynamic Feature Module 上线一年后的真实体验

Dynamic Feature Module 上线一年后的真实体验 「Dynamic Feature Module 上线一年后的真实体验」 去年 Q2 我们把一个 28MB 的安装包拆成了 base + 3 个 dynamic feature module,当时团队内部的预期很乐观:用户冷启动只下载

这几个 GitHub 仓库,帮我省了不少时间

这几个 GitHub 仓库,帮我省了不少时间

这几个 GitHub 仓库,帮我省了不少时间 这几个 GitHub 仓库,帮我省了不少时间 从一次 CI 崩溃说起 去年维护一个老项目时,我们的 GitHub Actions 流水线突然开始随机失败。错误日志很干净,没有任何 stack trace,只有一行 "Process completed w

Compose Multiplatform 真的能用吗?踩坑记录

Compose Multiplatform 真的能用吗?踩坑记录

Compose Multiplatform 真的能用吗?踩坑记录 Compose Multiplatform 真的能用吗?踩坑记录 从一次失败的 Demo 开始 去年十月份,手边一个内部工具需要同时支持 Android 和桌面端。团队里就我一个 Android 开发,再招一个 Desktop 的人不

某大厂 App 又崩了,根因可能不是你想的那样

某大厂 App 又崩了,根因可能不是你想的那样

某大厂 App 又崩了,根因可能不是你想的那样 某大厂 App 又崩了,根因可能不是你想的那样 从一次典型的"服务异常"说起 今年三月份,某头部电商 App 在晚间流量高峰时段出现了大规模服务不可用,用户反馈集中在商品详情页加载失败、购物车结算异常、优惠券无法领取几个场景。官方事后给出的公告是"部分

Android 开发值得关注的 newsletter 和播客

Android 开发值得关注的 newsletter 和播客

Android 开发值得关注的 newsletter 和播客 Android 开发值得关注的 newsletter 和播客 信息过载时代的筛选困境 Android 开发者面临的一个真实问题是:Google 官方博客、Medium 技术文章、Twitter/X 上的碎片化讨论、GitHub 的 rel

Kotlin 协程的 Job 和 SupervisorJob 差别在哪

Kotlin 协程的 Job 和 SupervisorJob 差别在哪

Kotlin 协程的 Job 和 SupervisorJob 差别在哪 Kotlin 协程的 Job 和 SupervisorJob 差别在哪 去年维护一个后台任务调度模块的时候,我踩到了一个协程异常处理的坑。当时代码大概长这样: val scope = CoroutineScope(Job() +