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)    收藏  举报

导航