Android-世界的活点地图-dumpsys(Android-Detail-工具)

因为程序在计算机中运行时,在内存、CPU、I/O等设备上的数据都是动态的(或者说是易失的),也就是说数据使用完或者发生异常就会丢掉。如果我想得到某些时刻的数据(有可能是调试程序 Bug 或者收集某些信息),就要把他转储(dump)为静态(如文件)的形式。否则,这些数据你永远都拿不到。

2、dump 转储的是什么内容(dump 的对象)?

其实上边已经提到了,就是将动态(易失)的数据,保存为静态的数据(持久数据)。像程序这种本来就保存在存储介质(如硬盘)中的数据,也就没有必要dump。

现在,dump作为 名词 也很好理解了,一般就是指 dump(动词) 的结果文件。

以上来自 [知乎 Freeman 的回答](()

dumpsys 常用语法

adb shell dumpsys [-t timeout] [--help | -l | --skip services | service [arguments] | -c | -h]

下表列出了使用 dumpsys 时的可用选项。

选项说明
-t timeout指定超时期限(秒)。如果未指定,默认值为 10 秒。
–help输出 dumpsys 工具的帮助文本。
-l输出可与 dumpsys 配合使用的系统服务的完整列表。
–skip services指定您不希望包含在输出中的服务。
service [arguments]指定您希望输出的服务。某些服务可能允许您传递可选参数。您可以通过将 -h选项与服务名称一起传递来了解这些可选参数,如下所示:adb shell dumpsys procstats -h
-c指定某些服务时,附加此选项能以计算机可读的格式输出数据。
-h对于某些服务,附加此选项可查看该服务的帮助文本和其他选项。

dumpsys 原理

dumpsys 命令源码来自 [frameworks/native/cmds/dumpsys/dumpsys.cpp](()。

sm_

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yn5xwjZZ-1651728536504)(https://upload-images.jianshu.io/upload_images/22796403-d0682706c7 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 f83554.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

dumpsys 主要做了以下几件事:

  • 获取 ServiceManager 对象 sm_
  • 使用 sm_ 的 listService() 获取系统所有向 ServiceManager 注册过的服务
  • 使用 sm_ 的 checkService() 获取指定服务
  • 调用 service 远程服务中的 dump() 方法输出相应的信息

简单来讲,dumpsys 通过用户输入命令中的 service 名称,使用 checkService() 获取指定 service ,并调用其远程服务中的 dump() 方法来输出相应的信息。

👆 划重点

例如 adb shell dumpsys activity activities

👆 service 名称为 activity ,输出 ActivityManagerService 相关的信息,参数 activities 表示显示 activity 状态

dumpsys 的使用技巧

常用的 service

常用的 service 名称有:

dumpsys activity //查询AMS服务相关信息
dumpsys window //查询WMS服务相关信息
dumpsys cpuinfo //查询CPU情况
dumpsys meminfo //查询内存情况

adb shell dumpsys -l 命令能够输出可与 dumpsys 配合使用的系统服务的完整列表。

adb shell dumpsys -l

详情如下:

服务名类名功能
activityActivityManagerServiceAMS相关信息
packagePackageManagerServicePMS相关信息
windowWindowManagerServiceWMS相关信息
inputInputManagerServiceIMS相关信息
powerPowerManagerServicePMS相关信息
batterystatsBatterystatsService电池统计信息
batteryBatteryService电池信息
alarmAlarmManagerService闹钟信息
dropboxDropboxManagerService调试相关
procstatsProcessStatsService进程统计
cpuinfoCpuBinderCPU
meminfoMemBinder内存
gfxinfoGraphicsBinder图像
dbinfoDbBinder数据库
服务名功能
SurfaceFlinger图像相关
appopsapp使用情况
permission权限
processinfo进程服务
batteryproperties电池相关
audio查看声音信息
permission权限
processinfo进程服务
batteryproperties电池相关
audio查看声音信息
<think>好的,用户之前询问了关于MIP组件的隐藏显示问题,现在他们想查找mip-toggle的使用方法并解决隐藏显示未生效的问题。首先,我需要回顾之前的对话,确保这次回答保持一致。 用户提供的引用内容似乎涉及Android渲染问题,但当前问题集中在MIP组件的使用上,所以这部分引用可能不相关。需要专注于用户的实际需求,即mip-toggle的示例和故障排除。 首先,我应该给出一个正确的示例,确保所有必要的脚本和结构都正确。在之前的回答中,我提到了需要引入mip-toggle的脚本,使用正确的选择器,并检查CSS类是否冲突。现在需要将这些要整合到示例中,确保用户能直接复制并运行。 接下来是隐藏显示未生效的解决方案。需要分列出常见原因,比如组件未加载、选择器错误、类名冲突、动态内容问题等。每个都要具体说明如何检查和处理,比如检查控制台是否有脚本加载错误,确认选择器是否正确使用ID,CSS类是否有冲突等。 另外,用户可能遇到动态加载内容的情况,这时候mip-toggle可能无法正确绑定元素,需要建议使用mip-bind作为替代方案。同时,如果存在嵌套组件或事件传播问题,需要提醒用户检查DOM结构,并确保触发元素正确。 还要注意用户是否在代码中遗漏了必要的属性,比如target和selector是否同时存在,是否使用了正确的选择器格式(#id)。可能还需要强调CSS类.hidden的定义,确保display属性正确设置,如果有自定义类名,需要添加!important来覆盖。 最后,总结常见问题,帮助用户快速排查。可能还需要提醒用户关于MIP规范的限制,比如禁止某些DOM操作,避免使用内联事件等,这些可能导致组件失效。 整个过程需要保持回答结构清晰,步骤明确,方便用户一步步排查问题。同时,语言要简洁,避免技术术语过多,确保用户容易理解。如果有相关的问题,可以推荐用户参考之前提到的替代方案,如mip-bind或mip-script,以满足不同场景的需求。</think>根据MIP组件开发规范及实践经验,以下是mip-toggle组件的标准用法及显示/隐藏失效的解决方案: ### 一、标准使用示例 ```html <!-- 必须引入组件脚本 --> <script src="https://c.mipcdn.com/static/v2/mip-toggle/mip-toggle.js"></script> <mip-toggle target="targetElement" selector="#toggleBox"> <button class="btn">切换显示</button> </mip-toggle> <div id="toggleBox" class="hidden"> 需要控制显示隐藏的内容 </div> <style> /* 必须定义.hidden类 */ .hidden { display: none !important; /* 推荐添加!important */ } </style> ``` ### 二、功能失效的6大常见原因及解决方案 1. **组件未加载** - ✅ 检查控制台是否报错`Unregistered component: mip-toggle` - ✅ 确认已添加正确的脚本引用: ```html <script src="https://c.mipcdn.com/static/v2/mip-toggle/mip-toggle.js"></script> ``` 2. **选择器配置错误** - ✅ 必须同时指定`target`和`selector`属性: ```html <!-- 正确写法 --> <mip-toggle target="targetElement" selector="#myBox"> ``` - ❌ 避免使用类选择器: ```html <!-- 错误示例 --> <mip-toggle selector=".box-class"> ``` 3. **CSS类冲突** - ✅ 目标元素必须包含`.hidden`类 - ✅ 检查其他CSS是否覆盖样式: ```css /* 错误示例:其他样式覆盖隐藏效果 */ #toggleBox { display: block; } /* 正确写法 */ .hidden { display: none !important; } ``` 4. **动态内容加载问题** - ✅ 异步加载的内容需要重新初始化组件: ```javascript // 在动态插入元素后执行 MIP.watch('mip-toggle', function(e) { new MIP.MipToggle(e.element) }) ``` - ✅ 推荐改用数据绑定方案: ```html <mip-data> <script type="application/json"> { "show": false } </script> </mip-data> <div [class]="show ? '' : 'hidden'">内容</div> ``` 5. **DOM结构嵌套异常** - ✅ 确保触发元素和目标元素的层级关系: ```html <!-- 错误示例:嵌套在禁用击的容器内 --> <div onclick="return false;"> <mip-toggle>...</mip-toggle> </div> ``` - ✅ 推荐结构: ```html <mip-toggle> <!-- 直接暴露可击元素 --> <button>切换</button> </mip-toggle> ``` 6. **浏览器缓存干扰** - ✅ 强制刷新缓存:`Ctrl + Shift + R` (Windows) / `Cmd + Shift + R` (Mac) - ✅ 检查MIP缓存版本: ```javascript // 控制台输入查看版本 console.log(MIP.version) ``` ### 三、高级调试方法 1. **组件状态追踪**: ```javascript // 在控制台查看目标元素类变化 document.querySelector('#toggleBox').classList ``` 2. **事件监听调试**: ```javascript document.addEventListener('DOMContentLoaded', () => { const toggle = document.querySelector('mip-toggle'); toggle.addEventAction('toggle', e => { console.log('当前状态:', e.originalEvent.detail); }); }); ``` 3. **HWC层验证**(适用于混合渲染场景): ```shell adb shell dumpsys SurfaceFlinger | grep "FB TARGET" ``` 应输出类似:`HWC |  FB TARGET` 表示硬件加速正常[^1] ### 四、替代方案对比 | 方案 | 适用场景 | 兼容性 | 性能 | |------|----------|--------|------| | mip-toggle | 简单显隐切换 | MIP 2.0+ | 优 | | mip-bind | 数据驱动场景 | MIP 2.5+ | 良 | | mip-script | 复杂交互逻辑 | 需审核 | 中 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值