<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[WriteBug001的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/WriteBug001</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; WriteBug001]]></copyright><item><title><![CDATA[Paint Cavans高级绘制：[一]Paint画笔高级应用]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/169047395</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/169047395</guid><author>WriteBug001</author><pubDate>Sun, 25 Oct 2026 10:35:41 +0800</pubDate><description><![CDATA[（线性渲染）：指定起点和终点，颜色顺着一条线慢慢过渡。（环形渲染）：像水波纹一样，从一个圆心向外围辐射渐变。（扫描渲染）：这个最典型，想想雷达扫描图，或者那种五颜六色的圆环进度条，就是它干的。围绕圆心 360 度顺时针渐变。（位图渲染）划重点！这是做“圆形头像”的神器。直接把一张图片当成颜料（纹理）画上去，省去了复杂的图层叠加（Xfermode）裁剪。（组合渲染）：如果一种特效不够，那就把两个 Shader 绑在一起，通过图层混合模式叠加，效果拉满。]]></description><category></category></item><item><title><![CDATA[UI核心 - 绘制流程(测量、布局、绘制)]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/167397665</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/167397665</guid><author>WriteBug001</author><pubDate>Fri, 09 Oct 2026 21:44:09 +0800</pubDate><description><![CDATA[MeasureSpec封装了View的测量模式（Spec Mode）和尺寸（Spec Size）。它是一个32位int值：高2位表示模式，低30位表示尺寸。View = 模式 + 尺寸->MeasureSpec 32位int值SpecMode（前2位） + SpecSize（后30）ViewGroup：重写onLayout摆放子View。View：仅需确定自身位置，onLayout可选。必须重写onMeasure处理尺寸，重写onDraw绘制内容。]]></description><category></category></item><item><title><![CDATA[UI核心 - UI绘制流程及原理]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/166687706</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/166687706</guid><author>WriteBug001</author><pubDate>Sat, 26 Sep 2026 11:31:56 +0800</pubDate><description><![CDATA[然后通过 findViewById 获取 id 为 com.android.internal.R.id.content 的基础布局，一般为 FrameLayout，后面我们的界面就是绘制在这个布局里面的。将得到的布局资源添加到 DecorView 中。该方法根据系统主题属性（如是否有ActionBar、浮动窗口等）确定不同的layoutResource（例如R.layout.screen_simple）。入口：在Activity的onCreate中调用setContentView传入布局资源ID。]]></description><category></category></item><item><title><![CDATA[从驱动来分析服务的添加过程]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/164192895</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/164192895</guid><author>WriteBug001</author><pubDate>Sun, 30 Aug 2026 20:57:28 +0800</pubDate><description><![CDATA[Binder Driver 的核心工作就是“找目标 → 放入目标todo→wake_up→ 取出 transaction → 转成交给用户空间”；而 ServiceManager 真正的业务处理，则发生在返回用户空间之后。​。]]></description><category></category></item><item><title><![CDATA[Android Binder 驱动 - 内核驱动层源码初探]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/163017090</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/163017090</guid><author>WriteBug001</author><pubDate>Sun, 19 Jul 2026 12:43:20 +0800</pubDate><description><![CDATA[和。Binder 驱动的核心目标是高效地实现进程间通信(IPC)，它通过一种"一次拷贝"和基于线程池的模型来 达成这一目标，这些函数共同协作，完成了驱动的初始化、设备打开，内存映射和具体 IPC 命令处理的全流程。让设备在系统启动时诞生。应用层进程一启动，帮它在内核创建了存放服务引用的几棵红黑树，帮它抢占了一块内核只读的虚拟地址空间。当 Client 端真正要发送事务时，调用进入内核：驱动通过在接收端的虚拟地址上圈地。紧接着，临门一脚，动态申请物理页并执行。]]></description><category></category></item><item><title><![CDATA[Android Binder 驱动 - 启动 ServiceManager 进程]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/162912789</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/162912789</guid><author>WriteBug001</author><pubDate>Wed, 15 Jul 2026 21:06:15 +0800</pubDate><description><![CDATA[通常我们认为ioctl会阻塞，那是因为在标准 Binder 线程池模式中，线程必须等到驱动有数据才能返回。而在驱动先通知：通过epoll告知 FD 有数据。此时调用ioctl，本质上是去执行“把数据从驱动拷贝到用户空间”的操作。由于数据已经就绪，这个动作会瞬间完成。]]></description><category></category></item><item><title><![CDATA[Android 12 (AOSP) 添加自定义系统服务]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/160527207</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/160527207</guid><author>WriteBug001</author><pubDate>Sun, 26 Apr 2026 15:17:46 +0800</pubDate><description><![CDATA[在 Android Framework 中添加自定义系统服务并将其完全暴露给第三方应用，需要打通从 AIDL 接口定义、SystemServer 注册、SELinux 权限配置到 ART 虚拟机 API 白名单扫描的完整闭环。只要遗漏任何一个细节（如常量命名匹配、 注解清理、缓存清除），都会导致调用失败。创建文件：注意：底层接口本身可以使用  隐藏，不对外暴露，保证系统安全性。

实现服务端逻辑

创建文件：继承自 AIDL 生成的 Stub，并实现具体的业务逻辑。
二、 应用层 Manager 封装与 A]]></description><category></category></item><item><title><![CDATA[Android Binder 驱动 - Media 服务启动流程]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/151116903</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/151116903</guid><author>WriteBug001</author><pubDate>Tue, 02 Sep 2025 16:48:46 +0800</pubDate><description><![CDATA[本人能力有限，关于具体函数的介绍只能停留在表面上，分析不到之处还请不吝赐教，啊，头皮发麻…]]></description><category></category></item><item><title><![CDATA[Android FrameWork - 开机启动 SystemServer 进程]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/151022520</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/151022520</guid><author>WriteBug001</author><pubDate>Sat, 30 Aug 2025 17:03:25 +0800</pubDate><description><![CDATA[还有一个重要的地方，就是 binder 线程池的启动，启动binder 线程池后SystemServer进程就可以与其他进程进行通信了，在之前的安卓源码中，binder 线程池的启动都是放在启动 SystemServer 时创建的，而安卓 12 是在。在前面分析 AndroidRuntime::start 代码时，我们知道 startReg 就是注册 JNI 方法 的。，记住这里的 所有参数就是上面的 构造启动 system_server 的参数，包括写死的。在安卓 10 之前，启动系统服务是通过。]]></description><category></category></item><item><title><![CDATA[Android FrameWork - Zygote 启动流程分析]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/150775917</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/150775917</guid><author>WriteBug001</author><pubDate>Mon, 25 Aug 2025 17:59:15 +0800</pubDate><description><![CDATA[一个为 null 一个不为 null，神不神奇，其实 forkSystemServer 仍只会返回一个值，开机的时候 系统服务一定会被创建，Zygote 更会被创建，代表着 forkSystemServer 之上的代码仍会被执行一次，forkSystemServer 及以下的代码会被执行两次。虚拟机已经被启动，通过 JNI 调用 Java 代码，Java 代码就可以在虚拟机跑起来了，接下来完全进入 Java 代码内容，呜呜呜～，终于到能看懂的代码了。事件发生时，这些代码就会被执行，神奇之处就在与 多进程，]]></description><category></category></item><item><title><![CDATA[Android SurfaceView & TextureView]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/150343480</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/150343480</guid><author>WriteBug001</author><pubDate>Wed, 13 Aug 2025 13:27:40 +0800</pubDate><description><![CDATA[继承自 View，它包含两个部分——一个普通的View组件，用于在屏幕上占据位置，以及一个独立的Surface。这个 Surface 拥有自己的绘图缓冲区，它不是在主 UI 线程上绘制的。因此，可以在一个单独的后台线程上向这个 Surface 渲染内容，而不会阻塞或影响主 UI 线程的流畅性。一般的 Activity 包含的多个 View 会组成 View hierachy 的树形结构，只有最顶层的 DecorView，也即跟节点视图，才是对 WMS 可见。]]></description><category></category></item><item><title><![CDATA[SparseArray & ArrayMap]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/150343456</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/150343456</guid><author>WriteBug001</author><pubDate>Wed, 13 Aug 2025 13:24:06 +0800</pubDate><description><![CDATA[SparseArray 系列：Key 是原始数值类型（int、long），替代，避免装箱节省内存。ArrayMap：Key 可以是任意对象，替代，小数据量节省内存。共同点数据量少时比 HashMap 更省内存查找是二分法 + 数组结构插入删除需要移动数据，性能不适合超大数据集。]]></description><category></category></item><item><title><![CDATA[Java Lock]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/150343435</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/150343435</guid><author>WriteBug001</author><pubDate>Wed, 13 Aug 2025 13:22:20 +0800</pubDate><description><![CDATA[最近的几篇文章都是关于 Java 的，其实为是干安卓的，但是 Java 也是安卓的基础，这些概念知识也是通往高级开发的必经之路，可能你看完文章会发现对自己的开发帮助也不大，都是一些概念类的，但是这些东西对你理解和学习更深层次的知识是有帮助的，最后要看你怎么去理解消化了。Java 相关的文章就先写这么多，后续再查漏补缺安卓知识，了解-学习-消化-理解-输出。]]></description><category></category></item><item><title><![CDATA[HashMap 底层原理 (JDK 1.8 源码分析)]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/150071795</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/150071795</guid><author>WriteBug001</author><pubDate>Fri, 08 Aug 2025 17:47:01 +0800</pubDate><description><![CDATA[数组 + 链表 + 红黑树：有效解决了哈希冲突严重时链表过长导致查询效率下降的问题，将最坏情况下的时间复杂度从 O(n) 降低到 O(logn)。改进的哈希算法方法通过高位异或低位，使得哈希值的高位也能参与到索引计算中，降低了哈希冲突的概率，使得元素分布更均匀。扩容优化：在resize()过程中，链表元素的重新定位变得更加高效，避免了每个元素的重新哈希计算。懒初始化table数组在第一次put操作时才进行初始化，节省了内存空间。]]></description><category></category></item><item><title><![CDATA[Java垃圾回收（GC）探析]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/150015657</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/150015657</guid><author>WriteBug001</author><pubDate>Thu, 07 Aug 2025 16:07:04 +0800</pubDate><description><![CDATA[GC Root（垃圾回收根）是 Java 垃圾回收（GC）算法中用于判断对象是否“存活”的起始点。栈中的引用（局部变量）静态变量常量引用JNI 全局引用线程、ClassLoader 等特殊引用从 GC Roots 出发。沿着对象引用关系搜索。标记所有可达对象为存活。未被标记的对象即为垃圾。GC Roots 是一组 JVM 默认认为“永远存活”的对象引用，即使两个对象互相引用，但如果从 GC Roots 无法到达它们，它们依然会被回收。算法名称关键步骤核心特点。]]></description><category></category></item><item><title><![CDATA[Java-JVM探析]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/150015518</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/150015518</guid><author>WriteBug001</author><pubDate>Thu, 07 Aug 2025 16:04:06 +0800</pubDate><description><![CDATA[JVM 是 Java 虚拟机（Java Virtual Machine）的缩写，它是 Java 程序运行的执行引擎。它屏蔽了底层操作系统的差异，让 Java 字节码可以在不同平台上运行。更重要的是在虚拟机自动内存管理机制的帮助下，不再需要手动释放内存，不容易出现内存泄露和内存溢出问题。Java 编译器（javac）把.java文件编译成.class字节码，而 JVM 负责执行这些字节码。了解虚拟机的运行机制有助于在我们开发中，更容易发现问题，找到内存泄漏原因…JVM 是规范（接口标准）]]></description><category></category></item><item><title><![CDATA[在安卓中使用 FFmpegKit 剪切视频并添加文字水印]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/149911545</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/149911545</guid><author>WriteBug001</author><pubDate>Mon, 04 Aug 2025 17:50:17 +0800</pubDate><description><![CDATA[这个库很强大，支持很多平台，每个平台都有各自的分支代码，用了一段时间，稳定性挺好的，每个平台下，又分为多个库，每个库包含不同的功能，因为功能越丰富，导入到项目中编译的包体积越大，尽量选择适合自己功能的库进行使用。]]></description><category></category></item><item><title><![CDATA[NDK-参数加密和签名校验]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/149911511</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/149911511</guid><author>WriteBug001</author><pubDate>Mon, 04 Aug 2025 17:49:22 +0800</pubDate><description><![CDATA[一种方式做解析，不传明文，只传密文MD5一种方式做解析，即传递明文(参数)，也传递密文(md5)，后台先去校验比对成功返回数据，不成功返回错误RSA（非对称加密）密钥：一对公钥（public key）和私钥（private key）常用于：登录认证、公钥加密敏感信息、服务器通信中传输对称密钥等优点：公私钥分离，安全性高缺点：运算速度慢，适合加密小数据量AES（对称加密-高级加密标准）多用于：对称加密敏感数据，如缓存、Token、本地数据库等优点：加密速度快，安全性强缺点。]]></description><category></category></item><item><title><![CDATA[三步搞定！快速安装使用 Claude Code，让代码开发更高效]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/149222681</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/149222681</guid><author>WriteBug001</author><pubDate>Wed, 09 Jul 2025 14:07:23 +0800</pubDate><description><![CDATA[众所周知编程界AI的扛把子是Claude，但是不对国内开放，让我们使用难度大大增加，而且就算你注册，也要使用全新的国外手机号码，进行验证才行，今天就来教大家如何，让你的开发效率飞起来！]]></description><category></category></item><item><title><![CDATA[音视频学习：使用NDK编译FFmpeg动态库]]></title><link>https://blog.youkuaiyun.com/WriteBug001/article/details/147899366</link><guid>https://blog.youkuaiyun.com/WriteBug001/article/details/147899366</guid><author>WriteBug001</author><pubDate>Mon, 12 May 2025 16:44:11 +0800</pubDate><description><![CDATA[下，就是把上面编译生成的整个 include 文件夹复制进去，不用在意v7a还是v8a，头文件接口都是一样的。可能不包含全部，遇到报错缺少的工具链的，把报错抛给AI，按提示下载即可：）ffmpeg 库的头文件时，要使用。将 FFmpeg 头文件复制到。包起来，不然会报错！在主界面 打印版本号。]]></description><category></category></item></channel></rss>