惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

AI
AI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google DeepMind News
Google DeepMind News
T
Tenable Blog
博客园_首页
S
Securelist
Spread Privacy
Spread Privacy
Google Online Security Blog
Google Online Security Blog
Forbes - Security
Forbes - Security
Engineering at Meta
Engineering at Meta
U
Unit 42
L
LINUX DO - 热门话题
量子位
T
Threat Research - Cisco Blogs
博客园 - 【当耐特】
C
Cyber Attacks, Cyber Crime and Cyber Security
K
Kaspersky official blog
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
The Last Watchdog
The Last Watchdog
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
Martin Fowler
Martin Fowler
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Security Latest
Security Latest
Scott Helme
Scott Helme
V
Vulnerabilities – Threatpost
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
InfoQ
Know Your Adversary
Know Your Adversary
Cisco Talos Blog
Cisco Talos Blog
The Register - Security
The Register - Security
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
V2EX - 技术
V2EX - 技术
T
Tailwind CSS Blog
月光博客
月光博客
Recent Announcements
Recent Announcements
G
Google Developers Blog
F
Full Disclosure
W
WeLiveSecurity
宝玉的分享
宝玉的分享
腾讯CDC
G
GRAHAM CLULEY
Vercel News
Vercel News
Simon Willison's Weblog
Simon Willison's Weblog
美团技术团队
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Help Net Security
Help Net Security

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux - V2EX [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 新电脑 brew install node 之后,一个小设置可以提升对供应链投毒的防御 - V2EX GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? - V2EX 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? - V2EX gemini cli 貌似挂了,一直返回 403 - V2EX 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 - V2EX 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 - V2EX 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 - V2EX 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 - V2EX 只有我一个人觉得 codex 不好用? 做了个 AI + 真人专家监督的广告投放平台 Auxora, 7 个品牌跑出 6x ROAS 如何走出至亲的离世 Claude Web 端貌似 claude-opus-4-7 偷偷上了? 现在 Apple 开发者帳號應該是用哪个地区会更好? - V2EX 用回测筛选因子的一点经验分享 给女儿 vibe 了一个故事类的 app,做完发现,这类应用似乎上线难度极大? - V2EX 手机格式化 bitget 钱包没了,里面开通的银行卡还有机会拿到吗 - V2EX [送码] TransVoice - 我的第一款 App 上架啦!实时转写+翻译+字幕,会议听课好助手! PictureHub 高清摄影作品的画廊 Planet 的第一个使用 macOS 26 SDK 构建的 Insider 版本 20260416-1 - V2EX 成都二手房是不是在涨价,有点坐不住了 - V2EX claude 生态(skill mcp plugin)等 Studio Display XDR VESA 适配器脱落 有在用印度区 applestore 的大哥嘛,请教一下礼品卡去哪里买呢 - V2EX 我好像知道京东家政爆火的原因了 - V2EX 薅了公司的 a 家 api key,用机场 ip 做代理容易被封吗 如何在初期就识别 HR 在刷 KPI,没打算招你? [分享]精心打造一个 AI 编程知识库(算法/设计模式/提示词/Skills),助力程序员转型 港版 iPhone 在国内支持联通 5GA 吗?在广东用 想办港卡 AI 对 it 行业影响太大了 我做了个把照片变成 iOS 小组件贴纸的 App ChatGPT Pro 5x 套餐 量真的很足! I have found a method to directly generate advertising video materials using scripts 在小城市开个店,给人写软件,有前途吗 chrome 最新的 147 版直接卡爆炸了 - V2EX 为什么厂家不在 skill/mcp 这类的工具中塞广告呢?这样不是可以大赚嘛? minimax 真是脸都不要了,工作日下午 14:00 定时开启 529,脸都不要了。训练模型居然占用用户使用时间 外资非核心部门 vs 另一家外资的核心部门,该跳吗? iTad 标签 扩展 加小动作 ? - V2EX 去年 H200 能买,不让买是代替快出来了? - V2EX AI 赛事通 - 2026 年 4 月中国区新增 AI 竞赛和黑客松汇总 - V2EX V2EX › 登录 现在安卓开发都在做啥 - V2EX 浏览器插件 沉浸式翻译 是不支持自定义模型了吗? - V2EX Codex 里的 GPT5.4 也能降智?上午让它改两个问题,改了一个小时了, plus 额度用了一半了还是没改好,和前几天用的体感完全不一样。要它改的问题也不复杂。服了。 目前有使用 claude code 的收到人脸认证的吗 - V2EX 分享一个自己做的 Nginx 管理工具,实时请求动态预览!(无奈市面上实在找不到好用的,自己撸了个) - V2EX claude code 崩了么? 今天在反重力上用 claude 一点都不丝滑,有同样的感受吗? opencode 消息周知插件 今天 claude opus 和前两天比,质的飞跃 - V2EX 999 包月价? - V2EX 一个版本, 50 项更新:我们几乎重做了整个播放页 本地大模型多大显存够用? GOGDNS 一款简易的私人 DNS 服务器 - V2EX API key (GLM) 怎么使用 claude code desktop ? Claude 这样订阅有问题吗 - V2EX 帮我爸找回了一篇赛博兰亭集序 求推荐稳定、高性价比使用 Claude Opus 4.6 的渠道/平台 搞个云端 claude code 防止 封号 - V2EX 用 Claude 要实名了,内地用户怎么办? OpenAI Plus 和 Team 都缩水了吗 海外 Android 手机有什么好用的国内第三方应用市场推荐吗 - V2EX 把电脑伪装成电视,用 DLNA 投屏拿到视频号直播流地址 - V2EX claude 认证莫慌 北京互联网法院有什么攻略么?起诉北京智谱华章科技股份有限公司退款可行么? - V2EX Claude 开始引入身份验证 求 vscode 做笔记软件的插件推荐 - V2EX 讯飞星辰的 Coding Plan 如何? Anthropic 宣布在 Claude 平台推行身份验证机制 科普一下低价 gpt 是怎么来的 有没有长期关注 Claude 的朋友,我建了一个 Channel 自动抓取 Claude Team 的推文 啃了那篇 54 页的 Agent Harness 综述, 给大伙讲个省流版 现在那家的 coding plan 还能买到 是不是最近会有什么更聪明的大模型要发布了呀? 用多了 AI 后,有没有觉得 AI 生成的文章有很强的既视感? 如何 实践 Harness 工程? 今日份 GPT 5.4 笑话 如何建一个自己的号池,让 cursor 真正实现 token 自由 写了三个月 Agent Harness,我终于敢让 Claude Code 全自动写代码了
做了 7 年 Android,实在受不了那些反人类的 API,于是我用野路子重构了它的开发体验
fankes · 2026-05-30 · via V2EX

大家好啊。

我是个搞了 7 年多 Android 原生开发的老人了,平时常翻 Android Framework 源码,也懂点逆向 Hook 和 AOP 插桩,比如之前写过的 YukiHookAPI,偶尔还会写点后端( PHP/SpringBoot )折腾一下全栈。我一直有个习惯:在实际业务里踩了坑,就想办法通过开源工具库把能力沉淀下来,主打一个“开源反哺业务”。

写 Android 久了,人很容易进入一种奇怪的状态:有些需求不是不会写,而是每次碰到那些极度眼熟、又长又臭的 API ,往往会在敲键盘前忍不住长叹一口气:“怎么又是你?”

我算是个重度强迫症患者,对 Android 的很多不满,其实不是因为“它做不到”,而是“它明明能做到,但代码写起来怎么就这么别扭?”

比如一大坨的 Builder,比如不知道怎么就被吞掉的 padding,比如永远记不清参数顺序的 dp2px

于是,就有了 BetterAndroid

它不是什么想去颠覆什么架构的新框架,也不仅仅是塞一堆毫无灵魂的 xxxUtils。它更像是我对自己这 7 年编码体验的一次“重构”。我的初衷很简单:在不破坏原生能力、不强行改变项目架构的前提下,把那些重复、繁琐、兼容性像盲盒一样的部分,整理成更顺手的现代 Kotlin 写法。

这里面的很多功能,都是我在被实际业务狠狠按在地上摩擦后,抠出来的痛点。

1. 系统栏:Android 适配里最坑人的无底洞

如果只看文档,弄个状态栏、导航栏无非就是调个颜色、设几个 flag 。但只要你真正在项目中处理过沉浸式、Edge-to-Edge 或者在深浅色内容间跳跃,就知道这玩意有多恶心。不同系统版本表现不一样,不同国产 ROM 甚至还有私有实现。

在 BetterAndroid 里,我搞了个 SystemBarsController。它不是简单帮你改个颜色,而是把整个系统栏当成一个独立的“界面控制对象”。 很多老哥遇到的坑是,一开启 Edge-to-Edge ,内容就被刘海、水滴或者底部的短条给挡了。BetterAndroid 默认会用 safeDrawingIgnoringIme 给根布局垫一层安全的 padding ;如果你想自己掌控一切,直接置空 edgeToEdgeInsets 就行。总之,我不止给你提供方法,更想帮你提前把布局关系给想好。

2. Insets:把 Compose 的爽感偷回原生 View

Insets 是个好东西,但原生的写法实在让人没法夸: WindowInsetsCompat.getInsets(WindowInsetsCompat.Type.systemBars()) 页面稍微复杂点,这就是一坨又长又绕的代码。

在这里,我偷师了 Jetpack Compose 的思路,把 Insets 独立成了 ui-extension 的核心能力。现在你可以直接拿:

insetsWrapper.systemBars
insetsWrapper.ime

甚至它还支持 +-orand 运算。应用到 View 上也不用手写繁琐的 setPadding,直接:

view.setInsetsPadding(systemBars)
view.updateInsetsPadding(insetsWrapper.ime, bottom = true)

而且小细节是:它会保存你本来的 padding 作为基线! 再也不怕 Insets 一刷新,把你辛辛苦苦在 XML 里写的内边距全吃掉了。

3. 发个系统通知,为什么要像造火箭一样?

高低版本兼容、坑爹的通知渠道、Android 13 的运行时权限……写到最后,业务代码里混着一大段 Builder,看着就心烦。

我对通知做了一整套封装,我希望发通知的代码看起来是在描述“我要发一条通知”,而不是在拼装宇宙飞船:

context.createNotification(
    channel = NotificationChannel("my_channel_id") {
        name = "My Channel"
    }
) {
    smallIconResId = R.drawable.ic_my_notification
    contentTitle = "My Notification"
    contentText = "Hello World!"
}.post()

第一次 post 自动创建渠道,遇到同 ID 自动复用,权限优先级也成了友好的枚举,少掉一堆头发。

4. 都什么年代了,我真的不想再写 dp2px 了

相信我,每个接手屎山的项目,都能搜出 3 个以上的 DensityUtils。在 XML 里写 10dp 那么自然,一到代码里就得搞转换。

BetterAndroid 给 Kotlin 提供了一套很直觉的扩展:

val px = 10.toPx(context)
val dp = 36.toDp(context)

如果你在 Fragment / Activity 或者有 Context 的类里,只要实现一个 DisplayDensity 接口,甚至可以直接:

val px = 10.dp
val dp = 36.px

对嘛,写 Kotlin 就应该有写 Kotlin 的样子。 (注:如果你的项目重度依赖 Compose ,不建议混用避免命名冲突,这点我也在文档里标红了)

5. 国产 ROM 识别:一门玄学与野路子工程学

搞过国内适配的都知道,只判断 Android 版本那是图样图森破。 MIUI 、HyperOS 、ColorOS 、OriginOS 、MagicOS……它们都叫 Android ,但遇到 Bug 时个个都想让你怀疑人生。

得益于平时摸爬滚打做系统级问题定位的经验,BetterAndroid 里的 RomType 没有用市面上死板的设备型号匹配,而是通过综合判断底层系统属性、类存在性等核心特征去巧妙“闻”出来的。它不仅暴露出来给你用:

if (RomType.matches(RomType.MIUI)) {
    // 专门针对 MIUI 写 workaround...
}

我在底层做系统栏适配和异形屏去坑时,也重度依赖了这套判断。这完全是在各种真实设备里滚钉板总结出来的填坑指南。

最后,聊句大实话:关于 Compose 与 View

现在大趋势是 Compose ,这毋庸置疑,我自己其实也是 Jetpack Compose 生态的重度使用者。我也做了 compose-extension 去支持跨平台,但现实是怎样的呢? 现实是大量的老项目、历史组件、复杂的屎山,依然在原生 View 体系里苟延残喘。大部分老哥根本没法(也没空)喊一句“全部重构为 Compose”。

所以 BetterAndroid 这个东西,本质上是给咱们这些还在维护/编写原生 View 的人,留一条更体面的路:不逃离原生,但也不被原生 API 的历史包袱恶心死。

其实顺带我还搞了一个极其头铁的项目叫 Hikage,一个 Android 响应式 UI 构建工具,让原生组件也能有更接近声明式布局的极致体验(有兴趣可以看看)。

总而言之,BetterAndroid 是我这 7 年踩坑、绕路、咒骂 API 之后的一次总账。如果你也曾对着某些弱智的源码发出过“卧槽这玩意是不是能写得稍微像个人一点”的感叹,希望这个库能帮你顺顺气。

🔗 GitHub 传送门:

欢迎体验、提 Issue 、扔砖,如果能骗个 Star 就更好了,嘿嘿。

AutumnVerse

1

AutumnVerse      5 月 30 日 via iPhone   ❤️ 2

一年半安卓选手路过,看了楼主的帖子,我死去的记忆又开始攻击我了。

依稀记得,无数个日夜调各种傻逼兼容,不同版本,不同厂家的设备,总有奇奇怪怪的表现,费尽无数个日夜实现出来的东西,设计走查来一句你这个间距在 xxx 设备上多了 1px ,要不就是 qa 来一句,在 xx 设备上是好的,但是 xx 设备上不对。那真是天塌了

后来跳坑搞后端了,没有什么 api 兼容,没有什么厂商兼容,太爽了

iAcn

2

iAcn      5 月 30 日 via Android

你的想法在十多年前就有人做过类似的东西了..比如 xUtils

WngShhng

3

WngShhng      5 月 30 日   ❤️ 1

10.toPx(context) 这种封装其实还可以更简洁一些,
总的来说 kotlin 刚出来那会写这些还有些新意,现在 Android 写得再花哨也没用了

fbu11

4

fbu11      5 月 30 日

现在有 AI ,你说的这些痛点,AI 能解决大部分

little_cup

6

little_cup      5 月 30 日

我说话有点不客气啊…在古法时代,这种逻辑封装思路也应该是 2~3 年左右的研发的水平。7 年经验的人不应该还按这种思路做事情。

fankes

10

fankes      5 月 31 日

@lisongeee #9 这里参考了 DeviceCompat 的封装对系统类型进行了补全,之前的识别方案是我当年和借助我项目的用户群体提供的资源,自己去对各种设备的 `framework.jar` 手机一点点找的。R8 这边的配置你说的没错,后续会考虑一下,但是每个人对项目的混淆配置可能有不同的方案,默认补全配置可能对于想要局部自定义规则的人来说不是很友好,因为这个配置是向下覆盖的

showmethetalk

11

showmethetalk      5 月 31 日

@iAcn #7 在功能上确实有些相似吧,但给我的感觉是设计出发点不同,一个是高层次的封装,为了更容易实现某些功能; 一个是改善现有的 api 设计,为了屏蔽因历史原因等导致的 api 过于难看、反人类的接口设计

xuld

12

xuld      5 天前

好项目。非常支持