dumpsys相关解析

2023-12-01 04:12
文章标签 解析 相关 dumpsys

本文主要是介绍dumpsys相关解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(1)命令使用

dumpsys命令功能很强大,能dump系统服务的各种状态,这里以AMS为例子,它在ServiceManager中的名字为activity,所以使用dumpsys activity便可,同理,其他service的dump方法也是一样的。

常用的一些命令如下:

//dumpsys activity:查询AMS服务相关信息,相当于 ActivityManagerService.dump()
dumpsys activity intents:查询系统所有待处理intent信息;
dumpsys activity broadcasts:可查询所有注册广播接收者、前台广播、后台广播信息;
dumpsys activity providers:查询系统组件provider相关信息;
dumpsys activity activitys:查询系统组件activity相关信息;
dumpsys activity services:查询系统组件service相关信息;
dumpsys activity top | grep ACTIVITY:查询当前界面显示的top Activity//dumpsys window:查询WMS服务相关信息
dumpsys window:可获取当前界面所在的应用,可看到获取焦点的window和应用;//dumpsys cpuinfo:查询CPU情况
dumpsys cpuinfo:获取当前cpu使用情况,也可已使用top命令;//dumpsys meminfo:查询内存情况
dumpsys meminfo + 包名:查看应用内存占用信息;
dumpsys meminfo --oom:查看应用内存层级;//dumpsys package:查询PMS相关信息
dumpsys package + 包名:查看应用相关信息;
dumpsys package + 包名 |grep version:查看应用的版本信息;
dumpsys package + 包名 |grep apk:查看应用安装路径信息;//dumpsys gfxinfo:查询图像相关信息
dumpsys gfxinfo+ 包名:查看应用的丢帧情况;
activity				ActivityManagerService			AMS相关信息
package			PackageManagerService			PMS相关信息
window			WindowManagerService			WMS相关信息
input					InputManagerService				IMS相关信息
power				PowerManagerService				PMS相关信息
batterystats	BatterystatsService					电池统计信息
battery				BatteryService								电池信息
alarm				AlarmManagerService				闹钟信息
dropbox			DropboxManagerService			调试相关
procstats			ProcessStatsService					进程统计
cpuinfo			CpuBinder										CPU
meminfo			MemBinder									内存
gfxinfo				GraphicsBinder							图像
dbinfo				DbBinder										数据库

可查询的服务有很多,可通过下面命令查看当前系统所支持的dump服务:

adb shell dumpsys -l
adb shell service list

(2)代码逻辑

如下目录是framework处理dumpsys命令的入口:

//frameworks/native/cmds/dumpsys/main.cppint main(int argc, char* const argv[]) {signal(SIGPIPE, SIG_IGN);sp<IServiceManager> sm = defaultServiceManager();fflush(stdout);if (sm == nullptr) {ALOGE("Unable to get default service manager!");std::cerr << "dumpsys: Unable to get default service manager!" << std::endl;return 20;}Dumpsys dumpsys(sm.get());return dumpsys.main(argc, argv);
}

如果ServiceManager还没起来,无法处理命令,所以需要判空,SM进程起来的时候是在开机流程中,init进程里面实例化。命令主要在如下逻辑中处理:

//frameworks/native/cmds/dumpsys/dumpsys.cppint Dumpsys::main(int argc, char* const argv[]) {//...static struct option longOptions[] = {{"help", no_argument, 0, 0},           {"clients", no_argument, 0, 0},{"dump", no_argument, 0, 0},           {"pid", no_argument, 0, 0},{"priority", required_argument, 0, 0}, {"proto", no_argument, 0, 0},{"skip", no_argument, 0, 0},           {"stability", no_argument, 0, 0},{"thread", no_argument, 0, 0},         {0, 0, 0, 0}};//...switch (c) {case 0:if (!strcmp(longOptions[optionIndex].name, "skip")) {skipServices = true;} else if (!strcmp(longOptions[optionIndex].name, "proto")) {asProto = true;} else if (!strcmp(longOptions[optionIndex].name, "help")) {usage();return 0;} else if (!strcmp(longOptions[optionIndex].name, "priority")) {priorityType = String16(String8(optarg));if (!ConvertPriorityTypeToBitmask(priorityType, priorityFlags)) {fprintf(stderr, "\n");usage();return -1;}} else if (!strcmp(longOptions[optionIndex].name, "dump")) {dumpTypeFlags |= TYPE_DUMP;} else if (!strcmp(longOptions[optionIndex].name, "pid")) {dumpTypeFlags |= TYPE_PID;} else if (!strcmp(longOptions[optionIndex].name, "stability")) {dumpTypeFlags |= TYPE_STABILITY;} else if (!strcmp(longOptions[optionIndex].name, "thread")) {dumpTypeFlags |= TYPE_THREAD;} else if (!strcmp(longOptions[optionIndex].name, "clients")) {dumpTypeFlags |= TYPE_CLIENTS;}break;//...}}//...for (size_t i = 0; i < N; i++) {const String16& serviceName = services[i];if (IsSkipped(skippedServices, serviceName)) continue;//这里通过startDumpThread来启动dump threadif (startDumpThread(dumpTypeFlags, serviceName, args) == OK) {bool addSeparator = (N > 1);if (addSeparator) {writeDumpHeader(STDOUT_FILENO, serviceName, priorityFlags);}std::chrono::duration<double> elapsedDuration;size_t bytesWritten = 0;status_t status =writeDump(STDOUT_FILENO, serviceName, std::chrono::milliseconds(timeoutArgMs),asProto, elapsedDuration, bytesWritten);if (status == TIMED_OUT) {std::cout << std::endl<< "*** SERVICE '" << serviceName << "' DUMP TIMEOUT (" << timeoutArgMs<< "ms) EXPIRED ***" << std::endl<< std::endl;}if (addSeparator) {writeDumpFooter(STDOUT_FILENO, serviceName, elapsedDuration);}bool dumpComplete = (status == OK);stopDumpThread(dumpComplete);}}return 0;
}

通过startDumpThread来调用dump函数进行处理。

status_t Dumpsys::startDumpThread(int dumpTypeFlags, const String16& serviceName,const Vector<String16>& args) {//通过serviceName来获取service对象sp<IBinder> service = sm_->checkService(serviceName);if (service == nullptr) {std::cerr << "Can't find service: " << serviceName << std::endl;return NAME_NOT_FOUND;}int sfd[2];if (pipe(sfd) != 0) {std::cerr << "Failed to create pipe to dump service info for " << serviceName << ": "<< strerror(errno) << std::endl;return -errno;}redirectFd_ = unique_fd(sfd[0]);unique_fd remote_end(sfd[1]);sfd[0] = sfd[1] = -1;// dump blocks until completion, so spawn a thread..activeThread_ = std::thread([=, remote_end{std::move(remote_end)}]() mutable {if (dumpTypeFlags & TYPE_PID) {status_t err = dumpPidToFd(service, remote_end, dumpTypeFlags == TYPE_PID);reportDumpError(serviceName, err, "dumping PID");}if (dumpTypeFlags & TYPE_STABILITY) {status_t err = dumpStabilityToFd(service, remote_end);reportDumpError(serviceName, err, "dumping stability");}if (dumpTypeFlags & TYPE_THREAD) {status_t err = dumpThreadsToFd(service, remote_end);reportDumpError(serviceName, err, "dumping thread info");}if (dumpTypeFlags & TYPE_CLIENTS) {status_t err = dumpClientsToFd(service, remote_end);reportDumpError(serviceName, err, "dumping clients info");}// other types always act as a header, this is usually longerif (dumpTypeFlags & TYPE_DUMP) {//调用相应service的dump函数status_t err = service->dump(remote_end.get(), args);reportDumpError(serviceName, err, "dumping");}});return OK;
}

在新起的线程中,执行某个service的dump函数,如此我们就只要看某个service的dump函数实现就好了,注意我们这些处理逻辑目前都是在native层,但是我们知道安卓是建立在Binder通信的CS架构,该dump()函数的声明是在Binder类中的,也就是我们需要找到服务端的dump()函数的真正实现哪里,如果是dumpsys activity a,那么真正实现是在java层的ActivityManagerService中,其他服务同理。

(3)部分示例

(A)PowerManagerService.java

//frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javaprivate void dumpInternal(PrintWriter pw) {pw.println("POWER MANAGER (dumpsys power)\n");final WirelessChargerDetector wcd;final LowPowerStandbyController lowPowerStandbyController;synchronized (mLock) {pw.println("Power Manager State:");mConstants.dump(pw);pw.println("  mDirty=0x" + Integer.toHexString(mDirty));pw.println("  mWakefulness="+ PowerManagerInternal.wakefulnessToString(getGlobalWakefulnessLocked()));pw.println("  mWakefulnessChanging=" + mWakefulnessChanging);pw.println("  mIsPowered=" + mIsPowered);pw.println("  mPlugType=" + mPlugType);pw.println("  mBatteryLevel=" + mBatteryLevel);pw.println("  mBatteryLevelWhenDreamStarted=" + mBatteryLevelWhenDreamStarted);pw.println("  mDockState=" + mDockState);pw.println("  mStayOn=" + mStayOn);pw.println("  mProximityPositive=" + mProximityPositive);pw.println("  mBootCompleted=" + mBootCompleted);pw.println("  mSystemReady=" + mSystemReady);synchronized (mEnhancedDischargeTimeLock) {pw.println("  mEnhancedDischargeTimeElapsed=" + mEnhancedDischargeTimeElapsed);pw.println("  mLastEnhancedDischargeTimeUpdatedElapsed="+ mLastEnhancedDischargeTimeUpdatedElapsed);pw.println("  mEnhancedDischargePredictionIsPersonalized="+ mEnhancedDischargePredictionIsPersonalized);}pw.println("  mHalAutoSuspendModeEnabled=" + mHalAutoSuspendModeEnabled);pw.println("  mHalInteractiveModeEnabled=" + mHalInteractiveModeEnabled);pw.println("  mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary));pw.print("  mNotifyLongScheduled=");if (mNotifyLongScheduled == 0) {pw.print("(none)");} else {TimeUtils.formatDuration(mNotifyLongScheduled, mClock.uptimeMillis(), pw);}pw.println();pw.print("  mNotifyLongDispatched=");if (mNotifyLongDispatched == 0) {pw.print("(none)");} else {TimeUtils.formatDuration(mNotifyLongDispatched, mClock.uptimeMillis(), pw);}pw.println();pw.print("  mNotifyLongNextCheck=");if (mNotifyLongNextCheck == 0) {pw.print("(none)");} else {TimeUtils.formatDuration(mNotifyLongNextCheck, mClock.uptimeMillis(), pw);}pw.println();pw.println("  mRequestWaitForNegativeProximity=" + mRequestWaitForNegativeProximity);pw.println("  mInterceptedPowerKeyForProximity="+ mInterceptedPowerKeyForProximity);pw.println("  mSandmanScheduled=" + mSandmanScheduled);pw.println("  mBatteryLevelLow=" + mBatteryLevelLow);pw.println("  mLightDeviceIdleMode=" + mLightDeviceIdleMode);pw.println("  mDeviceIdleMode=" + mDeviceIdleMode);pw.println("  mDeviceIdleWhitelist=" + Arrays.toString(mDeviceIdleWhitelist));pw.println("  mDeviceIdleTempWhitelist=" + Arrays.toString(mDeviceIdleTempWhitelist));pw.println("  mLowPowerStandbyActive=" + mLowPowerStandbyActive);pw.println("  mLastWakeTime=" + TimeUtils.formatUptime(mLastGlobalWakeTime));pw.println("  mLastSleepTime=" + TimeUtils.formatUptime(mLastGlobalSleepTime));pw.println("  mLastSleepReason=" + PowerManager.sleepReasonToString(mLastGlobalSleepReason));pw.println("  mLastInteractivePowerHintTime="+ TimeUtils.formatUptime(mLastInteractivePowerHintTime));pw.println("  mLastScreenBrightnessBoostTime="+ TimeUtils.formatUptime(mLastScreenBrightnessBoostTime));pw.println("  mScreenBrightnessBoostInProgress="+ mScreenBrightnessBoostInProgress);pw.println("  mHoldingWakeLockSuspendBlocker=" + mHoldingWakeLockSuspendBlocker);pw.println("  mHoldingDisplaySuspendBlocker=" + mHoldingDisplaySuspendBlocker);pw.println("  mLastFlipTime=" + mLastFlipTime);pw.println("  mIsFaceDown=" + mIsFaceDown);pw.println();pw.println("Settings and Configuration:");pw.println("  mDecoupleHalAutoSuspendModeFromDisplayConfig="+ mDecoupleHalAutoSuspendModeFromDisplayConfig);pw.println("  mDecoupleHalInteractiveModeFromDisplayConfig="+ mDecoupleHalInteractiveModeFromDisplayConfig);pw.println("  mWakeUpWhenPluggedOrUnpluggedConfig="+ mWakeUpWhenPluggedOrUnpluggedConfig);pw.println("  mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig="+ mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig);pw.println("  mTheaterModeEnabled="+ mTheaterModeEnabled);pw.println("  mSuspendWhenScreenOffDueToProximityConfig="+ mSuspendWhenScreenOffDueToProximityConfig);pw.println("  mDreamsSupportedConfig=" + mDreamsSupportedConfig);pw.println("  mDreamsEnabledByDefaultConfig=" + mDreamsEnabledByDefaultConfig);pw.println("  mDreamsActivatedOnSleepByDefaultConfig="+ mDreamsActivatedOnSleepByDefaultConfig);pw.println("  mDreamsActivatedOnDockByDefaultConfig="+ mDreamsActivatedOnDockByDefaultConfig);pw.println("  mDreamsEnabledOnBatteryConfig="+ mDreamsEnabledOnBatteryConfig);pw.println("  mDreamsBatteryLevelMinimumWhenPoweredConfig="+ mDreamsBatteryLevelMinimumWhenPoweredConfig);pw.println("  mDreamsBatteryLevelMinimumWhenNotPoweredConfig="+ mDreamsBatteryLevelMinimumWhenNotPoweredConfig);pw.println("  mDreamsBatteryLevelDrainCutoffConfig="+ mDreamsBatteryLevelDrainCutoffConfig);pw.println("  mDreamsEnabledSetting=" + mDreamsEnabledSetting);pw.println("  mDreamsActivateOnSleepSetting=" + mDreamsActivateOnSleepSetting);pw.println("  mDreamsActivateOnDockSetting=" + mDreamsActivateOnDockSetting);pw.println("  mDozeAfterScreenOff=" + mDozeAfterScreenOff);pw.println("  mMinimumScreenOffTimeoutConfig=" + mMinimumScreenOffTimeoutConfig);pw.println("  mMaximumScreenDimDurationConfig=" + mMaximumScreenDimDurationConfig);pw.println("  mMaximumScreenDimRatioConfig=" + mMaximumScreenDimRatioConfig);pw.println("  mAttentiveTimeoutConfig=" + mAttentiveTimeoutConfig);pw.println("  mAttentiveTimeoutSetting=" + mAttentiveTimeoutSetting);pw.println("  mAttentiveWarningDurationConfig=" + mAttentiveWarningDurationConfig);pw.println("  mScreenOffTimeoutSetting=" + mScreenOffTimeoutSetting);pw.println("  mSleepTimeoutSetting=" + mSleepTimeoutSetting);pw.println("  mMaximumScreenOffTimeoutFromDeviceAdmin="+ mMaximumScreenOffTimeoutFromDeviceAdmin + " (enforced="+ isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() + ")");pw.println("  mStayOnWhilePluggedInSetting=" + mStayOnWhilePluggedInSetting);pw.println("  mScreenBrightnessModeSetting=" + mScreenBrightnessModeSetting);pw.println("  mScreenBrightnessOverrideFromWindowManager="+ mScreenBrightnessOverrideFromWindowManager);pw.println("  mUserActivityTimeoutOverrideFromWindowManager="+ mUserActivityTimeoutOverrideFromWindowManager);pw.println("  mUserInactiveOverrideFromWindowManager="+ mUserInactiveOverrideFromWindowManager);pw.println("  mDozeScreenStateOverrideFromDreamManager="+ mDozeScreenStateOverrideFromDreamManager);pw.println("  mDrawWakeLockOverrideFromSidekick=" + mDrawWakeLockOverrideFromSidekick);pw.println("  mDozeScreenBrightnessOverrideFromDreamManager="+ mDozeScreenBrightnessOverrideFromDreamManager);pw.println("  mScreenBrightnessMinimum=" + mScreenBrightnessMinimum);pw.println("  mScreenBrightnessMaximum=" + mScreenBrightnessMaximum);pw.println("  mScreenBrightnessDefault=" + mScreenBrightnessDefault);pw.println("  mDoubleTapWakeEnabled=" + mDoubleTapWakeEnabled);pw.println("  mIsVrModeEnabled=" + mIsVrModeEnabled);pw.println("  mForegroundProfile=" + mForegroundProfile);pw.println("  mUserId=" + mUserId);final long attentiveTimeout = getAttentiveTimeoutLocked();final long sleepTimeout = getSleepTimeoutLocked(attentiveTimeout);final long screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout, attentiveTimeout);final long screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);pw.println();pw.println("Attentive timeout: " + attentiveTimeout + " ms");pw.println("Sleep timeout: " + sleepTimeout + " ms");pw.println("Screen off timeout: " + screenOffTimeout + " ms");pw.println("Screen dim duration: " + screenDimDuration + " ms");pw.println();pw.print("UID states (changing=");pw.print(mUidsChanging);pw.print(" changed=");pw.print(mUidsChanged);pw.println("):");for (int i=0; i<mUidState.size(); i++) {final UidState state = mUidState.valueAt(i);pw.print("  UID "); UserHandle.formatUid(pw, mUidState.keyAt(i));pw.print(": ");if (state.mActive) pw.print("  ACTIVE ");else pw.print("INACTIVE ");pw.print(" count=");pw.print(state.mNumWakeLocks);pw.print(" state=");pw.println(state.mProcState);}pw.println();pw.println("Looper state:");mHandler.getLooper().dump(new PrintWriterPrinter(pw), "  ");pw.println();pw.println("Wake Locks: size=" + mWakeLocks.size());for (WakeLock wl : mWakeLocks) {pw.println("  " + wl);}pw.println();pw.println("Suspend Blockers: size=" + mSuspendBlockers.size());for (SuspendBlocker sb : mSuspendBlockers) {pw.println("  " + sb);}pw.println();pw.println("Display Power: " + mDisplayPowerCallbacks);mBatterySaverPolicy.dump(pw);mBatterySaverStateMachine.dump(pw);mAttentionDetector.dump(pw);pw.println();final int numProfiles = mProfilePowerState.size();pw.println("Profile power states: size=" + numProfiles);for (int i = 0; i < numProfiles; i++) {final ProfilePowerState profile = mProfilePowerState.valueAt(i);pw.print("  mUserId=");pw.print(profile.mUserId);pw.print(" mScreenOffTimeout=");pw.print(profile.mScreenOffTimeout);pw.print(" mWakeLockSummary=");pw.print(profile.mWakeLockSummary);pw.print(" mLastUserActivityTime=");pw.print(profile.mLastUserActivityTime);pw.print(" mLockingNotified=");pw.println(profile.mLockingNotified);}pw.println("Display Group User Activity:");for (int idx = 0; idx < mPowerGroups.size(); idx++) {final PowerGroup powerGroup = mPowerGroups.valueAt(idx);pw.println("  displayGroupId=" + powerGroup.getGroupId());pw.println("  userActivitySummary=0x" + Integer.toHexString(powerGroup.getUserActivitySummaryLocked()));pw.println("  lastUserActivityTime=" + TimeUtils.formatUptime(powerGroup.getLastUserActivityTimeLocked()));pw.println("  lastUserActivityTimeNoChangeLights=" + TimeUtils.formatUptime(powerGroup.getLastUserActivityTimeNoChangeLightsLocked()));pw.println("  mWakeLockSummary=0x" + Integer.toHexString(powerGroup.getWakeLockSummaryLocked()));}wcd = mWirelessChargerDetector;}if (wcd != null) {wcd.dump(pw);}if (mNotifier != null) {mNotifier.dump(pw);}mFaceDownDetector.dump(pw);mAmbientDisplaySuppressionController.dump(pw);mLowPowerStandbyController.dump(pw);}

(B)PackageManagerService.java

//frameworks/base/services/core/java/com/android/server/pm/DumpHelper.javapublic void doDump(Computer snapshot, FileDescriptor fd, PrintWriter pw, String[] args) {DumpState dumpState = new DumpState();ArraySet<String> permissionNames = null;int opti = 0;while (opti < args.length) {String opt = args[opti];if (opt == null || opt.length() <= 0 || opt.charAt(0) != '-') {break;}opti++;if ("-a".equals(opt)) {// Right now we only know how to print all.} else if ("-h".equals(opt)) {printHelp(pw);return;} else if ("--checkin".equals(opt)) {dumpState.setCheckIn(true);} else if ("--all-components".equals(opt)) {dumpState.setOptionEnabled(DumpState.OPTION_DUMP_ALL_COMPONENTS);} else if ("-f".equals(opt)) {dumpState.setOptionEnabled(DumpState.OPTION_SHOW_FILTERS);} else if ("--proto".equals(opt)) {dumpProto(snapshot, fd);return;} else {pw.println("Unknown argument: " + opt + "; use -h for help");}}// Is the caller requesting to dump a particular piece of data?if (opti < args.length) {String cmd = args[opti];opti++;// Is this a package name?if ("android".equals(cmd) || cmd.contains(".")) {dumpState.setTargetPackageName(cmd);// When dumping a single package, we always dump all of its// filter information since the amount of data will be reasonable.dumpState.setOptionEnabled(DumpState.OPTION_SHOW_FILTERS);} else if ("check-permission".equals(cmd)) {if (opti >= args.length) {pw.println("Error: check-permission missing permission argument");return;}String perm = args[opti];opti++;if (opti >= args.length) {pw.println("Error: check-permission missing package argument");return;}String pkg = args[opti];opti++;int user = UserHandle.getUserId(Binder.getCallingUid());if (opti < args.length) {try {user = Integer.parseInt(args[opti]);} catch (NumberFormatException e) {pw.println("Error: check-permission user argument is not a number: "+ args[opti]);return;}}// Normalize package name to handle renamed packages and static libspkg = snapshot.resolveInternalPackageName(pkg,PackageManager.VERSION_CODE_HIGHEST);pw.println(mPermissionManager.checkPermission(perm, pkg, user));return;} else if ("l".equals(cmd) || "libraries".equals(cmd)) {dumpState.setDump(DumpState.DUMP_LIBS);} else if ("f".equals(cmd) || "features".equals(cmd)) {dumpState.setDump(DumpState.DUMP_FEATURES);} else if ("r".equals(cmd) || "resolvers".equals(cmd)) {if (opti >= args.length) {dumpState.setDump(DumpState.DUMP_ACTIVITY_RESOLVERS| DumpState.DUMP_SERVICE_RESOLVERS| DumpState.DUMP_RECEIVER_RESOLVERS| DumpState.DUMP_CONTENT_RESOLVERS);} else {while (opti < args.length) {String name = args[opti];if ("a".equals(name) || "activity".equals(name)) {dumpState.setDump(DumpState.DUMP_ACTIVITY_RESOLVERS);} else if ("s".equals(name) || "service".equals(name)) {dumpState.setDump(DumpState.DUMP_SERVICE_RESOLVERS);} else if ("r".equals(name) || "receiver".equals(name)) {dumpState.setDump(DumpState.DUMP_RECEIVER_RESOLVERS);} else if ("c".equals(name) || "content".equals(name)) {dumpState.setDump(DumpState.DUMP_CONTENT_RESOLVERS);} else {pw.println("Error: unknown resolver table type: " + name);return;}opti++;}}} else if ("perm".equals(cmd) || "permissions".equals(cmd)) {dumpState.setDump(DumpState.DUMP_PERMISSIONS);} else if ("permission".equals(cmd)) {if (opti >= args.length) {pw.println("Error: permission requires permission name");return;}permissionNames = new ArraySet<>();while (opti < args.length) {permissionNames.add(args[opti]);opti++;}dumpState.setDump(DumpState.DUMP_PERMISSIONS| DumpState.DUMP_PACKAGES | DumpState.DUMP_SHARED_USERS);} else if ("pref".equals(cmd) || "preferred".equals(cmd)) {dumpState.setDump(DumpState.DUMP_PREFERRED);} else if ("preferred-xml".equals(cmd)) {dumpState.setDump(DumpState.DUMP_PREFERRED_XML);if (opti < args.length && "--full".equals(args[opti])) {dumpState.setFullPreferred(true);opti++;}} else if ("d".equals(cmd) || "domain-preferred-apps".equals(cmd)) {dumpState.setDump(DumpState.DUMP_DOMAIN_PREFERRED);} else if ("p".equals(cmd) || "packages".equals(cmd)) {dumpState.setDump(DumpState.DUMP_PACKAGES);} else if ("q".equals(cmd) || "queries".equals(cmd)) {dumpState.setDump(DumpState.DUMP_QUERIES);} else if ("s".equals(cmd) || "shared-users".equals(cmd)) {dumpState.setDump(DumpState.DUMP_SHARED_USERS);if (opti < args.length && "noperm".equals(args[opti])) {dumpState.setOptionEnabled(DumpState.OPTION_SKIP_PERMISSIONS);}} else if ("prov".equals(cmd) || "providers".equals(cmd)) {dumpState.setDump(DumpState.DUMP_PROVIDERS);} else if ("m".equals(cmd) || "messages".equals(cmd)) {dumpState.setDump(DumpState.DUMP_MESSAGES);} else if ("v".equals(cmd) || "verifiers".equals(cmd)) {dumpState.setDump(DumpState.DUMP_VERIFIERS);} else if ("dv".equals(cmd) || "domain-verifier".equals(cmd)) {dumpState.setDump(DumpState.DUMP_DOMAIN_VERIFIER);} else if ("version".equals(cmd)) {dumpState.setDump(DumpState.DUMP_VERSION);} else if ("k".equals(cmd) || "keysets".equals(cmd)) {dumpState.setDump(DumpState.DUMP_KEYSETS);} else if ("installs".equals(cmd)) {dumpState.setDump(DumpState.DUMP_INSTALLS);} else if ("frozen".equals(cmd)) {dumpState.setDump(DumpState.DUMP_FROZEN);} else if ("volumes".equals(cmd)) {dumpState.setDump(DumpState.DUMP_VOLUMES);} else if ("dexopt".equals(cmd)) {dumpState.setDump(DumpState.DUMP_DEXOPT);} else if ("compiler-stats".equals(cmd)) {dumpState.setDump(DumpState.DUMP_COMPILER_STATS);} else if ("changes".equals(cmd)) {dumpState.setDump(DumpState.DUMP_CHANGES);} else if ("service-permissions".equals(cmd)) {dumpState.setDump(DumpState.DUMP_SERVICE_PERMISSIONS);} else if ("known-packages".equals(cmd)) {dumpState.setDump(DumpState.DUMP_KNOWN_PACKAGES);} else if ("t".equals(cmd) || "timeouts".equals(cmd)) {dumpState.setDump(DumpState.DUMP_PER_UID_READ_TIMEOUTS);} else if ("snapshot".equals(cmd)) {dumpState.setDump(DumpState.DUMP_SNAPSHOT_STATISTICS);if (opti < args.length) {if ("--full".equals(args[opti])) {dumpState.setBrief(false);opti++;} else if ("--brief".equals(args[opti])) {dumpState.setBrief(true);opti++;}}} else if ("protected-broadcasts".equals(cmd)) {dumpState.setDump(DumpState.DUMP_PROTECTED_BROADCASTS);} else if (sPmsExt.dumpCmdHandle(cmd, pw, args, opti)) {return;}}//...}}

(C)CameraService.cpp(media.camera)

//frameworks/av/services/camera/libcameraservice/CameraService.cppstatus_t CameraService::dump(int fd, const Vector<String16>& args) {ATRACE_CALL();if (checkCallingPermission(sDumpPermission) == false) {dprintf(fd, "Permission Denial: can't dump CameraService from pid=%d, uid=%d\n",CameraThreadState::getCallingPid(),CameraThreadState::getCallingUid());return NO_ERROR;}bool locked = tryLock(mServiceLock);// failed to lock - CameraService is probably deadlockedif (!locked) {dprintf(fd, "!! CameraService may be deadlocked !!\n");}if (!mInitialized) {dprintf(fd, "!! No camera HAL available !!\n");// Dump event log for error informationdumpEventLog(fd);if (locked) mServiceLock.unlock();return NO_ERROR;}dprintf(fd, "\n== Service global info: ==\n\n");dprintf(fd, "Number of camera devices: %d\n", mNumberOfCameras);dprintf(fd, "Number of normal camera devices: %zu\n", mNormalDeviceIds.size());dprintf(fd, "Number of public camera devices visible to API1: %zu\n",mNormalDeviceIdsWithoutSystemCamera.size());for (size_t i = 0; i < mNormalDeviceIds.size(); i++) {dprintf(fd, "    Device %zu maps to \"%s\"\n", i, mNormalDeviceIds[i].c_str());}String8 activeClientString = mActiveClientManager.toString();dprintf(fd, "Active Camera Clients:\n%s", activeClientString.string());dprintf(fd, "Allowed user IDs: %s\n", toString(mAllowedUsers).string());dumpEventLog(fd);bool stateLocked = tryLock(mCameraStatesLock);if (!stateLocked) {dprintf(fd, "CameraStates in use, may be deadlocked\n");}int argSize = args.size();for (int i = 0; i < argSize; i++) {if (args[i] == TagMonitor::kMonitorOption) {if (i + 1 < argSize) {mMonitorTags = String8(args[i + 1]);}break;}}for (auto& state : mCameraStates) {String8 cameraId = state.first;dprintf(fd, "== Camera device %s dynamic info: ==\n", cameraId.string());CameraParameters p = state.second->getShimParams();if (!p.isEmpty()) {dprintf(fd, "  Camera1 API shim is using parameters:\n        ");p.dump(fd, args);}auto clientDescriptor = mActiveClientManager.get(cameraId);if (clientDescriptor != nullptr) {// log the current open session infodumpOpenSessionClientLogs(fd, args, cameraId);} else {dumpClosedSessionClientLogs(fd, cameraId);}}if (stateLocked) mCameraStatesLock.unlock();if (locked) mServiceLock.unlock();mCameraProviderManager->dump(fd, args);dprintf(fd, "\n== Vendor tags: ==\n\n");sp<VendorTagDescriptor> desc = VendorTagDescriptor::getGlobalVendorTagDescriptor();if (desc == NULL) {sp<VendorTagDescriptorCache> cache =VendorTagDescriptorCache::getGlobalVendorTagCache();if (cache == NULL) {dprintf(fd, "No vendor tags.\n");} else {cache->dump(fd, /*verbosity*/2, /*indentation*/2);}} else {desc->dump(fd, /*verbosity*/2, /*indentation*/2);}// Dump camera traces if there were anydprintf(fd, "\n");camera3::CameraTraces::dump(fd);// Process dump arguments, if anyint n = args.size();String16 verboseOption("-v");String16 unreachableOption("--unreachable");for (int i = 0; i < n; i++) {if (args[i] == verboseOption) {// change logging levelif (i + 1 >= n) continue;String8 levelStr(args[i+1]);int level = atoi(levelStr.string());dprintf(fd, "\nSetting log level to %d.\n", level);setLogLevel(level);} else if (args[i] == unreachableOption) {// Dump memory analysis// TODO - should limit be an argument parameter?UnreachableMemoryInfo info;bool success = GetUnreachableMemory(info, /*limit*/ 10000);if (!success) {dprintf(fd, "\n== Unable to dump unreachable memory. ""Try disabling SELinux enforcement. ==\n");} else {dprintf(fd, "\n== Dumping unreachable memory: ==\n");std::string s = info.ToString(/*log_contents*/ true);write(fd, s.c_str(), s.size());}}}bool serviceLocked = tryLock(mServiceLock);// Dump info from previous open sessions.// Reposition the offset to beginning of the file before readingif ((mMemFd >= 0) && (lseek(mMemFd, 0, SEEK_SET) != -1)) {dprintf(fd, "\n**********Dumpsys from previous open session**********\n");ssize_t size_read;char buf[4096];while ((size_read = read(mMemFd, buf, (sizeof(buf) - 1))) > 0) {// Read data from file to a small buffer and write it to fd.write(fd, buf, size_read);if (size_read == -1) {ALOGE("%s: Error during reading the file: %s", __FUNCTION__, sFileName);break;}}dprintf(fd, "\n**********End of Dumpsys from previous open session**********\n");} else {ALOGE("%s: Error during reading the file: %s", __FUNCTION__, sFileName);}if (serviceLocked) mServiceLock.unlock();return NO_ERROR;
}

这篇关于dumpsys相关解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/439752

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析