- 博客(131)
- 资源 (6)
- 收藏
- 关注
原创 Android touchEvent 事件在Window中的流程UML 序列图
一 原文在:http://blog.youkuaiyun.com/a992036795/article/details/516903031. Activity 启动注册事件回调2. 事件回调注册3. 事件分发过程
2017-03-13 18:31:47
841
原创 KMP 的序列化 —— kotlinx-serialization
kotlinx-serialization 是 KMP 中唯一跨平台序列化方案,其核心由编译期插件、core、格式实现(如json)、适配器四部分构成。它将序列化分为“对象→键值”与“键值→字节”两阶段,支持JSON、Protobuf、Bundle、URL等多种格式,同一@Serializable类可复用于网络、存储、导航等场景。因无反射依赖,编译期生成serializer(),运行时通过Encoder/Decoder接口适配不同输出。Gson、Moshi 因依赖反射和平台特定实现,无法在 KMP 中使用。
2026-10-25 22:57:49
197
原创 Compose Navigation 组件拆解:七个部件与一次跳转的全过程
本文拆解 Android navigation-compose 的七大核心部件:NavController、NavGraph、NavDestination、NavBackStackEntry、Navigator、NavHost 与 NavDeepLink,揭示一次 navigate() 调用的完整流程。从路由解析、栈操作到 Navigator 执行,层层递进,阐明导航背后的运行机制,尤其强调 Navigator 对渲染方式的控制作用,以及 popUpTo、launchSingleTop 等行为的实现逻辑。
2026-10-19 18:55:21
130
原创 KMP 中的 ViewModel:生命周期绑定与 StoreOwner
KMP 中的 ViewModel 通过 ViewModelStoreOwner 实现跨平台生命周期绑定。Android 上由 Activity/Fragment 触发 clear(),其余平台(Desktop、iOS、Web)需手动实现对应宿主。本文解析了各平台的 owner 提供机制与清理时机,指出因缺乏统一调度导致资源泄漏或重复创建问题。KMP-ViewModel 库通过适配各端宿主(如 Compose Window、UIViewController)确保 clear() 正确调用,保障协程与资源释放。
2026-10-17 22:59:07
193
原创 Ktor 工程实现原理、代码结构与使用方法
Ktor 是 JetBrains 基于 Kotlin 的异步 Web 框架,强调“少做假设”,通过模块化设计实现服务端与客户端的灵活组合。其核心基于协程、管道机制和插件系统,代码采用 Kotlin Multiplatform 构建,利用 expect/actual 实现跨平台兼容,如 I/O 调度器、字符集、URL 原点与代理配置等均在编译期适配不同平台。整体结构清晰,支持 Netty、CIO、OkHttp 等引擎,具备高可扩展性与复用性。
2026-10-16 00:39:13
200
原创 Kotlin Multiplatform ---- KMP-App-Template-Native
本文以 KMP-App-Template-Native 为例,展示 Kotlin Multiplatform 项目如何组织跨平台应用。项目通过 shared 模块复用数据与业务逻辑,使用 Koin 进行依赖注入,结合 Ktor 与 kotlinx.serialization 实现网络请求与数据解析。各平台分别采用 Compose(Android/Desktop)、SwiftUI(iOS)和 React(Web)构建界面,数据流经 Repository → ViewModel → UI 层逐级传递。项目合理划
2026-10-14 10:48:09
163
原创 PokeClaw Agent :knowledge 长期记忆库
PokeClaw 的长期记忆系统 knowledge 通过 KBManager 管理本地 Markdown 文件(vault),实现跨任务持久化存储。其核心为 1 个单例管理器与 5 个工具(kb_write、kb_read、kb_search、kb_append、kb_add_todo),均由 LLM 主动调用触发,惰性读写,确保数据落盘且安全隔离。系统不自动访问,完全依赖模型决策,形成以“按需驱动”为核心的外部记忆机制。
2026-09-16 13:47:33
171
原创 PokeClaw Agent: 工具、Skill 与 Playbook 设计详解
PokeClaw 通过 Tool、Skill、Playbook 三层架构实现手机操控:Tool 为原子操作,提供统一接口与等待机制;Skill 预设固定流程,零调用执行;Playbook 以 Markdown 形式指导 LLM 按步骤操作。用户指令“search for cat videos on YouTube”经路由命中 searchInApp Skill,自动执行打开搜索、输入关键词等序列,全程无需 LLM 参与,高效准确。
2026-09-13 11:00:52
74
原创 PokeClaw Agent:从 PokeClaw 的技术栈看一条完整的 Agent 链路
协议层怎么抽象(LangChain4j 的消息四件套 + 工具规格,云上通用)执行层怎么分层(无状态云 / 有状态端,桥接层消化语义差异)失控层怎么兜底(预算、卡死、幻觉护栏——Agent 工程真正的心血所在)后续系列将逐层深入:LiteRT-LM 的 KV cache 与采样细节、runAgentLoop 的逐行拆解、护栏的设计模式、以及这个架构缺失的中间层(工作流编排)。
2026-09-11 14:12:18
167
原创 PokeClaw Agent:架构梳理 从 LLM 推理引擎到 Agent 编排
PokeClaw Agent 架构基于“三级路由”实现高效任务处理:Tier 1(正则匹配)、Tier 2(Skill 宏)零调用 LLM,Tier 3(ReAct 循环)按需调用。通过 LangChain4j(云端无状态)与 LiteRT-LM(本地有状态)双引擎并行,结合 LlmClient 抽象层实现跨平台统一接入。核心为单 agent 编排,依赖会话管理器统一客户端路由,辅以护栏机制保障稳定性。设计取舍显著:本地假流式、双数据源隐患、技能无中间态传递,暂不支持多 agent 协同。整体聚焦低成本、高
2026-09-11 13:50:05
272
原创 PokeClaw Agent---Agent 循环决策 runAgentLoop
<think>用户要求根据提供的Markdown文档内容生成一篇≤150字的文章摘要。这是一篇关于DefaultAgentService.runAgentLoop的技术文档,涉及ReAct循环。内容涵盖:核心功能(自主决策循环+安全护栏)、各阶段流程(检查、提示词组装、主循环、工具执行、死循环检测)、设计特点等。需要压缩成≤150字的中文摘要。摘要需要包含文档核心价值和关键特征,不能只是流水账。</think>本文详解 DefaultAgentService.runAgentLoop 核心函数:ReAct
2026-09-08 14:05:54
220
原创 Android Telecom 架构
本文分析了Android Telecom架构中拨号应用的流程实现。通过序列图展示了来电处理流程,从TelecomManager接收来电到最终绑定InCallService的完整调用链。同时介绍了通过Intent拨号的方式,以及Telecomm工程的AndroidManifest配置,重点说明了UserCallActivity作为处理CALL意图的入口组件。最后给出了UserCallActivity到CallsManager的拨号调用栈,呈现了从用户界面到系统服务的完整交互过程。
2026-03-19 12:41:35
475
原创 引用的使用和原理 -- 从汇编的角度看引用的实现
引用作为函数返回值 引用可以作为函数的返回值,但返回的引用必须指向一个在函数外部仍然存在的对象,通常是函数外的静态对象或全局对象,或者是作为参数传递给函数的对象。常引用 常引用(const reference)是引用的一种特殊形式,它不允许通过引用修改数据,但可以引用一个常量。本质上,引用是某个变量的一个别名,对引用的所有操作都是直接作用于它所引用的变量。引用作为函数参数 引用常用于函数参数列表中,使得函数能够修改传入的参数本身,而不仅仅是它们的副本,这样可以提高效率,尤其是在传递大型数据结构时。
2024-09-09 11:30:44
1259
原创 Perfetto 中的 Android VSYNC信号
VSYNC信号用来同步 显示流水线。显示流水线由VSYNC 同步 应用唤醒并开始渲染的时间、SurfaceFlinger唤醒合成图层的时间以及屏幕刷新周期。这种同步可以消除卡顿,并提升UI的流畅性。SurfaceFlinger 可以通过调用来控制 HWC 是否生成 VSYNC 事件。SurfaceFlinger 调用生成 VSYNC 事件,VSYNC 事件与屏幕的刷新周期同步。当 SurfaceFlinger 同步到屏幕刷新周期时,SurfaceFlinger 会停用。
2024-03-11 11:49:22
2927
原创 Compose Shape Slider
composed 可用于实现有状态修饰符,该修饰符为每个被修改的元素具有特定于实例的状态,允许相同的修饰符实例安全地重用于多个元素,同时维护特定于元素的状态。Compose 中默认提供的Slider 是Materail3 风格的,要想实现 Android View中的自定义风格 需要实现自己的Track 和Thumb Compose 函数。drawLine 函数的绘制Line时 支持三种Cap , 因此 Compose 的默认实现是无法通过Shape 自定义实现我们想要的效果。
2023-11-14 17:00:42
1103
原创 ExoPlayer 中的音频时间戳计算
视频播放 音频视频对齐 有三种方式以音频为基准最为常见, ExoPlayer中也是采用以音频为基准的方式。DefaultAudioSink 负责音频数据的渲染,音频数据的时间戳也是在处理的。DefaultAudioSink 时间戳处理涉及这几个 概念。AudioTrackPositionTrackerMediaPositionParametersConfigurationAudioTrackPositionTracker用于 DefaultAudioSink 内部计算时间戳,是真正计算时间戳的类。根据and
2022-06-29 10:17:49
1928
2
原创 ExoPlayer的缓存 四 缓存Cache 的应用
ExoPlayer的缓存-- 四 Cache 的使用同一文件 内容服务器 生成的链接有时效性,如果用URL做缓存ID,会出现同一首无法命中缓存的情况。Exoplayer 的缓存默认使用 URL每首歌曲有一个SongID, 如果使用SongID, 每首歌曲的有伴奏 原唱 视频三种文件,也有冲突的可能。因此使用URL 的path 作为SongID 是比较合适的。Exoplayer 在创建CacheDataSourceFactory 的时候 传入CacheKeyFactory缓存的时候 生成Downloa
2022-06-15 14:17:57
3632
2
原创 ExoPlayer的缓存 三 SimpleCache的使用
ExoPlayer的缓存 – 三 Cache的使用和 exoplayer 的其他 DataSource 一样,CacheDataSource 的生成也是通过 Factory 模式生成,CacheDataSource 构造函数的参数和读写有关的有Cache cache 使用的缓存@Nullable DataSource upstreamDataSource 根据url 生成
2022-06-15 14:16:04
3495
原创 Exoplayer的缓存 二 下载服务DownloadService
Exoplayer的缓存 – 二 下载服务 DownloadServiceDownloadService 是一个android 标准的service, DownloadService 封装了下载的多个指令, 由一系列静态函数组成:DownloadService 在发送这些指令时,先把这些指令参数构建一个Intent, 然后通过startService 的方法发送Intent 到 Service.在Service 的 中 解析Intent, 并从Intent 中获取 下载的参数,传递到 Downl
2022-06-15 14:13:14
1943
翻译 Exoplayer的缓存 一 使用简介
Exoplayer 的 缓存-- 一 使用简介ExoPlayer 提供了媒体离线下载功能。在大多数用例中,即使应用程序在后台,也可以继续下载。应用实现这个工呢,应用程序应该继承子类 并实例化,并向DownloadService发送命令以添加、删除和控制下载。下图显示了涉及的主要类。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ty1byI9l-1655273162553)(https://exoplayer.dev/images/downloading.svg)]**图 1.
2022-06-15 14:10:15
3335
原创 WebView 使用简介
WebView 使用简介一 WebView 相关的类1. WebView用来显示网页,使用必须时刻注意我们需要添加网络权限<uses-permission android:name="android.permission.INTERNET"/>加载网页:webView.loadUrl("http://www.baidu.com/");加载本地网页, 网页放在 ass...
2020-03-26 12:11:13
389
原创 OkHttp Post 限速上传
在局域网中通过OkHttp post 上传一些大文件,测试后发现文件上传经常占满带宽,影响业务交互。在上传时需要限速。限速可以服务端限速,也可以客户端限速。服务端限速只是延迟接受,造成TCP 缓冲区拥堵,带宽的问题并没有真正的解决。客户端限速的思路就是写Socket 限速。搜了一下资料,OkHttp 并没有提供限速的接口。研究了一下OkHttp 的拦截器 Interceptor一 网络访问...
2020-03-26 12:03:07
2062
原创 C++ Rx 和Restfull 的使用
什么是响应式编程?用一个字来概括就是流(Stream)。Stream 就是一个按时间排序的 Events 序列,它可以放射三种不同的 Events:(某种类型的)Value、Error 或者一个” Completed” Signal。通过分别为 Value、Error、”Completed”定义事件处理函数,我们将会异步地捕获这些 Events。基于观察者模式,事件流将从上往下,从订阅源传递到观...
2019-12-20 21:16:50
1982
原创 DSBridge-Android 源码分析
一 Android WebView Js 原生APIAndroid WebView 提供了Js 和 WebView相互调用的接口,js 调用Android 代码通过@JavascriptInterface 注解WebView.addJavascriptInterface(Object object, String name) 方法实现JS 和java 对象的映射。同样 WebVi...
2019-09-29 16:03:15
1776
原创 深入理解AMS --- 二 Activity 的启动
深入理解AMS — 二 Activity 的启动以桌面启动应用为例分析一下启动一个新的应用的Activiy的过程。代码分支:android-9.0.0_r9combo: aosp_x86_64-eng启动Activity1.1 Activity#startActivity在launchu 进程中调用 Activity.startActivity 启动一个新的Activity.最...
2018-11-30 16:36:47
2142
2
原创 深入理解AMS --- 一 AMS 的启动
深入理解AMS --- 一 AMS 的启动深入理解AMS --- 一 AMS 的启动一 Zygote fork1.1 Zygote fork SystemServer 进程1.2 System_service 进程启动,准备加载的ClassLoader1.3 RuntimeInit 初始化,进一步的准备初始化的环境1.4 通过findStaticMain 方法反射调用System_Serve...
2018-11-20 15:33:04
4769
原创 Android 上 Https 双向通信— 深入理解KeyManager 和 TrustManagers
Android 客户端的配置生成SSLContext和Http 客户端关联Android 作为Https 的服务端AndroidService 支持客户端证书请求使用认证链做认证使用hugo 观察SSL handshark 过程服务端发送证书服务端发送 Certificate Request客户端校验客户端发送证书concrypt 库的bugTwo way s...
2018-04-27 18:56:20
14251
1
原创 Android 中签名 加密和HTTPS
RSA 加密算法非对称加密算法1976年,两位美国计算机学家Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不直接传递密钥的情况下,完成解密。这被称为”Diffie-Hellman密钥交换算法”。Diffie-Hellman算法一种秘钥交换算法,它是一种建立秘钥的方法,而不是加密方法,所以秘钥必须和其他一种加密算法结合使用。这种秘钥交换
2018-01-25 20:02:53
2974
原创 Android View — Gradient 渐变
Android View — Gradient 渐变Android 支持三种颜色渐变, LinearGradient(线性渐变) RadialGradient (径向渐变) SweepGradient(扫描渐变)。这三种渐变继承自android.graphics.Shader, Paint 类通过setShader支持渐变。
2017-08-06 23:26:07
1936
原创 Android View — Paint 详解
Android View — Paint 详解在Android View 的概念中,Paint 如名字所代表的含义,是画笔的意思。像我们平时画图一样,Paint就是相当于笔,而Canvas就是纸,这里叫画布。Paint 可以设置的多种属性。PaintCanvasView定义一个最简单的自定义View来展示Paint 的多种属性。重写onDraw 方法,在onDrasw 方法中调用子类的onChil
2017-07-09 18:37:01
806
原创 APP java.lang.UnsatisfiedLinkError so错误
so错误App 中需要引用第三方的SDK,第三方SDK 带so. 编译后在7.0的模拟器上运行产生如下的错误,但是在一个三星的平板上运行正常。05-19 10:30:56.977 25669-25669/com.nextev.carcontrol E/AndroidRuntime: FATAL EXCEPTION: main
2017-06-01 10:05:24
1949
原创 Android 自定义View(二) 下雨效果
一 实现思路,雨点用线段表示,通过控制线段的大小和宽度来表示不同的线段。一个雨点下雨的过程可以表示为一条直线,一次雨点在下雨的过程中坐标表示为 y=kx+b;通过不停的绘制调用onDraw 实现下雨的动画。二 RainView整个RainView 继承自View,然后把下雨的过程抽象为雨点,在RainView 中增加N个雨点,这样把整个下雨过程抽象到了RainDrop中,RainView 负
2017-05-17 22:37:49
1976
原创 Android 自定义View
Android 自定义View一 简单的自定义ViewAndroid View 的绘制流程主要有 onMeasure, onLayout, onDraw. UI 内容的绘制主要在onDraw 中完成。1.1 首先定义View类MyViewMyView 继承View, 实现两个构造方法。MyView(Context context, @Nullable AttributeSet attrs)是在XML
2017-05-17 21:45:49
1183
原创 websocket 和SSL浅析
1 WebSocket 原理1.1 背景WebSocket 是基于Http 协议的改进,Http 为无状态协议,基于短连接,需要频繁的发起请求,第二 Http 只能客户端发起请求,服务端无法主动请求。1.2 相同点都是基于TCP的应用层协议。 都使用Request/Response模型进行连接的建立。 在连接的建立过程中对错误的处理方式相同,在这个阶段WS可能返回和HTTP相同的返回码。 都可
2017-04-27 10:52:57
21246
局域网飞鸽(C 编写兼容linux和windows平台)
2010-05-11
飞鸽传书 ipmsg (linux C)
2010-05-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅