- 博客(125)
- 收藏
- 关注
原创 DHCP深度解析:从自动连接到七层之谜
DHCP协议解析:从应用层到网络配置的魔法 摘要:本文深入探讨DHCP协议的工作原理及其在网络分层模型中的定位。作为应用层协议,DHCP通过UDP端口67/68实现IP地址自动分配,将复杂的网络配置过程隐藏在200-500毫秒的快速交互中。文章详细解析了DHCP的四阶段交互过程、报文结构以及从应用层到底层的完整封装流程,揭示了其看似矛盾却精妙的设计逻辑:一个配置网络层参数的协议却运行在应用层。现代DHCP已发展出智能地址分配、租期管理等高级功能,并以轻量级方式集成在各种网络设备中,实现了从技术操作到无感知连
2025-12-31 11:17:18
1075
原创 解决Compose中底部按钮与系统导航栏的间距问题
在Jetpack Compose开发中,自定义底部按钮可能被系统导航栏遮挡。本文通过分析发现问题根源在于未处理WindowInsets,对比官方NavigationBar组件发现其自动考虑了系统导航栏间距。解决方案是为自定义按钮添加windowInsetsPadding(WindowInsets.navigationBars)或navigationBarsPadding()修饰符,确保组件正确避开系统UI区域。文章还介绍了WindowInsets的常见类型,帮助开发者更好处理系统UI边距问题。
2025-11-07 13:48:08
342
原创 怎么用HTTP请求操控OpenWrt并修改网络配置:探索ubus与Luci的JSON-RPC接口
通过HTTP请求操作OpenWrt为我们提供了一种灵活、可编程的方式来管理软路由配置。无论是直接使用ubus接口还是通过Luci代理,JSON-RPC协议都为我们提供了标准化的通信方式。自动化部署和配置管理集成到现有的运维系统中开发自定义的管理工具实现远程管理和监控掌握了这些技术,你就能够以开发者的方式高效地管理OpenWrt系统,将软路由的管理融入到你的技术栈中。希望这篇博客能为你打开OpenWrt自动化管理的大门!
2025-10-16 15:12:57
1006
原创 从思科到软路由:深入理解网络世界的两种维度与身份
让我们回到最初的问题:“不都是集中在怎么去管理局域网吗?是的,但“管理”二字的含义,因维度和范围而产生了质变。软路由所做的是“纵向管理”——深度挖掘单一网关的潜能,将所有功能和策略集中于此,服务于它身后的用户。它的局域网是一个需要被服务的对象。企业网络所做的是“横向管理”——广度构建一个由无数局域网互联的生态系统,关注的是这些局域网彼此之间以及它们与外部世界的高效、可靠连接。它的局域网是构成网络本身的主体。学习思科/企业网络,是让你成为城市的建筑师。
2025-10-15 10:44:05
1130
原创 深入理解OpenWrt生态:LuCI、UCI、ubus与rpcd的协同工作机制
本文系统解析了OpenWrt及其相关技术组件的关系。OpenWrt是专为嵌入式设备设计的Linux发行版,LuCI是其官方Web管理界面,通过UCI统一配置系统管理路由设置。ubus提供进程间通信,rpcd作为JSON-RPC网关实现权限控制和协议转换。iStoreOS是基于OpenWrt的第三方发行版,优化了用户体验。整个系统通过分层架构协同工作:用户界面调用JSON-RPC,经rpcd转换为ubus调用,最终操作UCI配置完成系统设置。curl工具可用于直接测试接口。这种模块化设计使OpenWrt既灵活
2025-10-14 13:58:54
1148
原创 【2025指南】安卓工程师的Spring Boot极速入门:用你最熟悉的姿势搭建后端API
看,是不是没那么复杂?我们利用已有的知识(Kotlin, Gradle, IDEA),遵循清晰的步骤,不到半小时就完成了一个具备API接口和在线文档的微型后端服务。安卓工程师的优势在这里尽显无遗:无缝切换,代码写起来得心应手。构建脚本的逻辑一看就懂。开发环境零适应期。
2025-09-29 10:59:23
1062
原创 从 LiveData 到 Flow:Android 状态管理的现代化演进
在 Android 应用开发中,状态管理是构建健壮、可维护应用的核心。随着 Jetpack 的推出和 Compose 的兴起,我们的工具和最佳实践也发生了显著变化。当我们切换到声明式 UI 框架 Jetpack Compose 后,虽然 LiveData 仍可使用,但。Flow 是 Kotlin 协程库的一部分,提供了丰富的异步数据流操作符。特别像 LiveData,因为它总是持有最后一个状态(可重复收集),并且可以通过。,它只会在界面可见时推送更新,避免了在后台更新 UI 可能造成的崩溃和资源浪费。
2025-09-18 15:39:21
648
原创 图标生成利器:用 Icon Kitchen 和 Google Fonts 打造完美应用图标
可以上传自己的设计,然后在线调整背景形状、颜色、阴影等效果,无需设计软件。
2025-09-17 09:55:08
403
原创 从安卓系统角度下理解Jetpack Compose(Deepseek对话版)
本文对比分析了Android传统View体系与Jetpack Compose在事件处理机制上的核心差异。传统View采用基于继承的责任链模式,通过重写dispatchTouchEvent等方法实现自上而下分发、自下而上回溯的事件传递流程。而Compose基于声明式UI理念,通过Modifier系统和命中测试构建事件处理链,以组合方式实现事件处理。关键区别在于:传统View依赖方法重写,需处理拦截逻辑;Compose通过Modifier声明意图,由AndroidComposeView(一个ViewGroup子
2025-09-16 09:55:32
1038
原创 Android XML属性与Jetpack Compose的对应关系(控件基础属性篇)
本文对比了Android XML布局属性与Jetpack Compose的对应实现方式,帮助开发者快速过渡。在Compose中,尺寸属性如fillMaxWidth()对应XML的match_parent,默认即为wrap_content;布局位置通过align()实现类似layout_gravity的效果;内外边距统一使用padding修饰符处理,通过上下文区分功能。Compose采用声明式API,通过修饰符组合替代传统XML属性,简化了UI构建逻辑,同时保持了灵活的布局控制能力。
2025-09-11 15:50:49
793
原创 解决 Android Compose UI 开发中软键盘遮挡 UI 的问题
摘要:针对Android Compose中软键盘遮挡UI的问题,文章提出三点解决方案:1)在AndroidManifest.xml中设置windowSoftInputMode="adjustResize";2)使用实验性APIimePadding()修饰符;3)结合Scaffold布局处理。同时提醒注意API的实验性状态、滚动支持以及多设备测试。文末推荐了关于Window Insets的扩展阅读资源。(149字)
2025-09-10 10:40:21
567
原创 从Kotlin到TypeScript:当“万物皆对象”遇见“鸭式辨型”
本文探讨了Kotlin开发者转向TypeScript时需要理解的核心思想转变——从严格的"名义类型"系统到灵活的"鸭式辨型"哲学。Kotlin强调显式的类型层次和继承关系,而TypeScript则关注对象实际具有的结构和属性。文章通过代码示例对比了两种语言在处理类型兼容性、函数参数和泛型约束等方面的差异,并分析了鸭式辨型的优势与注意事项。最后给出了实践建议,帮助开发者顺利完成从"它是什么"到"它能做什么"的思维转变,充分利用Ty
2025-09-02 09:44:16
475
原创 告别“手动挡”生命周期:深入理解 Jetpack Compose 的副作用系统
Jetpack Compose 的副作用系统(如 DisposableEffect、LaunchedEffect 等)为开发者提供了安全执行外部操作的方式。这些函数能自动管理生命周期,避免内存泄漏和重复执行问题。DisposableEffect 特别适用于需要清理资源的场景,如注册/注销监听器;LaunchedEffect 则适合协程任务;SideEffect 用于每次重组后的状态同步;produceState 可将异步数据转换为 Compose 状态。开发者应根据具体场景选择合适的副作用函数,它们共同构成
2025-09-01 11:37:50
841
原创 解密 Kotlin 中的隐藏调度器:Dispatchers.Main.immediate
摘要:本文介绍了 Kotlin 协程中不为人知但实用的 Dispatchers.Main.immediate 调度器。与普通 Dispatchers.Main 不同,当已在主线程时它会立即执行任务而非加入消息队列。文章通过代码对比展示了 viewModelScope(默认使用该调度器)与普通协程的差异,解释了其实现原理和适用场景,如减少线程切换、确保执行顺序等。同时提供了手动使用方法和注意事项,帮助开发者编写更高效的协程代码。
2025-08-26 16:22:41
1169
1
原创 Android开发必知:compileSdk、minSdk和targetSdk的区别,90%人搞错了关键点!
是三个关键的构建配置参数,它们决定了应用的编译方式、兼容性范围以及运行时行为。很多开发者对它们的区别感到困惑,尤其是。,它直接影响应用在不同 Android 版本上的运行方式。本文将详细解释这三个参数的作用,并重点探讨。,它决定了系统如何运行你的应用。保持更新,并充分测试,才能确保应用在所有设备上稳定运行!Android 每个新版本都会引入行为变更,但不会立即影响所有应用,而是通过。在 Android 开发中,
2025-08-19 18:05:02
1488
原创 为什么Java Lambda要求局部变量是final?Kotlin为何没有这个限制?
Java要求Lambda引用的变量必须是final,这是为了避免多线程环境下的数据不一致问题,采用值捕获机制确保线程安全。而Kotlin通过将变量包装成引用对象(如Ref.IntRef),允许Lambda修改外部变量,但开发者需自行处理并发问题。Java的设计更严格但安全,Kotlin则更灵活但需要额外注意线程安全。两种方式各有优劣,取决于开发者的需求偏好。
2025-08-19 00:37:45
523
原创 Jetpack Compose 初体验:为什么我的内容被 TopAppBar 挡住了?Scaffold 布局机制解析内容遮挡问题
摘要: 在Jetpack Compose中,使用Scaffold时,TopAppBar会遮挡内容区域,原因是content默认填满屏幕且未自动应用预留空间。解决方案包括: 应用Scaffold的全局padding(Modifier.padding(padding)),确保内容避开所有栏位; 精准控制顶部间距(padding.calculateTopPadding()),仅避开TopAppBar; 结合系统栏适配(systemBarsPadding()),用于全屏场景。 关键点:必须手动处理Scaffold提
2025-08-17 11:59:14
591
原创 深入解析H.264码流:从16进制数据到NAL单元结构
H.264视频流的16进制数据解析指南 摘要: H.264视频流由NAL单元组成,每个单元以起始码(00 00 01或00 00 00 01)开头。关键信息存储在NAL头部(首字节): 第1位必须为0 2-3位表示重要性(00-11) 4-8位标识类型(0x01普通帧/0x05关键帧/0x07SPS/0x08PPS等) SPS(0x67)和PPS(0x68)包含核心编码参数,其长度不固定,需通过指数哥伦布编码解析。前3个字段固定: profile_idc(1字节) constraint_setX_flags
2025-08-14 12:27:41
1063
原创 为什么需要锁升级?从CPU缓存到JVM的优化艺术
但直接强制所有线程读主存(最严格的锁)会极大降低性能,于是JVM设计了。的锁升级是 JVM 自动管理的,默认会经历多级升级。,理解它,才能写出更高效的并发代码!,根据竞争情况动态调整锁策略,锁升级是JVM工程师精心设计的。
2025-08-08 14:29:31
695
原创 Kotlin协程极简教程:5分钟学完关键知识点
Kotlin协程是一种轻量级线程管理工具,相比传统线程更高效、易用。它通过挂起而非阻塞的方式运行,支持结构化并发和线程切换。在安卓开发中,协程能显著简化异步操作处理,相比回调嵌套方式,协程代码更简洁清晰,错误处理更集中。以网络请求为例,协程可以将传统多层嵌套回调转换为顺序执行的同步式代码,同时支持并行请求。协程还能轻松实现多线程切换(如主线程与IO线程间切换),提升开发效率。
2025-08-02 20:57:20
1300
原创 Android屏幕适配:从dp到px的转换与今日头条适配方案详解
在Android开发中,屏幕适配一直是一个重要且复杂的话题。不同设备有着不同的屏幕尺寸、分辨率和像素密度,如何让应用在各种设备上都能良好显示,是每个开发者都需要面对的问题。本文将深入探讨Android系统中dp到px的转换原理,并详细解析今日头条的屏幕适配方案及其实现源码。今日头条的屏幕适配方案通过动态修改DisplayMetrics中的density值,实现了简单高效的屏幕适配。虽然它牺牲了dp单位的物理尺寸准确性,但在大多数应用场景下,这种妥协是值得的。
2025-07-31 16:27:08
1028
原创 String、StringBuilder、StringBuffer的由来与作用
在大多数现代应用中,单线程场景更为常见,因此StringBuilder的使用频率通常高于StringBuffer。
2025-07-29 18:35:39
213
原创 Kotlin Flow 在 Jetpack Compose 中的正确打开方式:SharedFlow vs StateFlow 与 LaunchedEffect
本文深入探讨了Jetpack Compose中Kotlin Flow的使用,重点对比了SharedFlow和StateFlow的特性与适用场景。SharedFlow适合处理一次性事件(如Toast、导航),需配合LaunchedEffect使用;StateFlow则用于持久状态管理(如加载状态),推荐使用collectAsState自动更新UI。文章还解答了常见问题,并提供了清晰的选择指南:事件用SharedFlow+LaunchedEffect,状态用StateFlow+collectAsState,手动
2025-07-26 14:30:31
1380
1
原创 Kotlin Flow 实战:StateFlow 和 SharedFlow 的默认值陷阱
摘要:本文对比了Kotlin中StateFlow和SharedFlow的核心差异,通过文件路径选择案例揭示了StateFlow初始值触发的常见问题。StateFlow适合UI状态管理(需初始值),而SharedFlow更适合事件流(无初始值)。文章提供了两种解决方案(改用SharedFlow或过滤初始值),并给出Jetpack Compose中的使用示例。开发者应根据场景选择:UI状态用StateFlow,事件流用SharedFlow,需要跳过初始值时配合filter/drop操作符。
2025-07-23 02:20:51
659
原创 解决jetbrains快速构建的KMP项目运行Desktop提示错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException
3、运行成功,将这个命令指令保存配置,以后就可以直接点击三角形运行。2、点击第二个图标 Execute Gradle Task,输入。1、点击Gradle图标。
2025-07-21 19:02:26
341
原创 你以为有引用就不会被GC?详解Java四种引用类型的回收策略
文章摘要:Java中的引用类型分为强引用、软引用、弱引用和虚引用四种。强引用对象不会被GC回收;软引用在内存不足时回收;弱引用每次GC都会被回收;虚引用仅用于跟踪对象回收状态。不同引用类型适用于不同场景,如强引用用于普通对象,软引用适合缓存,弱引用可避免内存泄漏,虚引用用于资源清理跟踪。合理选择引用类型可以优化内存管理,避免内存泄漏。
2025-07-20 18:19:35
1011
原创 Android 主线程入口:ActivityThread 是所有组件的必经之路吗?
本文深入解析Android主线程的启动机制,指出ActivityThread.main()是所有组件生命周期的必经之路。它初始化了主线程的Looper、Handler和MessageQueue三大核心组件,构成了消息循环机制。虽然Activity、Service、Broadcast等组件有各自的业务入口方法,但最终都依赖主线程的Handler进行调度。文章通过代码分析和流程图说明,即使应用仅通过Service或广播启动,ActivityThread.main()仍会执行以确保主线程正常运行。最后用火车站类比
2025-07-20 11:45:06
1265
原创 为什么说Activity就是一个Context?一文读懂Android上下文设计精髓
角色生活场景Android组件Context能力服务员前台接待顾客Activity有UI权限,能启动其他页面厨师后台做菜Service无UI,但能长期运行餐厅老板掌握全局资源生命周期最长,全局信息餐厅本身提供水电、仓库Context基础支持(资源、系统服务访问)核心思想:Context是Android组件的“生存环境”,而Activity、Service等是不同职责的“员工”,他们能用的权限不同,但都依赖Context提供的基础支持。
2025-07-20 03:32:46
938
原创 为什么下载的人越多越快?深入解析P2P技术的魔力
比如用BitTorrent下载时,我的客户端会同时连接几十个Peer,每个Peer提供不同的块,即使最后一块也可能从某个Peer快速获取——这完全符合点对点定义,因为每个连接都是独立的P2P通道。这听起来有点反直觉——通常我们觉得用的人越多,网络应该越拥堵才对,为什么P2P(Peer-to-Peer,点对点)下载反而会加速呢?今天,我们就来深入探讨P2P技术的核心原理,看看它是如何实现“人越多越快”的,以及它在现代互联网中的应用。,你的下载速度不再受限于单一服务器,而是所有Peer的上传带宽之和!
2025-07-19 14:53:09
1412
原创 跑步机上的Android Handler:用生活场景秒懂消息机制
Handler机制核心流程解析 消息管理 Handler通过sendMessage()/post()将任务封装为Message,按执行时间排序插入单向链表的MessageQueue(优先级队列)。 立即执行的消息(when=0)置于队首,延迟消息通过SystemClock.uptimeMillis()保证时序。 消息循环 Looper.loop()死循环调用queue.next(): 取出队首消息(时间最近的任务) 队列空时,nativePollOnce()使线程阻塞 通过msg.target.dispat
2025-07-18 15:45:23
603
原创 音视频同步技术初剖析:原理、实现与FFmpeg分析
音视频同步主要依靠以下几个关键点:时间戳机制:同步策略:实现方式:在Android开发中,通常通过以下方式实现:MediaSync类:自定义同步:以下是伪代码示例,展示如何用音频PTS同步视频:关键参数::同步阈值(通常设10-40ms),超出阈值才触发调整。动态策略:根据设备性能调整阈值(性能差时增大阈值,减少频繁丢帧)。SurfaceView/TextureView:结合上述同步逻辑,在正确的时间点将视频帧渲染到Surface上可能遇到的问题及解决方案时钟漂移:帧率不匹配
2025-07-17 15:37:39
889
原创 数字音视频存储揭秘:如何计算PCM音频与YUV/RGB视频的原始文件大小
让我们先来计算一下PCM(脉冲编码调制)音频文件的大小。所以,1分钟的44.1kHz、16bit、立体声PCM音频大约为10.09MB。
2025-07-17 03:39:51
1210
2
原创 【学习笔记】ARouter路由模块的设计思想与源码实现
组件化路由方案设计 本文探讨了Android组件化开发中的路由系统实现方案。初始版本采用Map存储路由关系,存在注册代码冗余问题。改进方案引入IRouterLoad接口,让各组件自行注册路由。核心难点在于如何动态发现所有实现该接口的类,通过分析DexFile加载机制,提出利用PackageManager获取APK路径,再通过反射扫描指定包名下所有类,筛选出路由实现类进行自动注册。该方案实现了组件间的解耦,避免了手动注册的繁琐,为组件化开发提供了高效的路由解决方案。
2025-07-16 01:36:05
898
原创 Kotlin协程中的Job与SupervisorJob:理解它们的区别
特性Job异常传播向上传播,取消所有子协程不传播,仅取消失败协程使用场景需要原子性操作需要独立运行的子任务子协程独立性低高异常处理方式集中处理分散处理:确实使用了:同样使用了设计意图:这种设计使Android的协程Scope更适合UI开发场景,提供了更合理的默认行为。
2025-07-15 16:10:51
940
原创 在NDK开发中如何正确创建JNI方法
在Android NDK开发中,Java Native Interface (JNI) 允许Java代码与C/C++代码交互。正确创建JNI方法对于确保Java能够正确调用本地代码至关重要。本文将详细介绍如何在C++文件中创建JNI方法。
2025-07-13 16:59:44
1095
原创 从 OpenCore 到 MediaCodec:Android 多媒体引擎演进史
在 Android 多媒体框架中,和是历史上先后出现的两个核心多媒体引擎,它们负责音视频的编解码、播放、录制等关键功能。随着 Android 版本的迭代,它们的角色逐渐演变,最终被更现代的架构(如)取代。
2025-07-10 01:54:13
850
原创 【学习笔记】OkHttp源码架构解析:从设计模式到核心实现
我们都知道:call带着request前往分发器dispatcher,分发器需要看情况这个请求要到哪个队列,比如当正在请求的队列满了就需要去等待队列,不难得出我们需要写出一个Dispatcher,并且至少维护着两个队列,且这两个队列是非阻塞队列;然而现在我们知道队列里放的是请求,但能不能直接放request进去呢?关于责任链这里,我们都知道okhttp设计各种拦截器的主要原因,一个是为了把重试、请求头、获取长链接以及真正请求的逻辑去做一个解耦,另一个原因也是为了让开发者可以自定义增加或者删除拦截器。
2025-07-09 16:37:23
677
原创 Windows平台下Android Studio搭建Flutter开发环境的正确姿势(202506)
通过以上步骤,你应该已经成功搭建了Flutter开发环境。Flutter的热重载功能可以让你快速看到代码更改的效果,极大地提高了开发效率。现在,你可以开始探索Flutter丰富的组件库和强大的跨平台能力,构建出色的移动应用了!如果你在安装过程中遇到任何问题,欢迎在评论区留言,我会尽力解答。
2025-06-27 17:23:19
1010
原创 深入解析Activity的视图层级:从Activity到ContentView的完整链路
Activity作为入口持有创建并管理DecorViewDecorView包含默认的垂直LinearLayout这个LinearLayout中包含标题栏和内容容器(FrameLayout)我们通过设置的布局最终被添加到内容容器中理解这个完整的视图层级关系,能够帮助开发者更好地控制应用界面,进行更高效的性能优化,以及解决复杂的UI问题。
2025-06-24 15:12:06
909
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅