- 博客(233)
- 资源 (36)
- 收藏
- 关注
原创 RK3588 板卡GPIO口调试实现简单按键触发-JNI
项目要把一个回弹按钮接到开发板上:按一次,发起一次紧急视频通话。最初松开按钮时首页的 `0/1` 不断跳变;换引脚、改成边沿监听后能触发,但还需要处理抖动、页面切换和外部进程依赖。
2026-11-07 17:29:48
253
原创 AI Agent 常见名词:英文怎么读、怎么写,概念怎么理解
你把一段 Android 崩溃日志交给 AI,让它“查一下文档,找到原因,再给出修复方案”。界面上陆续出现 `Planning`、`Tool call`、`Context`、`MCP`、`Memory`。这些词看起来都和“AI 在干活”有关,但分别指什么?为什么接上 MCP 后,它仍可能找错资料?为什么保存了聊天记录,它还会忘记前面说过的话?
2026-11-06 10:31:37
299
原创 RK3588 板卡GPIO口调试实现简单按键触发
本文分析了基于RK3588开发板的按钮输入问题,涵盖从硬件接线、GPIO配置到Android层事件处理的完整链路。关键点包括:使用上拉电阻确保引脚稳定电平;通过gpiomon读取边沿事件并转为Kotlin Flow;引入状态机防抖,区分真实按动与抖动;最终由通话管理器统一协调音视频资源。强调跨层协作的重要性,避免将系统异常归因于单一环节。
2026-11-04 14:45:59
315
原创 Android 中的 MQTT 协议:从设备状态推送到可靠消息处理
做一个智能家居 App:用户打开设备详情页,希望马上看到灯是开着还是关着;点下开关后,灯的状态又要及时更新。用 HTTP 定时查询可以实现,但页面上没有变化时,很多请求只是重复读取相同的数据。MQTT 很适合这种持续接收小消息的场景。接入后,真正让人困惑的通常是另一组问题:消息为什么重复了?网络恢复后怎么收不到数据?手机息屏之后,为什么连接也跟着断了?
2026-11-02 19:18:44
284
原创 Android 核心名词手册跟读版
本文整理Android面试高频核心名词,涵盖Java/Kotlin/Dart、JVM、并发、性能优化、架构等方向,提供音标、释义及面试要点,助力精准表达、高效复习。
2026-11-02 18:08:01
132
原创 Android 串口通信:从 /dev/ttyS1到协议帧
在RK3588板卡上运行血压计Demo时,虽发送“开始测量”命令(FF C0 03 A3 A0)成功且气泵启动,但界面未更新气压。问题根源在于:串口通信需确保接收线程收到完整且校验通过的协议帧,而非仅发送成功。应用通过/dev/ttyS1读写串口,依赖stty配置波特率、数据格式及min 1 time 0避免空读退出。原始字节必须经ProtocolParser解析为有效帧(如FF C0 05 A8 A0 00 03),方可触发UI更新。故障排查应优先验证接收到的原始字节是否构成有效帧,再逐层检查硬件连接、电
2026-10-29 16:57:11
328
原创 Android 版本号、API Level 和 JDK 版本有什么关系?
在 Android Studio 里看到 `minSdk = 23`,测试同事说手上的设备是 Android 13,构建日志又提示需要 JDK 17:这几个数字之间到底怎么换算?这台设备能安装应用吗?
2026-10-28 13:58:44
285
原创 从开机到首帧:Android 系统与应用启动流程源码分析
手机开机后,系统从Bootloader、内核启动init,由其加载zygote与servicemanager,Zygote预加载类并孵化system_server。后者启动AMS、WMS等核心服务,最终由Launcher显示桌面。点击应用图标时,系统通过AMS决策进程与Activity,Zygote创建新应用进程,执行Application.onCreate(),直至首帧渲染完成。整个流程分为“开机启动”与“冷启动”两阶段,在Launcher处衔接,共同实现应用的首次运行。
2026-10-27 14:27:45
202
原创 Flutter 与原生交互的最后一层:RTC 视频帧怎么走
做一个 Flutter 视频通话页,点击“切摄像头”很快,画面却偶尔掉帧;把 RTC 回调里的每帧图像发给 Dart 后,卡顿更明显。于是很容易得出一个结论:“Flutter 和原生之间的桥太慢。”这个判断只说对了一半。要先看清楚,到底是什么东西在过桥。
2026-10-26 13:06:14
217
原创 Flutter 状态管理怎么选:几种框架的区别,以及大厂公开案例能说明什么
购物车角标要在商品页、订单页同时更新,用户切换账号后又必须清空。再加上接口请求,旧账号的响应可能在新账号登录后才返回。这篇文章写于 2026 年 10 月。文中的购物车是一个统一的选型场景:列表页显示数量,结算页向服务端请求报价,登出时清空当前用户的数据。它用来比较方案的行为,不是某个真实项目的事故复盘。后半部分再看企业公开资料。尤其是“大厂都用哪个”这个问题:公开案例能证明一个团队在某个时期的做法,通常无法证明整家公司今天的全部代码库都采用同一方案。
2026-10-25 07:00:00
707
原创 从零搭建一套 Flutter 架构:先跑通数据流
接手新 Flutter 项目时,应先明确数据真实来源、生命周期、错误处理与入口路径。以“加入购物车”为例,通过单向数据流设计:页面仅负责展示与事件触发,由 Repository 统一管理购物车状态,ViewModel 转换为 UI 状态,实现单一真实来源。按功能聚合目录,优先完成垂直切片——从网络请求到页面渲染的完整链路,再逐步引入依赖注入、缓存与异常处理。架构核心是职责清晰、可测试、易维护,而非堆砌框架。
2026-10-24 17:11:29
527
原创 Flutter 底层渲染引擎怎么变了:从 Skia 到 Impeller,以及迁移时的坑
Flutter 3.47 起,移动端默认启用 Impeller 渲染后端,取代 Skia 运行时编译着色器的模式,旨在消除首帧卡顿。其核心变化在于将着色器预编译、管线状态管理前置,降低渲染波动。但布局与业务逻辑不变,图片、相机、地图、自定义绘制等仍需针对性优化。各平台支持不一:iOS 全面启用,Android 高版本默认开启,旧设备回退至 OpenGL;Web 仍用 Skia。开发者需警惕“卡顿即着色器问题”的误区,重视真机 Profile 与跨后端视觉差异,避免依赖关闭 Impeller 作为长期解决方案
2026-10-23 18:07:06
222
原创 Android 性能排查实战:怎么看内存抖动、CPU 占用和 FPS
本文聚焦Android应用性能卡顿排查,强调应先通过可复现操作建立时间线,再结合System Trace、Memory Profiler与CPU采样,精准定位卡顿根源。重点指出:内存抖动需看分配速率而非总量,CPU占用要分线程分析热点,帧耗时应关注“掉帧”而非平均FPS。以列表滑动为例,通过追踪分配调用栈与GC时机,发现onBindViewHolder中频繁创建对象是主因,建议优化字符串处理与图片解码逻辑。核心方法论:锁定卡顿时段 → 对齐内存/线程/帧耗时 → 沿最先变化信号追溯调用栈。
2026-10-23 17:27:51
386
原创 Android 开发必备:用 Chucker 看清网络请求,并把排查时间缩短
登录页报“网络异常”,服务端说接口没收到请求。你翻 Logcat,只看到一条 `HttpException`;测试同学手里的手机又没有连 Android Studio。这时候,与其猜请求有没有发出去,不如直接在 App 里看:请求方法、URL、请求头、请求体、响应码、响应体和耗时分别是什么。
2026-10-22 17:31:00
391
原创 Android 屏幕适配的前世今生
本文解析Android屏幕适配核心机制:分辨率决定物理像素数,逻辑密度(densityDpi)将dp转换为px,而图片内存占用取决于解码后像素尺寸与格式。同一张300×200 PNG放入drawable-mdpi目录时,系统按设备密度自动缩放——在3倍密度设备上解码为900×600,内存达前者的9倍。关键在于:内存由解码尺寸决定,非分辨率或文件大小。理解密度缩放、资源目录规则及Bitmap解码机制,是避免内存溢出、实现高效适配的核心。
2026-10-21 17:06:48
355
原创 kotlin coroutines理解:为什么需要协程,和线程有什么不同
Kotlin 编译器把 `suspend` 函数中的挂起点编成状态机。生成的 `Continuation` 保存状态编号和跨挂起点仍需使用的局部变量。调用挂起函数时,它可能立刻返回结果;如果确实要等,就保存续体并返回 `COROUTINE_SUSPENDED`。等定时器、网络回调或其他事件给出结果,续体再通过调度器恢复,从挂起点后继续执行。这里释放的是线程的执行机会,不是把整条线程“暂停保存”。这是根据 [Kotlin 语言规范](https://kotlinlang.org/spec/asynchrono
2026-10-20 08:51:44
359
原创 Kotlin 类、状态与泛型:一条订单页面的数据边界
本文以 Kotlin 2.4.21 为例,阐述订单页面状态管理的类型设计原则:通过接口与类划分数据源职责,用密封接口限定状态分支,借助显式幕后字段实现读写分离,结合泛型协变(out/in)精确控制数据流向。核心在于将“谁创建、谁修改、谁只读”等约定转化为类型约束,避免依赖运行时约定防错,提升代码可维护性与测试性。
2026-10-17 17:46:36
222
原创 Kotlin学习导航:从知识树走到项目与面试
本文以 Kotlin 2.4.21 为基线,围绕 Android 开发中的核心痛点,系统梳理“数据边界 → 行为与状态 → 平台边界 → 并发与交付”四层架构。八篇内容依次覆盖类型安全、函数建模、状态设计、JVM 互操作、控制流、集合转换、协程并发与工程实践,每篇聚焦一个可独立查阅的问题,帮助开发者从接口空值、列表转换到协程泄漏等实际场景中精准定位并解决难题,提升代码健壮性与可维护性。
2026-10-17 17:45:52
812
原创 Kotlin 工程实践与生态:代码写完后还要验证什么
本文强调,Kotlin 项目可靠交付需整合测试、性能测量、生命周期管理与跨平台兼容性。通过精准单元测试与性能基准,确保逻辑正确与效率;合理使用 ViewModel 与 collectAsStateWithLifecycle 管理状态;在 KMP 中共享规则而非平台细节;发布前验证二进制兼容性与消费者环境。语言版本仅作示例,核心在于构建可复现、可验证的全链路工程体系。
2026-10-17 17:03:38
205
原创 Kotlin 异步与并发:从一次搜索请求走到状态流
本文以 Kotlin 2.4.21 为例,系统阐述 Android 协程在搜索场景中的正确使用:通过 viewModelScope 管理任务归属,用 Job 取消旧请求防止结果覆盖;利用 Flow 表达持续变化的数据流,结合 stateIn 共享状态并控制生命周期;并发请求采用 async 与 coroutineScope 实现重叠执行;共享状态则通过 Mutex 保证线程安全。强调取消、作用域、结果传递与并发控制需协同设计,避免仅依赖 suspend 或调度器。
2026-10-17 17:02:54
390
原创 Kotlin 集合与序列:给页面一份清楚的数据
Android 消息页从仓库取回通知列表,准备筛出未读项并按会话显示。代码里参数类型写着 `List`,页面却可能在下一次刷新前看到内容变化;图片接口要的是 `ByteArray`,手上的 `List<Byte>` 又不能直接传。问题牵涉的并非一套“集合语法”,而是数据能否被修改、怎样组织、何时计算。以下以 Kotlin 2.4.21 及 Android 的 JVM 目标为基线。
2026-10-17 17:01:57
144
原创 Kotlin 控制流:从页面状态到循环出口
Android 页面拿到一批待展示记录,既要根据加载状态显示文案,又要跳过无效记录;用户取消时,扫描还得马上结束。把这些判断都写成层层嵌套的 `if`,代码很快会分不清“算出一个值”和“改变执行路线”。本文以 Kotlin 2.4.21 为基线,沿这条页面处理过程看表达式、循环和跳转各负责什么。
2026-10-17 17:01:02
247
原创 Kotlin 类型与空安全:从接口数据到页面状态
Android 页面从 `Intent` 读取商品 ID,再把接口返回的价格和标题显示出来:ID 可能缺失,价格单位可能是“分”,标题可能来自没有可空标注的 Java SDK。把这些值都交给类型推断,编译器也无法替业务判断“缺失”和“无效”是否一样。
2026-10-16 18:04:53
291
原创 Kotlin 变量与函数:把页面状态和行为写成清楚的契约
一个 Android 商品页需要展示价格、处理点击、把埋点发给日志服务。写起来全是 `val`、`var`、`fun` 和花括号,难点却在于:谁可以改状态,谁决定筛选规则,回调被谁持有,以及日志依赖从哪里来。**用变量声明约束重新赋值,用函数签名交代输入与结果,再让 Lambda 和扩展只承担清晰、局部的便利。**
2026-10-16 18:03:52
264
原创 WebView JSBridge 全解析:Android 与 H5 怎么通信,为什么还要走向跨端
从 WebView 与 JavaScript 的双向消息通道讲起,比较 addJavascriptInterface、evaluateJavascript 与 WebMessage,梳理安全、可靠性、性能和多端维护问题,并说明它们如何推动跨端架构演进。
2026-10-15 23:28:52
159
原创 Kotlin 与 JVM 互操作:从 Java 调用签名查到旧 AAR
Android 项目把一个工具类从 Java 改写成 Kotlin,Kotlin 模块能正常调用,Java 模块却找不到静态方法;另一次升级只改了库的编译选项,旧 AAR 消费方运行时又报方法错误。这些现象都需要同时看源码契约和 JVM 产物。
2026-10-15 18:04:27
439
原创 HTTP 请求是怎么走的:从 Android 页面到服务端响应
在 Android 页面里调用一次接口,日志只留下 `GET /articles/42` 和 `200`。页面第二次打开却更快,抓包偶尔出现 `304`;换成弱网后,请求可能连状态码都没有。它们是同一条请求链上的不同结果,光记“HTTP 是超文本传输协议”解释不了
2026-10-14 17:17:55
291
原创 Kotlin 变量与函数:把页面状态和行为写成清楚的契约
一个 Android 商品页需要展示价格、处理点击、把埋点发给日志服务。写起来全是 `val`、`var`、`fun` 和花括号,难点却在于:谁可以改状态,谁决定筛选规则,回调被谁持有,以及日志依赖从哪里来。**用变量声明约束重新赋值,用函数签名交代输入与结果,再让 Lambda 和扩展只承担清晰、局部的便利。
2026-10-13 18:53:42
218
原创 Android 中的 Socket 和 WebSocket:从一条聊天消息看清区别
在 Android 聊天页里,点“发送”后服务器要马上回一条消息。有人会说“用 Socket”,也有人会说“用 WebSocket”。两者都能保持连接、双向传消息,名字又很像,选型时很容易把它们当成同一层的东西。
2026-10-13 18:42:50
302
原创 聊天与引用回复的 SQL 怎么设计
做聊天功能时,最容易先想到一张表:`id、发送人、接收人、内容、时间`。它足以演示两个人互发消息,却很快会遇到几个问题:群聊怎么表示?一条消息回复的是哪条?消息重复发送怎么办?翻历史消息为什么越翻越慢?已读和未读又存在哪里?
2026-10-12 21:56:07
230
原创 什么是 Android Clean Architecture
一个订单页面需要请求商品价格、计算满量折扣,再显示总价。最直接的写法,是在 `Activity` 或 `ViewModel` 里调用 Retrofit,拿到 DTO 后顺手计算折扣。功能能跑,但当接口字段改变、折扣规则增加、页面从 XML 换成 Compose 时,这段代码很可能一起被改动。
2026-10-12 21:37:09
313
原创 Android 没有没落,但开发者的边界正在改变:写给 AI 时代的自己
因为AI时代真正有价值的能力,越来越不是,我们会哪一个平台。而是面对一个陌生的问题,我们有没有能力快速理解它、拆解它,然后把它做出来。这或许是我说了这么多想表达的,也许这才是2026之后我这种Android开发者最值得拥抱的变化吧
2026-10-11 20:44:47
472
原创 Android 依赖注入库到底应该怎么选
文章比较了 Hilt、Dagger、Koin、Kodein-DI、Toothpick 和手动 DI,包含工作原理、代码示例、生命周期作用域、适用场景与选型建议。核心结论是:新的原生 Android + Jetpack 项目通常优先考虑 Hilt;Koin 是常见的轻量替代,尤其适合偏好 Kotlin DSL 或需要跨平台共享的团队。
2026-10-11 20:05:29
377
原创 Android DataStore、SharedPreferences 与 MMKV
一个深色模式开关,SharedPreferences、DataStore、MMKV 都能存;但它们解决问题的方式并不相同。SharedPreferences(下文简称 SP)是 Android 平台自带的 XML 键值存储,DataStore 面向异步和响应式的数据更新,腾讯 MMKV 则以mmap为核心优化小型键值读写。这里把提问中的mkkv按MMKV理解。
2026-10-11 20:02:52
569
原创 知无不会:你到底应该怎么配置项目中的 .gitignore 文件?
打开 `voice-pipeline-demo`,`app/libs/AIKit.aar` 能在 Git 里看到,`app/build/outputs/apk/debug/app-debug.apk` 却看不到;根目录的 `local.properties` 明明存在,`git status` 也没有提示。只记住“编译产物要忽略”,解释不了这三个现象,更难解释一个常见事故:明明加了 `.gitignore`,密钥还是进了仓库
2026-10-10 15:02:18
223
原创 这一次你一定能看懂 Gradle 的配置文件了
刚接手一个 Android 项目,想加一个依赖。Android Studio 左边能看到 `manifests`、`java` 和 `res`,切到 Project视图,又出现 `settings.gradle.kts`、两份 `build.gradle.kts`、`libs.versions.toml`。这些文件看起来都在“配置项目”,到底该从哪里读?
2026-10-10 13:40:40
276
原创 Android 卡顿优化实战:测到哪一帧,再决定改哪段代码
首页列表滑动时偶尔“顿一下”:商品图片刚进入屏幕,手指还在移动,内容却短暂停住。把所有工作都扔到线程池,卡顿可能还在;因为问题也可能出在布局重算、图片上传到 GPU,或一段等待锁的时间
2026-10-09 17:38:25
247
原创 Android 崩溃优化与应用稳定性全解析:Crash、ANR、OOM 到线上治理
线上最难受的稳定性问题,往往不是“某个空指针崩了”这么简单。更真实的情况是:某个版本刚灰度,Crash 率往上跳,ANR 也跟着涨;用户评论里说“打开就闪退”“点一下没反应”“页面卡死”;你打开日志平台,Java 崩溃、Native 崩溃、OOM、主线程阻塞、启动失败混在一起,像一团线。
2026-10-09 17:26:09
389
原创 Android 视频压缩上传实战:从 content Uri、转码到断点续传
讲清 Android 视频选取、元数据读取、是否压缩的决策、Media3 Transformer 转码、流式上传、进度、取消、后台任务和服务端续传协议。
2026-10-08 23:39:09
211
原创 Flutter 为什么能跨端成功:从 Widget、自绘引擎到 JIT 与 AOT
讲清 Flutter 的跨平台架构、Dart JIT 与 AOT、热重载、渲染流水线和平台插件,分析它在效率、一致性与性能上的优势及适用边界。
2026-10-08 23:37:16
508
1
ListViewForScrollview
2015-12-07
Genymotion-ARM
2015-12-17
信鸽推送Android端(Android信鸽推送demo)
2017-03-23
SoapUI Pro 5.4.0 X64_破解版
2018-07-05
轮播设置间距透明度
2018-06-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅