- 博客(16)
- 资源 (10)
- 收藏
- 关注
原创 安卓之AIDL的钩子一览、treble合规操作
摘要:谷歌为厂商扩展AIDL接口提供标准方案,要求在保持原生接口不变的前提下,通过附加扩展接口方式实现新功能。关键步骤包括创建独立扩展类、使用AIBinder_setExtension绑定扩展、通过全局注册提供服务,并严格避免修改原生接口。该方法可确保VTS测试合规,同时避免版本升级时的合并冲突。官方提供了NDK/Java/CPP/Rust四种后端的API实现方式,并通过vibrator案例演示了完整流程。特别注意智能指针的正确使用方式,否则会导致扩展功能失效。
2025-11-07 22:00:55
738
原创 安卓selinux的那些秘密
安卓系统在root和调试场景下,selinux策略加载过程存在差异。核心区别在于:正常流程会校验镜像hash,不一致时重新生成sepolicy;而调试场景(如remount或fastbootd刷机)会触发策略重制。root实现的关键在于加载高权限策略文件,谷歌方案是将userdebug策略编译进debug镜像的ramdisk,通过临时文件系统在切根后替换默认策略。值得注意的是,userdebug_plat_sepolicy.cil不包含厂商自定义策略,而完整userdebug版本已内置root权限。
2025-10-22 21:11:38
461
原创 一次解决安卓编译报错的简要记录
最后通过加打印等手段发现ifdef BUINDN_DEBUG_VENDOR_BOOT_IMAGE。就是无论 a1还是a2,fun2的过程都会被执行,Makefile中如下所示。
2025-10-21 22:25:12
234
1
原创 delta_generator差分过程
本文详细解析安卓系统差分升级包的核心技术,重点介绍了基于BSDIFF和BZIP2的差分算法原理。系统支持6类镜像文件的差分处理,通过4K分块映射比对新旧数据块,生成COPY/ZERO操作指令。文章深入剖析了谷歌采用的块匹配算法,包括建立数据hash映射表、文件块位置图处理等关键技术,并对比了不同压缩算法(LZ4、bsdiff、brotli等)在差分优化中的表现。最后指出当前差分技术的主要优化空间在于RAW镜像处理和压缩算法改进。
2025-08-01 22:35:30
386
原创 delta_generator数据处理分析
delta_generator是安卓用于生成升级固件的核心程序,主要分析其制作全量和差分的数据处理流程。为了减少update_engine在端侧数据处理使用的内存,制作固件的时候就要进行相关的配套措施,比如全量制作升级包的时候处理的数据最大块为2MB,安装的时候主要有四种操作:ZERO、REPLACE_XZ、REPLACE_BZ、REPLACE。差分的时候要求各个固件需要4K对齐,所以分区配置的时候也需要进行4K对齐哦,那对于差分的old需要向下预处理截断4K对齐,new固件向上4K补零对齐。
2025-07-28 21:09:33
343
原创 系统更新之安卓update_engine从0到精通
update_engine是谷歌chrome浏览器、chromebook笔记本、安卓升级的核心进程,担负起新系统安装的重要功能,有必要了解其核心原理和架构。待更新,请各位持续关注。三:cow设备的创建。
2025-03-15 22:54:10
431
原创 update_engine之初始化和安装类依赖一览
安卓10以及之前update_engine承载着AB升级的能力,从安卓R之后VAB、vabc等升级技术的演讲以及谷歌的cts测试等的强制要求,国内主流厂商基本都从recovery下的OTA转到update_engine下的VAB升级架构。通过aidl到ue进行安装,安装的相关类之间存在各种相互依赖以及相互之间的繁杂的调用关系,代理模式、适配器等等,对此架构不了解的很容易找不到调用到哪里了,甚至加代码会出现UAF内存异常问题。动态分区的创建和数据的操作等等后续进行扩展。号外:公众号与本昵称一致。
2025-03-15 22:47:58
561
原创 update_engine之掉电断点继续更新机制
安卓14之前是一种取巧的方式,先把某个文件x内容复位,更新其他的,最后再更新x,可以减少中间断电的时候相关状态不是一组的问题,这种情况将从0开始升级。(一开始这个动作没有,导致从这里获取的掉电状态不是完整的一组,虽然也会被判断为resume,但是op相关的数据对不上,无法进行数据安装,报错:[ERROR:delta_performer.cc(943)] we threw away data it seems?如何判断是resume、如何从断点处继续更新?断电的时候,tmp目录的内容正在更新中:不影响,
2025-03-08 23:58:03
631
原创 轻量级设备ota升级之流式解压的方法
聊聊对升级数据的解压过程,全量也能够使用压缩,差分必然使用到压缩,对数据通过整体压缩才是最优解,也有一些是通过分块压缩,会造成升级包相对整体压缩增大一些。大部分IOT设备的ram\rom都很小,其升级时的运行空间是有限的,并且很多设备是通过手机蓝牙和设备连接,手机收到升级包后再通过蓝牙发送给轻量设备。一般是服务器压缩,设备侧解压,主要是关注设备端侧的基本能力,所以选择上述参数获得设备上需要4kb dictsize,state_size 在16kb以内,其他代码段等运行空间都能够满足。
2024-12-29 19:29:32
565
原创 v-ab下机器如何映射加密用户分区的cow设备数据
需要注意的是,不同的文件系统可能有不同的实现和扩展,fs_ioc_fiemap命令的用法和返回值可能会有所不同。进入新系统的时候,安卓有个first init和second init,不具体介绍两个init,firstinit主要负责系统分区(system\vendor等)的挂载,userdata分区的挂载在second init中,因用户分区挂载需要元数据解密(依赖于系统分区里vold进程),此时对于ota后首次启动,问题就来了,在未挂载也没有解密状态下是如何映射找到system-cow文件的。
2024-12-29 17:40:02
714
原创 初次定位UAF(内存释放后再次使用)问题
记第一次定位UAF 某某打开KASAN的版本报过来我们的一个业务出现必现UAF(USE after free)踩内存问题,正常版本没有想过堆栈信息异常,第一次遇到这问题,简单记录下定位过程。 了解KASAN概念下:The Kernel Address Sanitizer (KASAN) — The Linux Kernel documentationKernelAddressSANitizer(KASAN)是一个动态检测内存错误的工具。它为找到use-after-fr...
2021-11-21 17:00:14
1264
1
原创 结构体资源申请与二级指针初始化赋值案例
结构体与二级指针初始化赋值案例记录下今天遇到的二级指针初始化一直失败问题,在二级指针申请和赋值的时候,要注意访问的是哪一个具体的地址,直接访问arr 是二级指针,访问arr[i] 其实也是二级指针(我的理解),访问(*arr)[i] 才是访问的真正的资源。不建议这种初始化方式,编码建议里有一条就是 资源初始化和释放尽量在同一层级。代码如下:typedefstruct{charname[10];uint32_tsize;}Example;int...
2021-06-15 23:05:16
474
1
原创 广度优先搜索,暴力搜索---------单词拆分-----bfs
广度优先搜索,暴力搜索广度优先搜索的时候要清晰的知道我们在遍历什么,加入队列就是我们的遍历的目标,遍历的时候注意什么时候是结束条件,什么条件是将下个遍历的元素加入队列,存在重复遍历的位置的时候,需要一个是否访问过的变量进行记录访问的状态,不然会重复遍历,剪枝能够大大提高时间。模板不难,难的是知道我们在遍历什么,DFS常用于最小路径,把一些遍历的node当作无向图里的节点。139. 单词拆分难度中等415给定一个非空字符串s和一个包含非空单词列表的字典wordDic...
2020-05-08 23:39:29
416
原创 广度优先搜索------二叉树的最小深度
BFS----二叉树搜索最小深度111. 二叉树的最小深度给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例:给定二叉树[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2.Cpp:/***Definitionforabinarytreenode.*...
2020-05-08 23:35:03
373
原创 括号匹配问题-----使用栈进行解题
欢迎大家关注我的个人刷题公众号~~~https://mp.weixin.qq.com/s?__biz=MzIyNTU3OTczMQ==&mid=2247483751&idx=1&sn=0cf586a197c7815d46ccbf515d1c153f&chksm=e87cc6dbdf0b4fcd9b9349a9f79471080f174b9f3eea9a29bd6...
2020-04-25 00:37:58
410
原创 滑动窗口利用单调队列解题
滑动窗口和单调队列的应用做本题的时候一定要自己想一些测试用例,边界条件的,针对队列的相反的,窗口为1,2,k的,本题思路比较清晰,就是维护一个最大size = k的单调递减的双端队列,考虑当入参 == 队列最后一个的时候怎么处理,因为每个元素都要进行进入队列和出队列,所以每次处理之前要先判断是否满足 que.size() <=k;不满足的时候说明左边窗口划过去了,pop出去首位。...
2020-04-24 00:08:52
239
图像处理 核设计
2017-12-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅