<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[小旭的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/c19344881x</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; c19344881x]]></copyright><item><title><![CDATA[Android Audio其他——TTS语音合成（三）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/159652883</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/159652883</guid><author>c19344881x</author><pubDate>Wed, 17 Jun 2026 19:22:50 +0800</pubDate><description><![CDATA[Android TTS（TextToSpeech）是系统提供的语音合成框架，可将文本转为语音输出。其核心功能包括：1）初始化TTS引擎，支持多级连接策略；2）设置语言、音调、语速等参数；3）语音合成与播放控制。源码分析显示，TTS采用bindService机制连接引擎服务，通过消息队列管理播放任务，最终使用MediaPlayer实现音频播放。整个流程包含完善的错误处理和状态回调机制，支持多应用并发使用。相比第三方SDK，系统TTS具有无需集成、兼容性好等优势，适用于导航、有声阅读等场景。]]></description><category></category></item><item><title><![CDATA[Android SystemUI——获取应用界面略缩图（十九）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/153965202</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/153965202</guid><author>c19344881x</author><pubDate>Wed, 17 Jun 2026 19:22:16 +0800</pubDate><description><![CDATA[在 Android SystemUI 开发最近任务列表时，需要显示应用界面略缩图，这里我们就来分析一下获取应用界面略缩图的整个调用流程。]]></description><category></category></item><item><title><![CDATA[Android Audio实战——AudioHal数据断音（十八）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/157022160</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/157022160</guid><author>c19344881x</author><pubDate>Tue, 27 Jan 2026 16:46:14 +0800</pubDate><description><![CDATA[本文分析了音频播放中出现卡顿但日志未记录underrun的特殊案例。通过PCM数据解析发现AudioHal层存在断音问题，但未找到underrun日志。文章详细解析了underrun的两种日志场景及其源码实现，包括AudioTrack重启逻辑和AudioFlinger混音线程的underrun检测机制。通过计算音频数据写入量（176.4KB/s）与实际写入数据对比，发现了03.142和03.222两个时间点的数据不足问题，并介绍了通过dumpsys命令获取underrun信息的方法。最后指出underrun]]></description><category></category></item><item><title><![CDATA[Android Audio实战——Underrun问题分析（十七）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/156303779</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/156303779</guid><author>c19344881x</author><pubDate>Tue, 27 Jan 2026 16:35:27 +0800</pubDate><description><![CDATA[本文分析了Android音频系统中的严重Underrun问题。通过日志发现AudioTrack在start()调用后546ms即出现BUFFERTIMEOUT异常，导致音轨被移除。源码分析显示，AudioFlinger的prepareTracks_l()函数会检查音轨数据，当数据不足且重试次数耗尽时触发该异常。系统采用渐进式降级策略：正常播放时要求完整缓冲区，即将失败时放宽至1帧数据。问题根源在于应用层：可能未及时写入数据、缓冲区设置过小或写入线程优先级低。建议应用在start()前预填充数据，设置合理缓冲]]></description><category></category></item><item><title><![CDATA[Android性能分析——GPU资源耗尽分析（二十六）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/155788343</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/155788343</guid><author>c19344881x</author><pubDate>Mon, 29 Dec 2025 10:15:21 +0800</pubDate><description><![CDATA[本文分析了Android车机系统中GPU资源耗尽导致应用闪退的案例。通过日志定位到EGL_BAD_ALLOC错误，表明系统无法分配足够图形资源创建EGL上下文。问题主要发生在渲染线程初始化EGL环境时，根源在于车机系统对GPU资源的严格限制（如EGLContext数量、GPU内存等）。文中详细解读了SkiaOpenGLPipeline和EglManager的源码调用链路，指出createContext()函数中的致命断言是崩溃的直接原因，并提出了移除断言、增加重试机制、优雅降级等改进方案。该案例揭示了资源受]]></description><category></category></item><item><title><![CDATA[Android 蓝牙实战——蓝牙协议断开分析（二十六）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/152047302</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/152047302</guid><author>c19344881x</author><pubDate>Wed, 03 Dec 2025 09:27:44 +0800</pubDate><description><![CDATA[遇到这样一个问题，应用程序主动调用 A2dp 断开连接，但是蓝牙协议一直处于连接状态，并未执行断开操作，本文主要针对该问题进行详细解析。]]></description><category></category></item><item><title><![CDATA[Android Wifi——wpa_supplicant启动流程（二十二）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/154703274</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/154703274</guid><author>c19344881x</author><pubDate>Wed, 03 Dec 2025 09:27:09 +0800</pubDate><description><![CDATA[Android系统中的wpa_supplicant是Wi-Fi连接的核心组件，负责网络扫描、认证(支持WPA-Personal、WPA-Enterprise等协议)、关联、加密密钥生成等底层操作。它通过HIDL接口与上层系统通信，启动时会自动发现和配置网络接口，并创建对应的HIDL服务实例（如STA模式接口和P2P点对点接口）。该机制支持动态接口管理，实现了底层Wi-Fi功能与Android框架的模块化对接，为系统提供了稳定的Wi-Fi连接能力。]]></description><category></category></item><item><title><![CDATA[Android性能分析——Watchdog异常分析（二十五）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/152007075</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/152007075</guid><author>c19344881x</author><pubDate>Thu, 06 Nov 2025 09:17:27 +0800</pubDate><description><![CDATA[在次遇到了车机黑卡死问题，但是对于关键字 am_crash、am_anr 和 am_kill 都无效的情况的，又没有关键的 AndroidRuntime 日志的情况下，可以考虑 Watchdog 异常关键字进行查找。]]></description><category></category></item><item><title><![CDATA[Android性能分析——IO阻塞分析（二十四）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/151611442</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/151611442</guid><author>c19344881x</author><pubDate>Thu, 06 Nov 2025 09:17:08 +0800</pubDate><description><![CDATA[对于系统性能分析，多数都是黑卡死的问题，这里又是一个典型的系统卡死问题，用户车机开机后无法使用，点击多个应用均无法打开。]]></description><category></category></item><item><title><![CDATA[Android 性能优化——Binder对象超限分析（二十三）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/151786943</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/151786943</guid><author>c19344881x</author><pubDate>Wed, 05 Nov 2025 09:34:30 +0800</pubDate><description><![CDATA[​在 WiFi 专栏的《P2P状态变化广播》和《P2P状态变化回调》介绍了 P2P 连接异常的现象，但其影响范围也仅限于 WiFi P2P 功能，到后期发现该问题会导致系统黑屏卡死，因此决定将该问题的分析放到性能专栏。]]></description><category></category></item><item><title><![CDATA[Android Audio其他——音频相关模块（附）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/151217851</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/151217851</guid><author>c19344881x</author><pubDate>Wed, 05 Nov 2025 09:33:08 +0800</pubDate><description><![CDATA[针对 Android Audio FWK 开发来说，很多功能都是通过 APP 下发指令，然后经过 FWK 进行处理（有些功能直接透传），传递到 Hal 层（有时也算是 FWK 负责），最后传递到对应模块进行处理。]]></description><category></category></item><item><title><![CDATA[Android Audio实战——音频播放失败分析（十六）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/153209611</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/153209611</guid><author>c19344881x</author><pubDate>Tue, 04 Nov 2025 09:20:30 +0800</pubDate><description><![CDATA[文章摘要： 本文分析了车辆音频播放失败的硬件问题。通过日志排查发现，首次播放时音频流写入失败（错误码-5，I/O错误），暂停/恢复流程中因硬件故障导致mActiveTracks验证失败。最终确认问题根源为PCM设备层的硬件故障，导致音频数据读写异常，引发无声现象。案例表明，当出现I/O层错误时需优先排查硬件及驱动状态。]]></description><category></category></item><item><title><![CDATA[Android Audio基础——打开音频输出通道（二十七）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/153725805</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/153725805</guid><author>c19344881x</author><pubDate>Tue, 04 Nov 2025 09:20:14 +0800</pubDate><description><![CDATA[​上一篇文章介绍了创建音频 Patch 的相关流程，该流程的最后是需要打开对应的音频通道，并且在前面的文章《AudioFlinger回放录制线程》中也简单介绍过相关内容，这里我们就接着上面的内容继续深入分析。
​]]></description><category></category></item><item><title><![CDATA[Android Audio基础——创建音频patch（二十六）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/153792516</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/153792516</guid><author>c19344881x</author><pubDate>Mon, 03 Nov 2025 11:14:30 +0800</pubDate><description><![CDATA[上一篇文章介绍了startAudioSource() 的最终核心作用就是创建音频 patch，音频 patch 其实就是 Android 音频系统中连接音频源和音频宿的虚拟通路，我们在 Radio 专栏中介绍过，Radio 的播放就是通过创建 Audio Patch 进行播放的，这里我们再次深入分析一下 Audio Patch 创建流程。]]></description><category></category></item><item><title><![CDATA[Android Audio基础——设置音频源类型（二十五）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/153775453</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/153775453</guid><author>c19344881x</author><pubDate>Mon, 03 Nov 2025 11:14:09 +0800</pubDate><description><![CDATA[在当今车载设备的多媒体体验中，音频播放质量直接影响着用户的整体感受。从简单的媒体播放到复杂的多设备音频路由，Android 音频系统面临着日益增长的挑战。然而，大多数开发者熟悉的 MediaPlayer 和 AudioTrack 只是这个庞大系统的"冰山一角"——它们提供了简单易用的播放接口，却隐藏了底层复杂的音频源管理机制。]]></description><category></category></item><item><title><![CDATA[Android Audio录音——AudioRecord回声消除（九）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/151191655</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/151191655</guid><author>c19344881x</author><pubDate>Thu, 16 Oct 2025 09:17:19 +0800</pubDate><description><![CDATA[在语音通话或录音场景中，回声（Acoustic Echo）通常是指说话的声音从对方的扬声器播放出来，又被对方的麦克风拾取，然后有被传回来，导致我们听到了自己延迟了一段时间的重复声音。]]></description><category></category></item><item><title><![CDATA[Android Audio录音——Buffer释放流程（八）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/153247912</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/153247912</guid><author>c19344881x</author><pubDate>Thu, 16 Oct 2025 09:08:54 +0800</pubDate><description><![CDATA[通过前面的学习我们了解了 AudioRecord 录音焦点的抢占逻辑以及 obtainBuffer() 启动流程，这里我们来看一下 Buffer 的释放流程 releaseBuffer()。]]></description><category></category></item><item><title><![CDATA[Android Audio录音——obtainBuffer启动流程（七）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/152229135</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/152229135</guid><author>c19344881x</author><pubDate>Wed, 15 Oct 2025 09:03:05 +0800</pubDate><description><![CDATA[上一篇文章中介绍了在 AudioRecord 的 obtainBuffer() 函数中获取音频缓冲区，他与数据读取文章中介绍的 obtainBuffer() 函数并不相同，这里我们主要看一下获取音频缓冲区 obtainBuffer() 函数的启动流程。]]></description><category></category></item><item><title><![CDATA[Android Audio录音——录音通道切换重启（六）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/152135760</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/152135760</guid><author>c19344881x</author><pubDate>Wed, 15 Oct 2025 09:02:50 +0800</pubDate><description><![CDATA[上一篇文章我们已经分析出问题原因为 AudioRecord 启动失败导致了问题的出现，这一篇我们继续深入分析，看一下具体启动失败的原因。]]></description><category></category></item><item><title><![CDATA[Android Audio录音——重复创建录音通道（五）]]></title><link>https://blog.youkuaiyun.com/c19344881x/article/details/152125454</link><guid>https://blog.youkuaiyun.com/c19344881x/article/details/152125454</guid><author>c19344881x</author><pubDate>Tue, 14 Oct 2025 09:12:57 +0800</pubDate><description><![CDATA[上一篇问文章我们介绍了 AudioRecord 的录音基础，并且分析了 AudioRecord 调用 start() 的相关代码。这里正好遇到了一个 AudioRecord 录音异常的问题，我们来总结分析一下。]]></description><category></category></item></channel></rss>