ShellCommand执行流程

为了方便调试系统服务,系统提供了shellcommand调试框架,我们使用的am、pm等都有使用这种功能,其他系统服务比如shortcutservice则是使用cmd命令来调试,具体的架构类图和流程如下,整体流程比较简单,所以这里就不具体展开。

Cmd.cpp (frameworks\native\cmds\cmd)

ShellCommand执行流程_第1张图片

ShellCommand执行流程_第2张图片

ShellCommand执行流程_第3张图片

Java层的系统服务只需要实现onShellCommand

用法 pm Install xxx.apk

C++层的系统服务则需要自己处理SHELL_COMMAND_TRANSACTION

用法 cmd shortcut xxx

GpuService.cpp (frameworks\native\services\surfaceflinger)
status_t BnGpuService::onTransact(uint32_t code, const Parcel& data,
        Parcel* reply, uint32_t flags)
{
    switch (code) {
    case SHELL_COMMAND_TRANSACTION: {
        int in = data.readFileDescriptor();
        int out = data.readFileDescriptor();
        int err = data.readFileDescriptor();
        int argc = data.readInt32();
        Vector args;
        for (int i = 0; i < argc && data.dataAvail() > 0; i++) {
           args.add(data.readString16());
        }
        return shellCommand(in, out, err, args);
    }

    default:
        return BBinder::onTransact(code, data, reply, flags);
    }
}

你可能感兴趣的:(Android源码剖析,android)