安卓binder驱动内核日志调试打印开放及原理(第一节)

Android应用启动性能优化:Binder通信机制源码深度解析 进程间通信(IPC)是操作系统实现多进程协作的核心机制,它允许不同进程安全高效地交换数据和指令。在Android系统中,Binder作为其特有的IPC机制,通过一次拷贝、内存映射等设计,在性能与安全性之间取得了平衡,成为系统服务与应用进程间通信的基石。从技术价值看,Binder不仅保障了系统架构的清晰分层与安全隔离,更是应用启动流畅性、系统响应速度的关键支撑。在应用启动这一典型场景中,从Launcher点击图标到Activity界面显示,AMS、Zygote、应用进程三者间数十次的Binder调用构成了启动 阅读详情
AI摘要

在系统开发中,binder通讯内核日志正常不打印,开放会影响系统性能。本文介绍开放binder调试日志的方法,通过控制debug_mask值来实现,还说明了debug_mask的位置及写入值的计算方式,如多个枚举值做或运算,此外还提及binder_alloc相关日志写入方式。

背景:

经常有学员朋友在做系统开发时候,有时候遇到binder相关的一些问题,这个时候可能就需要比较多的binder相关日志,但是正常情况下这些binder通讯的的内核日志都是没有的打印的,因为经常binder通讯太过于频繁,如果正常版本都开放出来这些binder调试日志,那样会让系统卡顿,影响性能。
但是在分析binder驱动源码时候又可以看到类似如下日志:
在这里插入图片描述那么到底该怎么让这些日志可以打印出来呢?下面给大家介绍一下相关的打开日志的命令。
这里binder内核日志相关准备分为两节给大家分享:
第一节:主要介绍相关实战命令的使用让大家学会用命令去开放日志
第二节:主要介绍binder调试日志相关的源码分析和控制原理

实战调试命令:

通过控制debug_mask值来控制相关的binder调试日志的打开,那么debug_mask值的依据是什么呢?那就是来源下面这个枚举:
kernel-aosp14/common/drivers/android/binder.c

enum {
	BINDER_DEBUG_USER_ERROR             = 1U << 0, // 1
	BINDER_DEBUG_FAILED_TRANSACTION     = 1U << 1, // 2
	BINDER_DEBUG_DEAD_TRANSACTION       = 1U << 2, // 4
	BINDER_DEBUG_OPEN_CLOSE             = 1U << 3, // 8
	BINDER_DEBUG_DEAD_BINDER            = 1U << 4, // 16
	BINDER_DEBUG_DEATH_NOTIFICATION     = 1U << 5, // 32
	BINDER_DEBUG_READ_WRITE             = 1U << 6, // 64
	BINDER_DEBUG_USER_REFS              = 1U << 7, // 128
	BINDER_DEBUG_THREADS                = 1U << 8, // 216
	BINDER_DEBUG_TRANSACTION            = 1U << 9, // 512
	BINDER_DEBUG_TRANSACTION_COMPLETE   = 1U << 10,// 1024
	BINDER_DEBUG_FREE_BUFFER            = 1U << 11,// 2048
	BINDER_DEBUG_INTERNAL_REFS          = 1U << 12,// 4096
	BINDER_DEBUG_PRIORITY_CAP           = 1U << 13,// 8192
	BINDER_DEBUG_SPINLOCKS              = 1U << 14,// 16384
};

比如上面背景中我们看到有binder_debug打印,它带的参数是BINDER_DEBUG_OPEN_CLOSE
在这里插入图片描述
那么从枚举得出BINDER_DEBUG_OPEN_CLOSE = 1U << 3, // 8
所以只需要对debug_mask写入 8既可以实现让binder的中所有BINDER_DEBUG_OPEN_CLOSE相关binder_debug打印出来。

那么这个debug_mask在哪里呢?这里先直接告诉大家,是在如下目录:

NX563J:/sys/module/binder/parameters # ls
debug_mask  devices  stop_on_user_error

简单说就是在/sys/module/binder/parameters/debug_mask,这里的debug_mask文件就是要写入的文件
比如写入上面的值BINDER_DEBUG_OPEN_CLOSE为8 (注意一般需要debug机器)

NX563J:/ # echo 8 >  /sys/module/binder/parameters/debug_mask                                                                                                                                                  

然后这个时候抓取日志看看是否有显示binder的open相关日志:

130|NX563J:/ # logcat -b all -c;logcat -b kernel | grep binder                                                                                                                                                    




03-04 00:33:46.170     0     0 I binder  : 30418 close vm area da398000-da496000 (1016 K) vma 10220051 pagep 60000000000f53
03-04 00:33:46.172     0     0 I binder  : binder_flush: 30418 woke 0 threads
03-04 00:33:46.172     0     0 I binder  : binder_deferred_release: 30418 threads 5, nodes 2 (ref 3), refs 8, active transactions 0
03-04 00:33:46.187     0     0 I binder  : 30385 close vm area 75d915f000-75d925d000 (1016 K) vma 10220051 pagep 60000000000f53
03-04 00:33:46.187     0     0 I binder  : 30385 close vm area 765da4f000-765db4d000 (1016 K) vma 10220051 pagep 60000000000f53
03-04 00:33:46.187     0     0 I binder  : binder_flush: 30385 woke 0 threads
03-04 00:33:46.187     0     0 I binder  : binder_flush: 30385 woke 0 threads
03-04 00:33:46.188     0     0 I binder  : binder_deferred_release: 30385 threads 1, nodes 0 (ref 0), refs 3, active transactions 0
03-04 00:33:46.195     0     0 I binder  : binder_deferred_release: 30385 threads 11, nodes 50 (ref 51), refs 53, active transactions 0
03-04 00:33:47.224     0     0 I binder  : binder_open: 30512:30512
03-04 00:33:47.224     0     0 I binder  : 30512:30512 ioctl 40046210 7fd05b5cc0 returned -22
03-04 00:33:47.224     0     0 I binder  : binder_mmap: 30512 765db5c000-765dc5a000 (1016 K) vma 200071 pagep 60000000000f53
03-04 00:33:47.499     0     0 I binder  : binder_open: 30512:30536
03-04 00:33:47.499     0     0 I binder  : 30512:30536 ioctl 40046210 765d23af04 returned -22
03-04 00:33:47.499     0     0 I binder  : binder_mmap: 30512 75f1646000-75f1744000 (1016 K) vma 200071 pagep 60000000000f53
03-04 00:33:53.466     0     0 I binder  : binder_open: 30556:30556
03-04 00:33:53.466     0     0 I binder  : 30556:30556 ioctl 40046210 7fd05b5cc0 returned -22
03-04 00:33:53.466     0     0 I binder  : binder_mmap: 30556 765db56000-765dc54000 (1016 K) vma 200071 pagep 60000000000f53
03-04 00:33:53.619     0     0 I binder  : binder_open: 30556:30579
03-04 00:33:53.619     0     0 I binder  : 30556:30579 ioctl 40046210 765d23af04 returned -22
03-04 00:33:53.619     0     0 I binder  : binder_mmap: 30556 765cfa9000-765d0a7000 (1016 K) vma 200071 pagep 60000000000f53

明显可以看到open,closer日志

如果想要多个开放多个枚举,那么只需要做或运算,然后最后结果写入 debug_mask既可以
比如开放如下几个枚举:

BINDER_DEBUG_USER_ERROR             = 1U << 0, // 1
BINDER_DEBUG_FAILED_TRANSACTION     = 1U << 1, // 2
BINDER_DEBUG_DEAD_TRANSACTION       = 1U << 2, // 4
BINDER_DEBUG_OPEN_CLOSE             = 1U << 3, // 8

那么最后写入的值就是8 + 4+ 2+ 1 = 15

NX563J:/ # echo 15 >  /sys/module/binder/parameters/debug_mask                                                                                                                                                  

和binder相关的/sys/module/还有一个binder_alloc,它主要是binder 申请相关的日志,这里枚举有差异

kernel-aosp14/common/drivers/android/binder_alloc.c

enum {
	BINDER_DEBUG_USER_ERROR             = 1U << 0, // 1
	BINDER_DEBUG_OPEN_CLOSE             = 1U << 1, // 2
	BINDER_DEBUG_BUFFER_ALLOC           = 1U << 2, // 4
	BINDER_DEBUG_BUFFER_ALLOC_ASYNC     = 1U << 3, // 8
};

这里写入值方式和binder下面节点一样

NX563J:/ # echo 7 >  /sys/module/binder_alloc/parameters/debug_mask                                                                                                                                                  

写完后可以看到日志有大量的alloc相关打印:

03-04 00:42:12.716     0     0 I binder_alloc: 15501: binder_alloc_buf size 128 got buffer 0000000000000000 size 1040384
03-04 00:42:12.716     0     0 I binder_alloc: 15501: allocate pages 0000000000000000-0000000000000000
03-04 00:42:12.716     0     0 I binder_alloc: 15501: add free buffer, size 1040256, at 0000000000000000
03-04 00:42:12.716     0     0 I binder_alloc: 15501: binder_alloc_buf size 128 got 0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15501: binder_free_buf 0000000000000000 size 128 buffer_size 128
03-04 00:42:12.717     0     0 I binder_alloc: 15501: free pages 0000000000000000-0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15501: merge free, buffer 0000000000000000 do not share page with 0000000000000000 or 0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15501: free pages 0000000000000000-0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15501: add free buffer, size 1040384, at 0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: binder_alloc_buf size 9648 got buffer 0000000000000000 size 1040384
03-04 00:42:12.717     0     0 I binder_alloc: 15733: allocate pages 0000000000000000-0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: add free buffer, size 1030736, at 0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: binder_alloc_buf size 9648 got 0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: binder_free_buf 0000000000000000 size 9648 buffer_size 9648
03-04 00:42:12.717     0     0 I binder_alloc: 15733: free pages 0000000000000000-0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: merge free, buffer 0000000000000000 do not share page with 0000000000000000 or 0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: free pages 0000000000000000-0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: add free buffer, size 1040384, at 0000000000000000
03-04 00:42:12.963     0     0 I binder_alloc: 15501: binder_alloc_buf size 304 got buffer 0000000000000000 size 304
03-04 00:42:12.963     0     0 I binder_alloc: 15501: allocate pages 0000000000000000-0000000000000000
03-04 00:42:12.963     0     0 I binder_alloc: 15501: binder_alloc_buf size 304 got 0000000000000000
03-04 00:42:12.963     0     0 I binder_alloc: 1114: binder_free_buf 0000000000000000 size 48 buffer_size 48
03-04 00:42:12.963     0     0 I binder_alloc: 1114: free pages 0000000000000000-0000000000000000
03-04 00:42:12.963     0     0 I binder_alloc: 1114: merge free, buffer 0000000000000000 do not share page with 0000000000000000 or 0000000000000000
03-04 00:42:12.963     0     0 I binder_alloc: 1114: free pages 0000000000000000-0000000000000000
03-04 00:42:12.963     0     0 I binder_alloc: 1114: add free buffer, size 1040384, at 0000000000000000
03-04 00:42:12.964     0     0 I binder_alloc: 15501: binder_free_buf 0000000000000000 size 304 buffer_size 304
03-04 00:42:12.964     0     0 I binder_alloc: 15501: free pages 0000000000000000-0000000000000000
03-04 00:42:12.964     0     0 I binder_alloc: 15501: add free buffer, size 304, at 0000000000000000
03-04 00:42:12.964     0     0 I binder_alloc: 1114: binder_alloc_buf size 48 got buffer 0000000000000000 size 1040384
03-04 00:42:12.964     0     0 I binder_alloc: 1114: allocate pages 0000000000000000-0000000000000000
03-04 00:42:12.964     0     0 I binder_alloc: 1114: add free buffer, size 1040336, at 0000000000000000
03-04 00:42:12.964     0     0 I binder_alloc: 1114: binder_alloc_buf size 48 got 0000000000000000

更多framework实战开发,请关注下面“千里马学框架”

Android多进程通信(IPC)原理、Binder机制与实战避坑指南 进程间通信(IPC)是操作系统中的基础概念,它允许运行在不同内存空间的进程交换数据与指令,是实现模块化、稳定性和性能扩展的核心技术。其原理通常基于内核提供的共享内存、消息队列或远程过程调用等机制,在内存隔离的进程间建立可控的数据通道。在Android生态中,IPC的技术价值尤为突出,它支撑着应用稳定性(进程隔离防崩溃)、性能优化(突破单进程内存限制)与安全性(系统服务隔离)三大核心诉求。典型的应用场景包括多进程应用架构设计、系统服务调用以及跨应用数据共享。本文聚焦Android平台,深入剖析其IPC基石Bi 阅读详情

相关推荐

Binder问题分析方法

上层分析1. watchdog堆栈导出/data/system/dropbox 目录,可以导出watchdog Log2. watchdog堆栈分析详情:Watch dog堆栈分析3. 尽情期待内核分析1. 开启binder log有2种方法:1、修改系统配置 2、修改binder.c源码详情:开启binder log2. 导出内核dump信息详情:内核dump分析3. 分析dump信息4.5. 尽情期待尽情期待。

xuanfengwuxiang的博客 561

开启binder驱动 log

分析binder问题,需要开启log。由于内核是底层,log不能随便加随便开。不然性能撑不住。

xuanfengwuxiang的博客 608

Android自动化测试实战:从环境搭建到Binder机制深度解析

移动应用自动化测试是保障软件质量的关键环节,其核心在于模拟用户操作并验证应用行为。在Android生态中,这一过程依赖于稳定的测试环境、高效的元素定位框架以及对系统底层通信机制的理解。其中,Binder作为Android跨进程通信(IPC)的基石,实现了应用与系统服务间的高效数据交换,而AIDL(Android接口定义语言)则在此基础上提供了简洁的接口抽象,使得远程调用如同本地操作。理解Binder机制与AIDL,不仅能帮助测试工程师诊断涉及系统交互(如通知、传感器)或多进程架构应用的复杂问题,还能为Moc

weixin_33834075的博客 394

Binder子系统之调试分析(一)

一. 概述 在博客以前有写过关于binder系列,大概写了10篇关于binder的文章,从binder驱动,到native层,再到framework,一路写到app层的使用。有兴趣的可以看看 Binder系列—开篇。 二.Binder驱动调试 看过Binder系列文章的同学,会发现Binder IPC过程最终都交给Binder Driver来完成,这是真正干跨进程通信活的地方,

omnispace的博客 3871

【系统稳定性 - 调优】3.4 常见Binder相关异常调优总结

binder通信是Android特有的一种通信机制,常见binder相关的异常包括卡binder对端处理超时,binder本端处理超时(导致主线程block)以及binder耗尽三类问题。无论是应用,Framework,Hal中间件,还是BSP驱动,熟悉这三类binder相关case的调试和分析,能够帮助我们快速地找到和解决问题。

从0到1,突破自己 6826

Halcon与C#联合编程(一):使用S7协议实现机器视觉上位机与西门子PLC联动

本项目技术栈:C#基础,多线程,Halcon DirectShow,Halcon形状检测,Halcon QR码识别,西门子S7通讯协议,西门子PLC为核心的下位机及执行元件

虎鲸不是鱼 1万+

android 系统核心机制binder(14)binder调试总结

该系列文章总纲链接:专题分纲目录 android 系统核心机制 binder 1binder调试基础解读 1.1binder的设备节点简单解读 binder调试相关的设备节点再目录/sys/kernel/debug/binder目录下,节点内容如下所示: 这里可以看到binder下所有通信进程信息,打开后cat 其中一个,内容如下所示: 这里包含了该进程中binder相关内容,比如:Binder线程池(thread)、实体对象(binder_node)、引用对象(binder_ref)..

wangdsh的博客 6581

别再只用线性回归了!用sklearn的核岭回归搞定非线性数据(附RBF核调参实战)

本文详细介绍了如何使用sklearn的核岭回归处理非线性数据,特别是RBF核的应用与调参实战。通过网格搜索找到最佳参数组合,核岭回归能有效捕捉数据中的复杂波动,显著提升模型性能。适合需要解决非线性问题的数据科学家和机器学习工程师。

weixin_34246529的博客 338

Binder调试命令

lrwxrwxrwx root root 1970-01-01 08:00 d -&amp;gt; /sys/kernel/debug 具体的进入目录/sys/kernel/debug 实际操作

dk_work的博客 2338

算法策略 | MACD跨周期短线交易策略开发(股指+商品双版)

量化策略开发,高质量社群,交易思路分享等相关内容

松鼠宽客的博客 2539

1.4 《SST通用技术规范》整体框架与核心条款解读

本小节以**GB/T《电力电子变压器通用技术要求》**(固态变压器SST核心通用规范)为核心依据,结合电力电子变压器技术特性与工程应用边界,系统解析规范的整体章节框架、层级逻辑与强制性/推荐性核心条款,明确规范与传统工频变压器标准的差异,为SST拓扑设计、性能验证、出厂检验与工程落地提供标准化依据。全文以标准原文、期刊文献数据与试验规范为支撑,无主观推演与感性表述。

技术工作者 1695

安卓binder驱动内核日志调试打印开放及原理(第二节)

这里看到binder_debug_mask赋值一共两个地方,有一个初始值,有一个传递到module_param_named方法中的,其实binder_debug_mask的改变就是靠这个module_param_named方法,下面我们来重点讨论一下module_param_named方法。当通过echo xxx > debug_mask命令,会触发动态修改module_param_named的第二个参数binder_debug_mask值进行改变,一旦binder_debug_mask改变就会。

learnframework的博客 963

C语言实现定时任务

例:设置定时任务,每周周X的X时X分自动重启系统 思路:将设置好的重启时间保存到本地配置文件中,设置定时器定时一分钟,每一分钟信号触发一次事件,事件函数中获取配置文件信息与当前系统时间信息,将两个时间进行时间差计算,符合条件的自动重启系统. //创建定时器函数(通过信号触发事件timer_task函数启动) int create_timer() { struct sigevent evp; int ret = 0; memset(&evp, 0, sizeof(stru

佳佳鸽的博客 5037

Android Binder图文详解和驱动源码分析

图文解释,配合Binder驱动带注释源码。理解Binder驱动实现。

心中要有一片海的专栏 1961

【华为OD机试真题 2025C卷】238、贪吃蛇 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025C卷】238、贪吃蛇 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为od,

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 197

yolov26改进 | Neck/颈部创新篇 | 独创HFPN利用分层特征融合块HFFB模块融合多层次特征改进yolov26(全网独家创新)

本文提出了一种创新的分层特征融合模块HFFB(Hierarchical Feature Fusion Block)来改进YOLOv26的neck部分,构建了名为HFPN的新型特征金字塔网络。该模块通过三分支结构融合局部特征(CNN提取)、全局特征(Swin Transformer提取)和中间特征,并包含空间注意力(SA)、通道注意力(CA)和残差反向MLP(IRMLP)等组件来优化特征融合效果。实验表明,该方法能针对不同尺度目标(大/中/小)进行自适应检测,可根据具体数据集需求选择不同配置。文章详细提供了核

Snu77的博客 485

Android Binder服务端深度解析:从架构原理到性能优化实战

在Android系统架构中,进程间通信(IPC)是支撑应用与系统交互的基础机制。Binder作为Android独有的IPC方案,其核心在于高效、安全的跨进程数据传输。理解Binder服务端的工作原理,对于优化应用性能、解决卡顿与ANR问题具有重要价值。服务端通过AIDL接口定义契约,依托Binder线程池处理并发请求,并借助内核驱动实现高效调度。在实际开发中,服务端设计需重点关注线程安全、异步化处理以及内存管理,以避免性能瓶颈。本文聚焦Binder服务端的核心实现,结合线程池管理与ANR分析等热词,深入探讨

weixin_33908217的博客 401

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

从C语言到Binder:系统编程核心原理与Android进程通信实战

在系统编程领域,进程间通信是构建复杂分布式系统的关键技术基础。其核心原理涉及操作系统层面的内存管理、进程隔离与数据交换机制,通过内核提供的通信原语实现不同进程间的安全高效交互。这一技术在现代操作系统架构中具有重要价值,尤其在微服务架构、系统组件解耦和资源安全共享等场景下不可或缺。以Android系统为例,其采用的Binder机制便是进程间通信的典型实现,它通过一次拷贝的内存映射优化和基于C++面向对象的设计模式,为应用框架提供了高性能的跨进程调用能力。理解Binder不仅需要掌握其驱动层的内存映射和线程池管

weixin_30781433的博客 324

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android HAL模块开发实战:从HIDL接口到内核通信完整实现

硬件抽象层(HAL)是Android系统架构中的核心组件,它定义了硬件设备与上层框架之间的标准化接口。其核心原理是通过接口定义语言(如HIDL)实现进程间通信(IPC),将硬件具体实现细节封装在底层,为上层提供统一的访问方式。这一设计的技术价值在于实现了硬件驱动的跨平台兼容性和可维护性,使得Android能够适配多样化的硬件设备。在工程实践中,HAL模块通常需要与Linux内核驱动通过sysfs文件系统或ioctl系统调用进行数据交互,完成传感器数据采集、设备控制等关键功能。本文以构建一个虚拟传感器HAL模

cuanji3287的博客 435

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android 稳定性【篇一:日志调试技能汇总】

Android开发过程中调试和日志分析是必不可少的,当前汇总分析android系统不同类型的日志抓取的原理

qq_27672101的博客 1886

Android ServiceManager启动源码解析:Binder通信总机与系统服务注册机制

在Android系统架构中,进程间通信(IPC)是支撑系统服务与应用交互的核心机制。Binder作为Android特有的IPC框架,通过驱动层的内核模块实现高效的数据传输与进程隔离。其核心原理在于利用内存映射与引用计数机制,在保证安全性的同时实现跨进程方法调用。这一技术价值在于构建了Android系统服务的松耦合架构,使得ActivityManager、WindowManager等核心服务能够独立运行并协同工作。在应用场景中,任何系统服务的注册与发现都依赖于一个中央协调组件。ServiceManager正是

weixin_30411819的博客 456

Android-kernel】Android 内核改动

<br />Google在内核里做了什么改动呢?<br /> <br />    有家公司专门比较了标准内核和android内核,发现google修改了75个文件,增加了88个文件。该公司还对这些被修改的和新增的文件做了注解。<br /> <br />Goldfish -- 44 Files <br />kernel/arch/arm/mach-goldfish<br /> <br />kernel/include/asm-arm/arch-goldfish<br /> <br />Android模拟器运行

wike的专栏 3319

一些Android WiFi调试命令保存

Android 源码: http://xrefandroid.com/列出所有 binder 进程状态 cat /sys/kernel/debug/binder/state查看统计信息 cat /sys/kernel/debug/binder/stats查看当前事务 cat /sys/kernel/debug/binder/transactions。

qq_38728754的博客 668
上一篇: 桌面最近任务展示Task缩略图源码剖析
下一篇: 用IdleHandler来性能优化及原理源码分析
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值