自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 收藏
  • 关注

原创 深入理解数字音频:采样率、位深与量化

数字音频是将连续的模拟声音信号转换为离散的数字表示的过程。与传统的模拟录音(如黑胶唱片或磁带)不同,数字音频以二进制数据的形式存储声音信息,这使得音频可以被精确复制、编辑和处理而不会损失质量。理解采样率、位深、香农定理和量化等概念不仅对音频工程师至关重要,对于任何希望在数字时代更好地欣赏和利用声音的人来说都极具价值。无论你是音乐爱好者、播客创作者还是视频制作人,掌握这些基础知识将帮助你做出更明智的技术选择,从而获得最佳的音频体验。

2025-06-06 17:33:50 919

原创 从餐厅点餐到安卓相机:揭秘Binder跨进程通信机制

在安卓系统中,Binder机制扮演着关键角色,类似于餐厅中的服务员,协调APP(顾客)与系统服务(厨房)之间的交互。Binder的核心功能包括跨进程通信、权限管控和高效数据传输。通过Binder,APP可以请求系统服务,如摄像头访问,而系统服务则通过Binder验证权限并处理请求。即使是系统自带的相机APP也需要通过Binder进行通信,确保数据隔离和安全性。Camera2相较于Camera1,通过引入共享内存(ashmem)优化了数据传输效率,减少了内存拷贝的开销,提升了性能。Binder与ashmem的

2025-05-19 16:50:41 951

原创 深入浅出:CPU寻址方式完全指南(从理论到实践)

寻址方式是CPU定位操作数的策略,决定了指令如何访问数据,影响程序的效率、灵活性和硬件设计。CPU执行指令时,操作数可能存放在指令自身、寄存器或内存中。为了高效访问数据,诞生了多种寻址方式,每种方式在速度、灵活性和指令长度之间权衡。常见的寻址方式包括立即寻址、寄存器直接寻址、直接寻址、寄存器间接寻址、基址寻址、变址寻址和堆栈寻址。通过理解这些寻址方式,可以更好地理解汇编代码,并写出更高效的高级语言代码。学习寻址方式时,应理解其本质,画图辅助,对照实践,并关联高级语言。

2025-05-18 18:14:42 545

原创 Android核心系统服务:AMS、WMS、PMS 与 system_server 进程解析

本文深入探讨了Android系统中三个核心服务——ActivityManagerService (AMS)、WindowManagerService (WMS)和PackageManagerService (PMS)的作用及其在system_server进程中的运行机制。AMS负责应用生命周期管理,WMS处理窗口显示与交互,PMS管理应用包的安装与权限。这些服务并非独立进程,而是运行在system_server进程的不同线程中,以减少进程间通信的开销并提高系统性能。system_server是一个多线程进程

2025-05-17 19:12:17 1071

原创 计算机组成原理 vs. 现实硬件:你的电脑里到底藏着什么?

当你组装电脑时,看到的只是 **主板、CPU、内存条、硬盘、显卡** 这些大块头的硬件。但《计算机组成原理》里讲的却是 **运算器、控制器、寄存器、总线、Cache、ROM** 这些抽象概念。它们之间到底怎么对应?为什么装机时看不到这些“神秘组件”?这篇博客带你揭开计算机硬件的“微观世界”

2025-05-14 18:34:45 919

原创 Android NDK开发入门:理解JNI的本质与数据类型处理

本文深入探讨了Android NDK开发的核心机制,重点分析了JNI中基本类型与对象类型的处理差异,并提供了调用第三方C库的完整流程。NDK通过编译C/C++代码和提供JNI桥梁,实现了Java/Kotlin与原生代码的交互,适用于性能优化、复用现有库和底层操作等场景。在JNI中,基本数据类型可以直接返回,而对象类型(如String)必须通过JNIEnv创建。文章还详细解释了Kotlin基本类型在JNI中的处理方式,并提供了调用第三方C库的步骤,包括集成C库和编写JNI包装函数。通过实际代码示例,帮助开发者

2025-05-12 10:50:36 742

原创 Android Canvas API 详细说明与示例

本文介绍了Android中Canvas绘制的基本图形、路径、文字、位图以及变换和图层操作的方法。通过示例代码详细展示了如何绘制直线、矩形、圆角矩形、圆形、三角形等基本图形,以及如何使用Path类绘制贝塞尔曲线。此外,还介绍了文字绘制、位图绘制以及平移、旋转、缩放等变换操作。最后,讲解了如何创建和操作图层。掌握这些API的使用方法和参数含义,可以帮助开发者在自定义View时实现复杂的绘制效果。

2025-05-11 16:37:11 582

原创 C语言的中断 vs Java/Kotlin的异常:底层机制与高级抽象的对比

在编程世界中,"中断"和"异常"都是程序执行流程被意外打断的情况,但它们的实现机制和适用场景截然不同

2025-05-10 13:04:18 736

原创 深入理解Android自定义View:onMeasure、onLayout与onDraw详解

系统提供的标准View无法满足需求需要高度定制化的UI组件创建可重用的特殊UI组件实现特殊的动画或交互效果Android提供了完善的View系统,让我们可以通过继承View或现有View类来实现自定义功能。是自定义View中最常用的方法,负责绘制View的视觉内容。使用Canvas对象进行绘制操作使用Paint对象定义绘制样式避免在onDraw中创建新对象(防止内存抖动)需要重绘时调用invalidate()或postInvalidate()@Override。

2025-05-08 13:02:06 841

原创 Android 从模板代码到通用工具:ViewBinding的演进之路

DRY原则的价值:不要重复你自己语言特性(反射/reified)的巧妙运用工程中在性能与开发效率间的合理权衡这种演进不是过度设计,而是随着项目复杂度提升的自然选择。理解背后的技术决策过程,比单纯记忆实现方式更有价值。

2025-05-07 11:36:08 524

原创 Android SDK 开发中的 AAR 与 JAR 区别详解

在 Android SDK 开发中,构建项目时我们常常会看到生成两个不同的文件:一个是 `build/outputs/aar/*.aar`,另一个是 `build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar`。很多初学者会疑惑:它们之间有什么区别?为什么构建会生成两个包?本篇博客将从生成路径、结构内容和使用场景三个角度,系统解释 AAR 和 JAR 的差异

2025-05-06 16:57:01 564

原创 Kotlin DSL 深度解析:从 Groovy 迁移的困惑与突破

Gradle 作为现代构建工具,支持 **Groovy** 和 **Kotlin** 两种 DSL(领域特定语言)。Kotlin DSL 因其**类型安全**和**更好的 IDE 支持**逐渐流行,但它的语法设计却让许多开发者感到困惑,尤其是从 Groovy 迁移时。 本文将从 **Kotlin DSL 的基本概念** 出发,通过 `build.gradle` 示例对比 Groovy 和 Kotlin 的差异,并深入探讨那些**晦涩难懂的语法**,最后解析 `tasks.register<Copy>(

2025-04-28 09:40:45 1058

原创 Android 理清 Gradle、AGP、Groovy 和构建文件之间的关系

在 Android 开发中,我们常常会接触到一系列看似相近却各有分工的名词,比如:**Gradle**、**Groovy**、**AGP**、**gradle-wrapper.properties**、**build.gradle**、**settings.gradle** 等等。 它们彼此之间到底是什么关系?各自又承担了什么角色?本文将用清晰的结构,一次性帮你理清!

2025-04-27 13:16:36 1265

原创 Kotlin函数体详解:表达式函数体 vs 代码块函数体——使用场景与最佳实践

表达式函数体:轻巧快捷;代码块函数体:严谨灵活

2025-04-24 09:02:20 511

原创 Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系

在 Kotlin 中,高阶函数(Higher-Order Function)和 Lambda 表达式密切相关,但它们是两个不同的概念

2025-04-23 14:48:04 693

原创 Kotlin 协程在 LiveData 中的完美封装:CoroutineLiveData 全解

`CoroutineLiveData` 是 `liveData` 构造器创建出来的 `LiveData` 对象,它是 Jetpack 中为协程量身打造的 `LiveData` 版本,主要用来让我们在 `LiveData` 的作用域内,安全、方便地使用协程

2025-04-23 11:09:38 856

原创 迁移到 Android Jetpack Compose 的第一个理由:告别 RecyclerView 的复杂形式

在传统 Android UI 开发中,RecyclerView 是构建列表 UI 的标配组件,但是当需要处理多种不同类型的 item 时,它的编写成本和维护成本会突然上升。这不仅是编码的煮烤,还有一堆策略不符 SRP、OCP 等设计原则的问题。而 Jetpack Compose 的出现,则从根本上解决了这一系列问题,并提供了更现代、声明式、易维护的规划方式

2025-04-22 16:05:25 514

原创 Android RecyclerView 多布局场景下的设计思考:SRP 与 OCP 的权衡与优化

在日常 Android 开发中,RecyclerView 是我们用得非常频繁的一个组件,而与之搭配使用的 Adapter 则承担着数据与视图之间的桥梁作用。本文将围绕 Adapter 的本质角色、多布局场景下是否违反面向对象的设计原则(单一职责原则 SRP 与 开闭原则 OCP),以及如何更优雅地应对复杂场景进行系统性梳理

2025-04-22 09:34:47 891

原创 Android Jetpack Compose 状态管理解析:remember vs mutableStateOf,有啥不一样?为啥要一起用?

在 Jetpack Compose 的世界里,**UI 是响应式的**。这意味着当状态发生变化时,UI 会自动重组(Recompose)以反映新的状态

2025-04-20 18:34:43 1086

原创 [特殊字符] Kotlin与C的类型别名终极对决:typealias vs typedef,如何让代码脱胎换骨?

从高阶函数简化到跨平台魔法,揭秘类型别名在两大语言中的隐藏战斗力!

2025-04-19 11:26:37 910

原创 「JS 秒杀安卓」200 行代码搞定音乐频谱可视化:Web Audio API 背后的秘密

Web Audio API 是前端开发中一个强大的音频处理工具,它允许开发者通过 JavaScript 直接操控音频信号,实现音频播放、可视化、滤波、分析等高级功能。但许多开发者可能不了解:**这些 API 背后,其实是浏览器调用了各个平台的原生音频接口**。本文将通过图示与文字,深入解析 Web Audio API 在不同系统下的底层实现路径。

2025-04-18 11:25:36 1006

原创 Android 音频架构全解析:从 AudioTrack 到 AudioFlinger

Android 的音频架构是多层级的,每一层都有其作用与职责。是系统音频的心脏,统一调度所有音频流。和SoundPool适合日常播放场景,简单易用。AudioTrack提供 PCM 控制,适合高级需求。Native 层推荐使用Oboe,封装底层细节,兼容性与性能兼具。掌握这些 API 和音频流程,有助于你开发出更加稳定、高性能、低延迟的音频应用。

2025-04-18 10:48:12 1145

原创 双冒号::的奥秘:C++作用域解析全攻略,对比Java/Kotlin的隐藏技巧!

在类外部实现成员函数时,需要用作用域解析运算符来说明这个函数属于哪个类。功能C++JavaKotlin类外实现成员函数不支持不支持命名空间访问全局变量访问::variable不支持(无全局变量)不支持(无全局变量)函数引用不直接支持(但 C++11 起支持等)(Java 8 起)::function(常见用法)成员访问C++ 的更偏向“说明归属”;Kotlin 的更偏向“引用函数或属性”;

2025-04-18 10:14:47 274

原创 Android Compose 重组机制揭秘:@Composable 方法是重组的作用域

在 Jetpack Compose 中,我们经常听到“重组(Recomposition)”这个词。那么,什么是重组?它的作用域到底有多大?如何避免不必要的重组?今天我们就围绕一个关键结论来展开讲解:来看下面这段代码:每次点击按钮, 会更新。由于 是 函数的状态依赖,整个 Demo 函数会重新执行,包括其中的 和 都会被重新组合。如果 每次调用都会返回一个新颜色,那么每次点击都会让背景色发生变化,即使文字内容没变,这显然是不必要的重组。我们将组件拆成多个函数

2025-04-18 09:30:05 425

原创 从 ComponentActivity 看 Android Activity 的演变与 Jetpack 架构融合

Android 框架最原始的 Activity,提供最基本的组件生命周期管理,是所有 Activity 的基类。传统上开发者直接继承它来开发应用,但它的功能比较基础,没有内置对现代架构组件(如 Lifecycle、ViewModel 等)的支持。

2025-04-17 08:59:32 821

原创 C 语言结构体中的函数指针与 Kotlin 高阶函数的对比

在学习 C 语言的过程中,很多 Java/Kotlin 背景的开发者都会对结构体中出现的“函数指针”感到陌生。这段代码中,结构体Animal中的speak并不是一个普通变量,而是一个“函数指针”。。这其实与我们在 Kotlin 中使用高阶函数的目的如出一辙。

2025-04-16 09:38:56 655

原创 探索 C 与 Java/Kotlin 的语言差异:从指针到高阶函数

作为一名熟悉 Java 和 Kotlin 的开发者,初次接触 C/C++ 时常会遇到一系列概念上的“文化冲击”。本文将从几个关键点出发,帮助你更好地理解 C/C++ 与 Java/Kotlin 在语言设计上的核心区别。

2025-04-15 18:02:30 551

原创 深入解析 Android 图形系统:Canvas、Skia、OpenGL 与 SurfaceFlinger 的协作

在 Android 应用开发中,流畅的 UI 渲染是用户体验的核心。但你是否好奇,一个简单的 `View` 是如何从代码中的 `onDraw()` 方法一步步变成屏幕上的像素的?本文将从底层图形系统的视角,解析 Android 中 `Canvas`、Skia、OpenGL ES 和 `SurfaceFlinger` 的协作关系,并揭秘软绘制与硬绘制的完整流程。

2025-04-13 19:02:55 1179

原创 Android相机开发:90MB/s的内存陷阱:为什么Camera2抛弃了Camera1的byte[]回调?

谷歌推出 CameraX 的主要目的是解决 Camera1 和 Camera2 长期存在的兼容性碎片化和开发复杂度高的问题。推动 CameraX 的核心动机是解决 Android 生态的碎片化问题。抽象硬件差异 → 让开发者专注于业务逻辑内置最佳实践 → 避免性能陷阱无缝兼容扩展 → 平衡功能与兼容性对于大多数应用场景,CameraX 是最优选择。只有在需要深度定制硬件流水线时,才需回退到 Camera2。

2025-04-10 23:38:05 887

原创 从厨师到顾客:Android 声明式 UI 如何改变开发方式?

传统 View 体系代码基于 Java / Kotlin + XML。在 Android 开发的世界里,UI 构建方式经历了从**“亲自下厨”使用 Jetpack Compose 后,你只需要告诉厨房(框架)在传统 Android 开发中,构建 UI 就像经营一家餐厅,今天,我们就用“厨房”的比喻,彻底搞懂。“轻松点餐”**(声明式)的转变。

2025-04-10 17:50:27 670

原创 【安卓Camera】从 YUV_420_888 出发,全面了解 YUV 格式家族

顺序:Y -> U -> V结构:三个 Plane,Planar 格式每个 Plane 连续存储是 Camera API 的通用抽象格式,底层格式需要开发者解析判断;可以根据rowStride和 Plane 数据特征来判断是否为 NV21、I420 等格式;YUV420 分为 Planar(如 I420)与 Semi-Planar(如 NV21)两类;除了 YUV420,还有 YUV422、YUV444、YUV411 等格式,适用于不同压缩与质量需求。

2025-04-08 09:23:53 759

原创 安卓ConstraintLayout + Barrier 实战:让 TextView 动态宽度但不超过另一个控件

使用 ConstraintLayout + Barrier,我们可以优雅地实现 “动态宽度、最大限制、附加元素紧贴文字”的复杂布局,不需要手动计算宽度或写自定义 View。Barrier 约束最大边界constrainedWidth + bias 控制 TextView 对齐方式wrap_content 保留文字真实宽度省略号自动触发这种思路非常适用于复杂的通知栏、列表项、消息提醒等 UI 设计。

2025-04-07 10:26:17 1006

原创 Kotlin 中的 `reified` 关键字全解析:保留类型信息 + 优化高阶函数的双重魔法

功能普通泛型是否能用is T✅ 是❌ 否是否能获取T::class✅ 是❌ 否是否需要传入Class<T>❌ 不需要✅ 需要是否可用在高阶函数中优化性能✅ 是✅ 是(只 inline 部分)

2025-04-06 15:45:05 774

原创 UDP学习笔记(四)UDP 为什么大小不能超过 64KB?

特性UDPTCP最大报文长度65535 字节(含头部)无限制(持续流式传输)处理超大数据方式IP 层分片,易丢包TCP 分段,避免 IP 分片是否推荐发送大包❌ 不推荐,极易出错✅ 可以持续写入,系统自动处理分段重传机制无有场景音视频、实时通信、游戏、IoT 等文件传输、网页、API、可靠通道等请注意单个 UDP 报文大小尽量控制在 MTU 以下如果真的要发送大数据,考虑用 TCP 或实现自己的分片机制(如 RTP)

2025-04-06 15:38:26 1427

原创 Kotlin 类委托深入解析:以 MMKV 为例看委托机制在 Android 中的巧妙应用

Kotlin 的类委托是一个非常强大且实用的特性,在实际开发中,可以极大地减少模板代码并增强模块解耦性。MMKV 的巧妙之处在于它实现了两个接口,因此可以通过委托机制替代传统封装。在 Android 项目中,凡是实现了接口的类都可以考虑用委托的方式来简化实现。类委托≠继承,委托的核心优势是灵活和可替换性。希望这篇文章能帮你掌握类委托的核心理念,并能在项目中用好它,写出更优雅、可维护的 Kotlin 代码。如果你对属性委托(如by lazy。

2025-04-05 13:33:52 1178

原创 深入理解 Handler、Looper 、 MessageQueue和 HandlerThread

在 Android 中,负责界面绘制和用户交互。如果我们在主线程执行耗时操作(如网络请求、数据库查询、文件读写等),会导致界面卡顿甚至ANR因此,Android 采用让耗时任务放在子线程执行,但子线程那么,👉Handler—— 它可以让不同线程之间安全地通信,并支持消息机制。HandlerMessageLooperLooperHandlerHandlerMessageLooperHandler以下代码展示了Handler。HandlerLooper如果你需要Looper,你不能直接用Thread,因为。

2025-04-03 15:28:41 963

原创 理解Kotlin高阶函数:传递函数,而不是直接执行

Kotlin 高阶函数方式(更简洁)= nulladapter.bindView("Hello") // 模拟点击事件在这里,作为一个高阶函数存储回调,并在里被调用。这种方式比传统接口回调更简洁、灵活。4. 为什么要用高阶函数?高阶函数可以让代码更加灵活,比如我们可以很容易地替换不同的逻辑,而不用修改println(operateOnNumbers(5, 3, subtract)) // 输出 2。

2025-04-03 00:52:43 667

原创 Kotlin 集合函数:map 和 first 的使用场景

Kotlin 提供了丰富的集合操作函数,使开发者可以更加简洁、高效地处理数据。其中,map和first是两个常用的函数,分别用于转换集合和获取集合中的第一个元素。

2025-04-03 00:37:24 348

原创 深入理解 YUV 颜色空间:从原理到 Android 视频渲染

YUV 颜色空间适用于视频压缩,U/V 分量的正确取值对颜色显示至关重要。YUV 转 RGB 需要正确的转换公式,否则可能导致画面偏色(如绿色)。在 Android 开发中,可使用或OpenGL ES进行 YUV 渲染。调试 YUV 渲染时,务必检查 U/V 分量,确保它们不是 0,而是接近128。如果你遇到 Android 设备摄像头输出偏绿色的问题,可以先检查 YUV 数据的 UV 分量,并尝试调整颜色转换公式。

2025-03-31 10:11:05 1074

原创 为什么摄像头输出 YUV 而不是 RGB?以及 SurfaceView 如何渲染 YUV?

在 Android 开发中,我们经常需要处理摄像头数据和视频流,而摄像头通常输出的是 YUV 格式的数据,而不是 RGB。为什么会这样?另外,在 UI 层渲染时,SurfaceView、TextureView 和 GLSurfaceView 又是如何处理 YUV 数据的?本文将详细解答这些问题

2025-03-30 15:25:05 638

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除