pm-graph使用记录

本文介绍了如何使用pm-graph工具在内核中抓取休眠唤醒时的函数调用过程,包括安装步骤、内核配置需求以及压力测试的应用。通过示例展示了如何分析和理解设备在不同阶段的电源管理行为。

工具在内核源代码的tools/power/pm-graph目录下,在github上有pm-graph 的项目。

 

目录

1.安装

2. 应用

抓取休眠唤醒时的函数调用过程

压力测试


 


1.安装

其实不用安装也可以直接用

$> git clone http://github.com/intel/pm-graph.git
    $> cd pm-graph
    $> sudo make install
    

2. 应用

自带了config配置文件,设定各种参数。此处不采用配置文件,直接用参数。

需要内核配置项目

 CONFIG_DEVMEM=y
        CONFIG_PM_DEBUG=y
        CONFIG_PM_SLEEP_DEBUG=y
        CONFIG_FTRACE=y
        CONFIG_FUNCTION_TRACER=y
        CONFIG_FUNCTION_GRAPH_TRACER=y
        CONFIG_KPROBES=y
        CONFIG_KPROBES_ON_FTRACE=y

抓取休眠唤醒时的函数调用过程

 

运行 sleepgraph -m mem(或者disk ,mem表示测试suspend to mem过程;disk表示suspend to disk 过程)  -f (表示抓取函数调用过程)

抓取的效果为:

可以很清楚的看出休眠唤醒的几个阶段,对于sleep to disk阶段,由于在suspend前,进程已经被freeze,因而实际不能抓取thaw阶段的内容。如果真的在suspend前被freeze,那么这个软件抓取的事件的进程是如何保证运行的呢

提出上面这个问题本身,说明你对内核的ftrace不清楚,在配置了trace后,内核会将需要trace的信息写入到某个buf中,不是说启用哪个用户进程、线程进行处理。

以intel i915为例子,在各个阶段的功能

pre阶段更多是驱动软件层面清理。官方文档描述如下:

The ``prepare`` phase is meant to prevent races by preventing new
    devices from being registered; the PM core would never know that all the
    children of a device had been suspended if new children could be
    registered at will.  [By contrast, from the PM core's perspective,
    devices may be unregistered at any time.]  Unlike the other
    suspend-related phases, during the ``prepare`` phase the device
    hierarchy is traversed top-down. 主要阻止新的设备被添加到系统中,以免后续suspend开始时,还有设备添加,导致新添加的设备不能被处理。

在suspend阶段,可以看到保存设备的pci的状态及设备本身的状态,display的关闭等。

The ``->suspend`` methods should quiesce the device to stop it from
    performing I/O.  They also may save the device registers and put it into
    the appropriate low-power state
,
depending on the bus type the device is
    on, and they may enable wakeup events. 在此处i915阶段仅仅是保持了寄存器的信息,并没有操作设备电源状态。

在suspend late阶段 就将设备电源状态设置为低功耗,不能直接关闭设备吧

 

 3.    For a number of devices it is convenient to split suspend into the
    "quiesce device" and "save device state" phases, in which cases
    ``suspend_late`` is meant to do the latter.  It is always executed after
    runtime power management has been disabled for the device in question.

    4.    The ``suspend_noirq`` phase occurs after IRQ handlers have been disabled,
    which means that the driver's interrupt handler will not be called while
    the callback method is running.  The ``->suspend_noirq`` methods should
    save the values of the device's registers that weren't saved previously
    and finally put the device into the appropriate low-power state.

从描述和实际trace看,各个驱动 在实现上存在差异。

压力测试

https://01.org/pm-graph/endurance-testing

multi参数 50次,每次间隔多少秒

 sudo ./sleepgraph.py -m mem -rtcwake 10 -dev -gzip -multi 50 0 -skiphtml

suspend-210620-111433-x10$ ../sleepgraph.py -summary . -genhtml -dev
进入生成的目录suspend-210620-111433-x10,运行命令,生成summary报告

pm-graph这个项目的主要意义在于,启发了针对内核某个特定模块进行全过程跟踪的应用程序开发

 

<think> 我们被要求回答关于`adb shell pm reset-permissions`命令的详解,包括作用和使用方法。同时,需要参考站内引用内容,并在回答末尾生成相关问题。 根据引用内容,我们知道: 引用[1]中提到了`adb shell pm reset-permissions`这个命令。 引用[3]是关于`adb shell pm`命令的解释,其中提到`pm list permissions`等,但没有直接解释`reset-permissions`。 引用[4]提到`am/pm`命令,但也没有详细解释`reset-permissions`。 因此,我们需要结合已知信息并补充相关知识来回答。 命令作用: 根据Android官方文档,`pm reset-permissions`命令用于将运行时权限重置为默认状态。这通常意味着撤销所有用户授予的权限,并将权限恢复到应用初始安装时的状态(即只保留安装时自动授予的权限,通常是普通权限,而危险权限将被撤销)[^1]。 使用场景: 1. 当应用出现权限相关问题时,可以尝试使用此命令重置权限。 2. 测试应用在默认权限状态下的行为。 使用方法: 在命令行中执行: ```bash adb shell pm reset-permissions ``` 或者,如果指定用户(在Android 5.0及以上支持多用户),可以使用: ```bash adb shell pm reset-permissions --user <user_id> ``` 注意: 1. 该命令需要设备具有root权限(在非root设备上可能无法执行)。 2. 执行后,所有应用的运行时权限(特别是危险权限)将被重置,用户需要重新授权。 补充说明: 在Android 6.0(API级别23)及更高版本中,权限分为普通权限和危险权限。普通权限在安装时自动授予,危险权限需要在运行时请求。`reset-permissions`命令主要影响危险权限。 根据引用[1]中列出的命令格式,我们看到`reset-permissions`命令没有额外的参数(除了可选用户ID)。 因此,我们可以这样组织答案: ### `adb shell pm reset-permissions` 命令详解 #### 一、作用 重置所有应用的运行时权限至默认状态[^1]: 1. 撤销所有用户手动授予的危险权限(Dangerous Permissions) 2. 恢复应用安装时自动获得的普通权限(Normal Permissions) 3. 重置权限标志(包括用户选择的"不再询问"状态) #### 二、使用场景 - 调试应用权限逻辑 - 修复因权限异常导致的应用崩溃 - 清除测试设备的权限配置 #### 三、命令格式 ```bash adb shell pm reset-permissions [--user <USER_ID>] ``` 参数说明: - `--user <USER_ID>`:可选参数,指定用户ID(多用户设备),默认操作当前活跃用户 #### 四、执行要求 1. **ADB连接**:设备需通过USB/Wifi开启ADB调试 2. **系统权限**:通常需要root权限(非root设备可能返回`SecurityException`) #### 五、效果验证 重置后可通过以下命令检查权限状态: ```bash adb shell pm list permissions -g # 按组查看权限分配情况[^3] adb shell dumpsys package <PACKAGE> # 查看指定包权限详情 ``` #### 六、注意事项 - 该操作不可逆,重置后所有危险权限需要用户重新授权 - 系统应用权限可能不受影响(取决于设备厂商实现) - Android 6.0+ 设备生效 ### 执行示例 ```bash # 重置当前用户权限 adb shell pm reset-permissions # 重置用户10的权限 adb shell pm reset-permissions --user 10 ``` ### 权限重置流程图 ```mermaid graph TB A[执行reset-permissions] --> B{是否root设备?} B -->|是| C[撤销所有危险权限] B -->|否| D[操作失败 SecurityException] C --> E[恢复普通权限默认状态] E --> F[清除用户选择记录] F --> G[广播权限变更] ``` §§相关问题§§ 1. 如何查看Android设备的当前用户ID? 2. 重置权限后应用会立即崩溃吗? 3. 有没有不重置全部应用权限的方法? </think> ### `adb shell pm reset-permissions` 命令详解 #### 一、命令作用 1. **重置运行时权限** - 将设备所有应用的[运行时权限](https://developer.android.com/guide/topics/permissions/overview#runtime)(API 23+)恢复为初始默认状态[^1][^4]; - 撤销所有危险权限(如位置访问、相机权限等)的用户授权; - 清除用户选择"拒绝且不再询问"的标志位; - 不影响安装时自动授予的普通权限(如网络访问)。 2. **重置权限策略** - 恢复系统默认权限策略(适用于特殊设备配置); - 清除通过`pm set-permission-flags`设置的权限标志[^1]。 #### 二、使用场景 1. **权限调试**:解决因权限混乱导致的应用异常; 2. **测试重置**:验证应用在初始权限状态下的行为; 3. **系统恢复**:修复因权限配置错误导致的系统故障; 4. **安全审计**:清除测试设备的自定义权限设置。 #### 三、命令格式 ```bash adb shell pm reset-permissions [--user USER_ID] ``` 参数说明: - `--user USER_ID`:指定目标用户(多用户设备),默认为主用户(ID=0)。 #### 四、执行要求 1. **ADB连接**:设备需开启USB调试模式; 2. **系统权限**: - Android 6.0+(涉及运行时权限); - 需**root权限**(普通设备返回`SecurityException`); - 系统签名应用可免root执行。 #### 五、执行流程 1. **连接设备**: ```bash adb devices # 确认设备连接 adb shell su -c 'pm reset-permissions' # root设备执行 ``` 2. **验证结果**: ```bash adb shell pm list permissions -d # 检查危险权限状态[^3] adb shell dumpsys package | grep -A 10 "Permission" # 查看权限详情 ``` #### 六、效果示例 重置前应用权限: ```text com.example.app: android.permission.CAMERA: granted=true, flags=USER_SET|USER_FIXED ``` 重置后: ```text com.example.app: android.permission.CAMERA: granted=false, flags=0 # 恢复默认拒绝状态 ``` #### 七、注意事项 1. **数据影响**: - 需要用户重新授权所有危险权限; - 重置后首次启动应用可能触发权限请求弹窗; 2. **系统限制**: - 无法重置系统核心权限(如`android.permission.INTERNET`); - 签名权限(`protectionLevel="signature"`)不受影响[^1]; 3. **替代方案**: ```bash adb shell pm clear PACKAGE_NAME # 仅清除单个应用数据 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

proware

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值