为了方便调试系统服务,系统提供了shellcommand调试框架,我们使用的am、pm等都有使用这种功能,其他系统服务比如shortcutservice则是使用cmd命令来调试,具体的架构类图和流程如下,整体流程比较简单,所以这里就不具体展开。
Cmd.cpp (frameworks\native\cmds\cmd)
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<String16> 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);
}
}