<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Wesley的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/SunIOT</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; SunIOT]]></copyright><item><title><![CDATA[基于 KMP 实现一个跨平台音乐播放器]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/160904196</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/160904196</guid><author>SunIOT</author><pubDate>Sat, 09 May 2026 00:35:11 +0800</pubDate><description><![CDATA[摘要：LynMusic是一款基于KMP技术开发的跨平台音乐播放器，支持安卓、iOS、macOS等多平台。开发者利用AI编程工具Codex完成了开发，解决了歌词搜索难、平台兼容性等问题。该播放器支持本地音乐、云盘导入、歌词分享、定时播放等功能，并适配车机、电视等设备。采用Kotlin Compose开发，相比Web方案性能更优。项目已开源，开发者分享了使用AI编程的心得，包括需求沟通、代码维护等经验。（149字）]]></description><category></category></item><item><title><![CDATA[安卓屏保调试2]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/159475671</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/159475671</guid><author>SunIOT</author><pubDate>Wed, 25 Mar 2026 21:29:40 +0800</pubDate><description><![CDATA[本文记录了Android设备屏保调试的经验。通过dumpsys power命令发现屏保不生效的原因是mStayOnWhilePluggedInSetting参数被设为3（交流电/USB供电时保持亮屏），将其改为0后问题解决。文章详细解释了该参数的位掩码设计原理（0-8对应不同充电方式），并指出Android TV因无电池被视为始终AC供电的特殊情况。此外还提供了其他排查方法，包括检查Wake Locks、分析Android T新增的UndimDetectorWakeLock机制，以及相关调试命令。最后分享了]]></description><category></category></item><item><title><![CDATA[Windows怎么方便查看AOSP代码]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/159436317</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/159436317</guid><author>SunIOT</author><pubDate>Tue, 24 Mar 2026 22:08:33 +0800</pubDate><description><![CDATA[本文介绍了在Windows环境下高效查看AOSP代码的方法。作者指出在线工具cs.android.com和xrefandroid.com存在分支搜索限制、速度慢等问题，推荐使用WSL2配置Android Studio for Platform（ASFP）进行本地浏览。ASFP提供AOSP深度集成、智能代码编辑、强大调试等功能，建议32G以上内存配置运行。文章还分享了安装指南、同步闪退解决方案（如限制编译线程）以及高分屏适配技巧，为开发者提供了完整的Windows+AOSP开发环境搭建方案。]]></description><category></category></item><item><title><![CDATA[远程服务器运行Android Studio开发aosp源码]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/158779753</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/158779753</guid><author>SunIOT</author><pubDate>Sat, 07 Mar 2026 23:23:55 +0800</pubDate><description><![CDATA[本文介绍了在远程服务器上使用Android Studio开发AOSP源码的优化方案。作者对比了Source Insight和Android Studio的开发体验，指出通过X11协议在Linux服务器运行GUI版Android Studio的优势，包括更快的跳转和补全功能。文章详细讲解了如何利用aidegen工具快速打开模块、调试system_server，以及解决界面模糊问题的技巧。最后推荐了Windows下使用MobaXterm的方案，并建议在服务器安装便携版Android Studio或CLion]]></description><category></category></item><item><title><![CDATA[脱糖魔法：为什么 java.time 在 Android 上还是会翻车？]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/157225680</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/157225680</guid><author>SunIOT</author><pubDate>Thu, 22 Jan 2026 00:18:25 +0800</pubDate><description><![CDATA[文章摘要：作者在开发Android广告频控功能时，使用java.time.*API遇到兼容性问题。虽然通过脱糖(Desugaring)技术让新API在旧Android版本运行，但客户项目因AGP版本过低(4.0+)导致脱糖失败，报NoSuchMethodError错误。分析发现LocalDate.ofInstant是Java 9+ API，需要脱糖库2.0+支持，而低版本AGP只能使用1.x库。最终解决方案是改用兼容Java 8的API写法ZonedDateTime.ofInstant().toLocalD]]></description><category></category></item><item><title><![CDATA[安卓如何收敛自身以及第三方sdk日志]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/155164983</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/155164983</guid><author>SunIOT</author><pubDate>Sun, 23 Nov 2025 18:04:49 +0800</pubDate><description><![CDATA[本文介绍了两种处理安卓日志的方法：编译期混淆和运行时Hook。对于自身应用和第三方SDK产生的日志，可以通过Proguard/R8配置去除特定日志方法（-assumenosideeffects），但会影响问题排查。更灵活的方式是使用字节跳动的bhook库Hook系统日志接口（如__android_log_buf_write），结合腾讯xlog实现日志重定向。通过JNI层拦截日志调用，既可控制控制台输出，又能将日志存储到文件。]]></description><category></category></item><item><title><![CDATA[安卓如何每次重启开机后只执行一次代码]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/154616879</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/154616879</guid><author>SunIOT</author><pubDate>Sun, 09 Nov 2025 20:17:11 +0800</pubDate><description><![CDATA[安卓实现每次重启只执行一次代码的方法有三种：1）使用开机广播，但可能延迟或被禁止；2）设置非persist属性标记，但第三方应用无权限；3）最佳方案是利用/proc/sys/kernel/random/boot_id作为开机唯一标识符。该文件每次重启都会变化，但同一开机周期内保持不变。文中提供了Kotlin代码示例，通过读取boot_id或boot_count作为标记，配合SharedPreferences存储执行状态，确保代码仅在每次启动后首次运行时执行。这种方法可靠且不受权限限制，是最推荐的实现方式。]]></description><category></category></item><item><title><![CDATA[基于Binder的4种RPC调用]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/152557012</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/152557012</guid><author>SunIOT</author><pubDate>Sun, 05 Oct 2025 16:15:23 +0800</pubDate><description><![CDATA[本文介绍了基于Binder的四种RPC调用方式，重点探讨了两种特殊场景下的实现方法。第一种是通过Intent传递Messenger进行跨进程通信，适用于需要授权弹窗等解耦场景，如小米ADB安装时的安全校验流程。文章提供了Kotlin实现代码示例，展示了服务端和客户端的交互过程。第二种是基于ContentProvider的call方法实现同步RPC调用，相比AIDL更灵活且无需严格方法定义顺序，并以Android系统Settings.Secure.putInt()为例说明其应用。]]></description><category></category></item><item><title><![CDATA[安卓14系统应用收不到开机广播]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/150471052</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/150471052</guid><author>SunIOT</author><pubDate>Sun, 17 Aug 2025 18:32:05 +0800</pubDate><description><![CDATA[摘要： 安卓14系统对应用开机广播接收机制进行了调整，取消了系统应用对STOPPED状态的豁免权。此前，安卓3.1+版本会将新安装/强制停止的应用标记为STOPPED状态（无法接收广播），但系统应用（FLAG_SYSTEM）可豁免该限制。安卓14的改动导致系统应用在恢复出厂设置后同样受限于STOPPED状态，需通过代码补丁修复。值得注意的是，安卓15版本再次调整该机制。开发者需关注版本差异对广播接收的影响。（149字）]]></description><category></category></item><item><title><![CDATA[安卓对外发布工程源码:怎么做到仅UI层公布]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/148832434</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/148832434</guid><author>SunIOT</author><pubDate>Sun, 22 Jun 2025 20:43:25 +0800</pubDate><description><![CDATA[本文介绍了如何将安卓工程中的非UI模块合并并混淆后发布，同时仅公开UI层代码。通过本地Maven仓库的方式，解决了依赖传递和内网SDK依赖问题。具体步骤包括：配置本地Maven路径、使用maven-publish插件发布模块、处理多Flavor模块和代码混淆控制。对于内网依赖，可通过下载并放入本地仓库解决。该方法保持了Maven管理方式，便于后续维护和更新发布。]]></description><category></category></item><item><title><![CDATA[安卓官方版fat-aar:使用Fused Library将多个Android库发布为一个库]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/148828875</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/148828875</guid><author>SunIOT</author><pubDate>Sun, 22 Jun 2025 16:13:58 +0800</pubDate><description><![CDATA[Android官方在AGP8.12+推出了fused-library插件，支持将多个模块打包成一个AAR文件，解决了第三方fat-aar插件不兼容新版本的问题。该插件优点包括官方支持、自动处理依赖传递，但仍存在嵌套依赖打包不全、远程包兼容性差、不支持源码发布/混淆/Databinding等局限性。使用时需注意kotlin_module冲突问题，可通过修改模块名解决。目前官方正在完善lint.jar包含、文件依赖项支持等功能，开发者可根据需求选择是否迁移至该方案。]]></description><category></category></item><item><title><![CDATA[手机厂商的应用列表权限管控真的起效了吗]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/147879668</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/147879668</guid><author>SunIOT</author><pubDate>Sun, 11 May 2025 21:34:18 +0800</pubDate><description><![CDATA[手机厂商的应用列表权限管控效果有限。实验发现，即使未授予应用获取应用列表的权限，某些应用仍能通过特定方法获取设备上的应用安装列表。]]></description><category></category></item><item><title><![CDATA[EMMC存储性能测试方法]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/147685560</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/147685560</guid><author>SunIOT</author><pubDate>Sat, 03 May 2025 17:47:38 +0800</pubDate><description><![CDATA[emmc 存储性能测试]]></description><category></category></item><item><title><![CDATA[内存性能测试方法]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/147685550</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/147685550</guid><author>SunIOT</author><pubDate>Sat, 03 May 2025 17:46:02 +0800</pubDate><description><![CDATA[内存性能测试]]></description><category></category></item><item><title><![CDATA[btrace2.0使用方法]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/147671552</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/147671552</guid><author>SunIOT</author><pubDate>Fri, 02 May 2025 19:56:18 +0800</pubDate><description><![CDATA[现在 brace 进化到 2.0 了，让我们一起来看看如何使用。我这里主要记录一下接入的一些报错问题：目前最新版本是2.0.3-rc03项目的gradle版本是7.0.2，gradle plugin是7.0.0。]]></description><category></category></item><item><title><![CDATA[btrace1.0使用方法]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/147671543</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/147671543</guid><author>SunIOT</author><pubDate>Fri, 02 May 2025 19:55:22 +0800</pubDate><description><![CDATA[记于 2022 年 6 月 24 日btrace(又名 RheaTrace) 是一个基于实现的高性能 Android trace 工具，它支持在 App 编译期间自动注入自定义事件，并使用额外提供 IO 等 native 事件。]]></description><category></category></item><item><title><![CDATA[音视频缓存数学模型]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/146298706</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/146298706</guid><author>SunIOT</author><pubDate>Sun, 16 Mar 2025 18:13:25 +0800</pubDate><description><![CDATA[播放器作为消费者，缓存作为生产者。]]></description><category></category></item><item><title><![CDATA[安卓屏保调试]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/146298352</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/146298352</guid><author>SunIOT</author><pubDate>Sun, 16 Mar 2025 17:44:41 +0800</pubDate><description><![CDATA[先看一下在设置点击屏保预览后的调用链（Android 14）fill:#333;点击按钮（ performClick()）触发 onClick() (lambda 表达式)调用 preview()DreamController的打印信息DreamActivity是一个不需要注册的Activity，运行在各个屏保进程。屏保应用实现DreamService即可。屏保状态时，后台起应用会进入 onStop 状态（该例子 onStop 里面调用了 finish）]]></description><category></category></item><item><title><![CDATA[安卓内存泄露之DMA-BUF异常增长:Android Studio镜像引起DMA内存泄露]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/146027994</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/146027994</guid><author>SunIOT</author><pubDate>Tue, 04 Mar 2025 21:49:46 +0800</pubDate><description><![CDATA[今天用着安卓 14 的板子的时候突然系统卡死。查看日志发现launcher都被干掉了看发现DMA-BUF占了3G多（4G设备），应用free ram基本没了。刚开始以为是scrcpy的问题。后来经调查发现是android studio的屏幕镜像问题。]]></description><category></category></item><item><title><![CDATA[安卓组件化之动态依赖功能模块]]></title><link>https://blog.youkuaiyun.com/SunIOT/article/details/145999057</link><guid>https://blog.youkuaiyun.com/SunIOT/article/details/145999057</guid><author>SunIOT</author><pubDate>Mon, 03 Mar 2025 20:49:57 +0800</pubDate><description><![CDATA[对于拥有不同渠道的 APP 来说，可能需要集成不同的功能模块，也可能同一个功能有不同实现。最简单的方法可能是通过接口、工厂模式、 flavorImplement 和渠道自定义代码的方法来实现了。但是，如果不想建那么多渠道代码目录，需要通过一套代码来初始化模块，那么上述方法就不行了。那么如何在不依赖模块的前提下动态调用其功能呢？有几种方法：1、反射、接口隔离和工厂模式2、动态功能模块（Dynamic Feature Module），国内不适用。3、利用 Java 的机制，通过配置文件声明接口实现类。]]></description><category></category></item></channel></rss>