Android命令-lshal
一、lahal --help翻译
/ # lshal --help lshal:列出并调试 HIDL HAL。(对于 AIDL HAL,请参阅“dumpsys”) commands: list 列出 HIDL HAL。 debug 调试指定的 HIDL HAL。 help 打印帮助消息。 wait 如果 HIDL HAL 尚未启动,请等待其启动。 如果未指定命令,则默认为“list”。 list: lshal lshal list 以默认顺序列出所有的 hals (`lshal list -Vliepc`) lshal list [-h|--help] -h, --help: 打印列表的帮助信息 (`lshal help list`) lshal [list] [OPTIONS...] -i, --interface: 只打印实例名称列 -l, --released: 打印“已发布?” 列(Y=已发布,N=未发布,?=未知) -t, --transport: 打印传输模式列 -r, --arch: 打印位数列 //有32和64 -s, --hash: 打印接口的哈希值 -p, --pid: 打印服务器 PID,如果设置了 -m 则打印服务器命令行 //这里还有一个-m选项 -a, --address: 打印服务器对象地址列 -c, --clients: 打印客户端 PID,如果设置了 -m 则打印客户端命令行 -e, --threads: 打印当前使用/可用的线程(注意,可用线程是延迟创建的) -m, --cmdline: 打印 cmdline 而不是 PID -d[=<arg>], --debug[=<arg>]:使用空选项从 IBase::debug 发出调试信息。 不能与 --neat 一起使用。 如果提供了“arg”,则写入指定文件,否则写入标准输出。 -V, --vintf: 打印 VINTF 信息。 此列包含以逗号分隔的列表: - DM:如果 HIDL HAL 位于设备清单中 - DC:如果 HIDL HAL 位于设备兼容性矩阵中 - FM:如果 HIDL HAL 位于框架清单中 - FC:如果 HIDL HAL 位于框架兼容性矩阵中 - X: 如果 HIDL HAL 不在上述列表中 -S, --service-status: 打印服务状态列。 可能的值为: - alive: 活跃并正在运行 hwbinder 服务; - registered;dead: 已注册到 hwservicemanager 但没有响应; - declared: 仅在 VINTF 清单中声明,但未注册到 hwservicemanager; - N/A: 对于直通 HAL 没有信息。 -A, --all: 打印所有列 ######## --init-vintf:形成一个框架 HAL 清单到指定文件,如果没有指定文件,则形成到标准输出。//生成一个manifest文件 --init-vintf-partition=<arg>:指定 --init-vintf 生成的HAL清单的分区。 有效值为“system”、“vendor”和“odm”。 默认为“vendor”。 --sort=<arg>:按列排序。 “arg”可以是 (i|interface) 或 (p|pid)。 --neat:输出是机器可解析的(无解释文本)。 不能与 --debug 一起使用。 --types=<arg>:以逗号分隔的一个或多个部分的列表。 输出仅限于选定的部分。 有效选项有:(b|binderized)、(c|passthrough_clients)、(l|passthrough_libs)、(v|vintf)、(z|lazy) 和 (a|all)。 默认为“b,c,l”。 debug: lshal debug [-E] <interface> [options [options [...]]] 打印指定接口的调试信息。 -E:如果 HIDL HAL 实际上是子类,则排除调试输出。 <interface>:格式为“android.hardware.foo@1.0::IFoo/default”。如果实例名称缺失,则使用“default”。 options:IBase::debug 的空格分隔选项。 help: lshal -h lshal --help lshal help 打印此帮助消息 lshal help list 打印列表的帮助消息 lshal help debug 打印调试帮助信息 lshal help help 打印帮助消息寻求帮助 lshal help wait 打印等待的帮助消息 wait: lshal wait <interface/instance> 对于设备上的 HAL,请等待 HAL 启动。 这不会启动 HAL,除非将其配置为惰性 HAL。 <interface>:格式为“android.hardware.foo@1.0::IFoo/default”。 如果实例名称缺失,则使用“default”。
二、lshal打印内容注释
# lshal -A //kernel-6.1 + A14 | All HIDL binderized services (registered with hwservicemanager) Interface Transport Server PTR Arch Thread Use R Hash VINTF Status Clients android.frameworks.sensorservice@1.0::ISensorManager/default hwbinder 1289 N/A 64 0/5 Y 24bf4ab7c7e0d7eb8dce8eb1ac4ea7bd1cc95c44779fb23e137d3e87a15fac7d FM alive android.hardware.audio.effect@7.0::IEffectsFactory/default hwbinder 754 N/A 64 0/8 Y f2e41467bcf1140a11b219c2e8f77981b955c2941befe66e1cc685b7863ae4c9 DM,FC alive android.hardware.media.c2@1.0::IComponentStore/default hwbinder 768 N/A 64 0/8 Y 43d70bcdc63b3d042bac3c3297f5d941dfabbd08f3ceb96b6016cc14f6e34ba3 DM,FC alive android.hardware.media.c2@1.0::IComponentStore/software hwbinder 1080 N/A 64 0/10 Y 43d70bcdc63b3d042bac3c3297f5d941dfabbd08f3ceb96b6016cc14f6e34ba3 FM alive android.hardware.media.c2@1.1::IComponentStore/default hwbinder 768 N/A 64 0/8 Y a3eddd9bbdc87e8c22764070037dd1154f1cf006e6fba93364c4f85d4c134a19 DM,FC alive android.hardware.media.c2@1.1::IComponentStore/software hwbinder 1080 N/A 64 0/10 Y a3eddd9bbdc87e8c22764070037dd1154f1cf006e6fba93364c4f85d4c134a19 FM alive ... | All HIDL interfaces getService() has ever returned as a passthrough interface; | PIDs / processes shown below might be inaccurate because the process | might have relinquished the interface or might have died. | The Server / Server CMD column can be ignored. | The Clients / Clients CMD column shows all process that have ever dlopen'ed | the library and successfully fetched the passthrough implementation. Interface Transport Server PTR Arch Thread Use R Hash VINTF Status Clients android.hardware.audio.effect@7.0::IEffectsFactory/default passthrough 754 N/A 64 N/A ? FC N/A 754 android.hardware.audio@7.1::IDevicesFactory/default passthrough 754 N/A 64 N/A ? FC N/A 754 android.hardware.bluetooth.audio@2.0::IBluetoothAudioProvidersFactory/default passthrough 754 N/A 64 N/A ? X N/A 754 android.hardware.bluetooth.audio@2.1::IBluetoothAudioProvidersFactory/default passthrough 754 N/A 64 N/A ? X N/A 754 android.hardware.bluetooth@1.1::IBluetoothHci/default passthrough 759 N/A 64 N/A ? FC N/A 759 android.hardware.graphics.mapper@4.0::IMapper/default passthrough N/A N/A 64 N/A ? DM,FC N/A 765 1068 ... | All available HIDL passthrough implementations (all -impl.so files). | These may return subclasses through their respective HIDL_FETCH_I* functions. Interface Transport Server PTR Arch Thread Use R Hash VINTF Status Clients android.hardware.audio.effect@6.0::I*/* (/vendor/lib64/hw/) passthrough N/A N/A 64 N/A ? X N/A android.hardware.audio.effect@7.0::I*/* (/vendor/lib64/hw/) passthrough N/A N/A 64 N/A ? X N/A 754 android.hardware.audio@7.0::I*/* (/vendor/lib64/hw/) (-mediatek) passthrough N/A N/A 64 N/A ? X N/A android.hardware.audio@7.1::I*/* (/vendor/lib64/hw/) (-mediatek) passthrough N/A N/A 64 N/A ? X N/A 754
1. lshal 列出的 3 类接口
(1) 第一类,标题: All HIDL binderized services (registered with hwservicemanager)
这是当前系统里通过 HwBinder 注册过的服务视图,最接近“实时运行态”。
这里列出的都是 HIDL + binderized + 已注册成功的服务,不是 passthrough HAL。
(2) 第二类, 标题: All HIDL interfaces getService() has ever returned as a passthrough interface
这是“历史曾经通过 passthrough 成功取到过接口”的记录,不是严格实时状态。说明系统中既有 binderized 服务,也有进程曾走过 passthrough 获取逻辑(常见于兼容或探测路径)。
(3) 第三类, 标题: All available HIDL passthrough implementations (all -impl.so files)
这是对系统里可用 -impl.so 的静态扫描结果,不代表已被使用。
本质是“文件能力清单”, 看到它只表示库存在,不表示服务已启动或被调用。Clients 非空时才表示至少有进程尝试加载过。显示出的大量 I*/* (/vendor/lib64/hw/) 就是这类,很多项 Clients 为空,表示库存在但当前没被用到。
find / -name "*impl.so" 2>/dev/null 检索到的库有的有对应的,有的没有。没有对应的lsof看也有进程使用。
一句话总结:
第一类看“现在在跑的 Binder HAL”
第二类看“历史上谁走过 passthrough”
第三类看“系统里有哪些 passthrough 实现库可用”
2. VINTF 字段
VINTF(或 Manifest Source),接口来源于哪个清单/矩阵,和基础 lshal 的 VINTF 列含义一样:
DM — Device Manifest(设备厂商)
FM — Framework Manifest(AOSP 框架)
DC — Device Compatibility Matrix
FC — Framework Compatibility Matrix
空 — 运行时存在但没有在任何清单里声明,Treble 下这是异常情况。
3. R
表示是否已注册(Registered)到 hwservicemanager。
Y = 已注册、当前可用
这个 HAL 接口已成功注册到 hwservicemanager,调用 getService() 会获取到有效的 Binder 引用。
N = 无法解析、当前找不到
这个接口在 VINTF manifest 里有声明(所以会列出来),但运行时无法通过 hwservicemanager 解析到。调用 getService() 会返回 nullptr 或抛异常。
造成 N 的常见原因:
(1) 服务未启动: 这个 HAL 服务进程还没拉起(可能延迟启动)。
(2) 服务崩溃: 服务启来过但已死亡,没有重新拉起。
(3) 硬件不支持: 设备上该硬件不存在(比如没有某个特殊模块),所以 HAL 不启动。
(4) manifest 声明冗余: manifest 里声明了这个 HAL,但实际代码里没有实现。
(5) 初始化失败: 服务启动时初始化失败,导致无法注册。
4. Interface
接口全名 + 实例名,格式为:"包名@版本::接口/instance"
例如:android.hardware.audio.effect@6.0::IEffectsFactory/default,instance 还有取"software"、"ashmem".
5. Thread Use
HwBinder 线程池使用情况,格式一般是 "已占用/总线程数"。例如:0/18 表示总共 18 个 binder 线程,目前 0 个在忙。
6. Server
服务端进程 PID(提供该 HAL 的进程)。例如相机几个版本都在 1144,说明同一进程同时注册了多个版本接口。
7. Clients
当前连接该 HAL 的客户端 PID 列表。例如 591 312 表示至少这两个进程在访问 IEffectsFactory。
posted on 2024-02-20 15:02 Hello-World3 阅读(1143) 评论(0) 收藏 举报
浙公网安备 33010602011771号