diff options
author | Svetoslav Ganov <svetoslavganov@google.com> | 2013-09-07 22:42:47 -0700 |
---|---|---|
committer | Svetoslav Ganov <svetoslavganov@google.com> | 2013-09-09 13:15:15 -0700 |
commit | b669917825a49421ee79be4819ead765f5de8aae (patch) | |
tree | db48101f4a49c6a899a53d1c7ab000b55b8d7b04 /services | |
parent | 93d71945d88f38b784de3c12d7ae781e97735582 (diff) | |
download | frameworks_base-b669917825a49421ee79be4819ead765f5de8aae.zip frameworks_base-b669917825a49421ee79be4819ead765f5de8aae.tar.gz frameworks_base-b669917825a49421ee79be4819ead765f5de8aae.tar.bz2 |
Add dumping the state of the print sub-system.
Being able to dump the state of the print sub-system especially when
taking a bugreport is very useful for bug fixing and observing whether
the print system operates properly.
bug:10659019
Change-Id: Id098b788f474ab17766966a4563ffdfc0171c76b
Diffstat (limited to 'services')
4 files changed, 160 insertions, 4 deletions
diff --git a/services/java/com/android/server/print/PrintManagerService.java b/services/java/com/android/server/print/PrintManagerService.java index 2563b58..926f822 100644 --- a/services/java/com/android/server/print/PrintManagerService.java +++ b/services/java/com/android/server/print/PrintManagerService.java @@ -41,6 +41,8 @@ import android.util.SparseArray; import com.android.internal.content.PackageMonitor; import com.android.internal.os.BackgroundThread; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -298,6 +300,27 @@ public final class PrintManagerService extends IPrintManager.Stub { } } + @Override + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (mContext.checkCallingOrSelfPermission(Manifest.permission.DUMP) + != PackageManager.PERMISSION_GRANTED) { + pw.println("Permission Denial: can't dump PrintManager from from pid=" + + Binder.getCallingPid() + + ", uid=" + Binder.getCallingUid()); + return; + } + + synchronized (mLock) { + pw.println("PRINT MANAGER STATE (dumpsys print)"); + final int userStateCount = mUserStates.size(); + for (int i = 0; i < userStateCount; i++) { + UserState userState = mUserStates.get(i); + userState.dump(fd, pw, ""); + pw.println(); + } + } + } + private void registerContentObservers() { final Uri enabledPrintServicesUri = Settings.Secure.getUriFor( Settings.Secure.ENABLED_PRINT_SERVICES); diff --git a/services/java/com/android/server/print/RemotePrintService.java b/services/java/com/android/server/print/RemotePrintService.java index 2ded202..ddff0ae 100644 --- a/services/java/com/android/server/print/RemotePrintService.java +++ b/services/java/com/android/server/print/RemotePrintService.java @@ -41,6 +41,7 @@ import android.util.Slog; import com.android.internal.R; +import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -137,6 +138,19 @@ final class RemotePrintService implements DeathRecipient { }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null); } + public void dump(PrintWriter pw, String prefix) { + String tab = " "; + pw.append(prefix).append("service:").println(); + pw.append(prefix).append(tab).append("componentName=") + .append(mComponentName.flattenToString()).println(); + pw.append(prefix).append(tab).append("destroyed=") + .append(String.valueOf(mDestroyed)).println(); + pw.append(prefix).append(tab).append("bound=") + .append(String.valueOf(isBound())).println(); + pw.append(prefix).append(tab).append("hasDicoverySession=") + .append(String.valueOf(mHasPrinterDiscoverySession)); + } + private void failAllActivePrintJobs() { List<PrintJobInfo> printJobs = mSpooler.getPrintJobInfos(mComponentName, PrintJobInfo.STATE_ANY_ACTIVE, PrintManager.APP_ID_ANY); diff --git a/services/java/com/android/server/print/RemotePrintSpooler.java b/services/java/com/android/server/print/RemotePrintSpooler.java index db0eb33..28a6186 100644 --- a/services/java/com/android/server/print/RemotePrintSpooler.java +++ b/services/java/com/android/server/print/RemotePrintSpooler.java @@ -34,11 +34,14 @@ import android.print.IPrintSpoolerCallbacks; import android.print.IPrintSpoolerClient; import android.print.PrintAttributes; import android.print.PrintJobInfo; +import android.print.PrintManager; import android.util.Slog; import android.util.TimedRemoteCaller; import libcore.io.IoUtils; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.List; import java.util.concurrent.TimeoutException; @@ -291,6 +294,28 @@ final class RemotePrintSpooler { } } + public void dump(FileDescriptor fd, PrintWriter pw, String prefix) { + synchronized (mLock) { + pw.append(prefix).append("destroyed=") + .append(String.valueOf(mDestroyed)).println(); + pw.append(prefix).append("bound=") + .append((mRemoteInstance != null) ? "true" : "false").println(); + pw.append(prefix).append("print jobs:").println(); + if (mRemoteInstance != null) { + List<PrintJobInfo> printJobs = getPrintJobInfos(null, + PrintJobInfo.STATE_ANY, PrintManager.APP_ID_ANY); + if (printJobs != null) { + final int printJobCount = printJobs.size(); + for (int i = 0; i < printJobCount; i++) { + PrintJobInfo printJob = printJobs.get(i); + pw.append(prefix).append(prefix).append(printJob.toString()); + pw.println(); + } + } + } + } + } + private void onAllPrintJobsHandled() { synchronized (mLock) { throwIfDestroyedLocked(); diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java index b37a0d9..5392975 100644 --- a/services/java/com/android/server/print/UserState.java +++ b/services/java/com/android/server/print/UserState.java @@ -39,14 +39,16 @@ import android.provider.Settings; import android.text.TextUtils; import android.text.TextUtils.SimpleStringSplitter; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Log; import android.util.Slog; import com.android.internal.os.SomeArgs; import com.android.server.print.RemotePrintSpooler.PrintSpoolerCallbacks; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -72,14 +74,14 @@ final class UserState implements PrintSpoolerCallbacks { private final Intent mQueryIntent = new Intent(android.printservice.PrintService.SERVICE_INTERFACE); - private final Map<ComponentName, RemotePrintService> mActiveServices = - new HashMap<ComponentName, RemotePrintService>(); + private final ArrayMap<ComponentName, RemotePrintService> mActiveServices = + new ArrayMap<ComponentName, RemotePrintService>(); private final List<PrintServiceInfo> mInstalledServices = new ArrayList<PrintServiceInfo>(); private final Set<ComponentName> mEnabledServices = - new HashSet<ComponentName>(); + new ArraySet<ComponentName>(); private final Object mLock; @@ -318,6 +320,57 @@ final class UserState implements PrintSpoolerCallbacks { mDestroyed = true; } + public void dump(FileDescriptor fd, PrintWriter pw, String prefix) { + pw.append(prefix).append("user state ").append(String.valueOf(mUserId)).append(":"); + pw.println(); + + String tab = " "; + + pw.append(prefix).append(tab).append("installed services:").println(); + final int installedServiceCount = mInstalledServices.size(); + for (int i = 0; i < installedServiceCount; i++) { + PrintServiceInfo installedService = mInstalledServices.get(i); + String installedServicePrefix = prefix + tab + tab; + pw.append(installedServicePrefix).append("service:").println(); + ResolveInfo resolveInfo = installedService.getResolveInfo(); + ComponentName componentName = new ComponentName( + resolveInfo.serviceInfo.packageName, + resolveInfo.serviceInfo.name); + pw.append(installedServicePrefix).append(tab).append("componentName=") + .append(componentName.flattenToString()).println(); + pw.append(installedServicePrefix).append(tab).append("settingsActivity=") + .append(installedService.getSettingsActivityName()).println(); + pw.append(installedServicePrefix).append(tab).append("addPrintersActivity=") + .append(installedService.getAddPrintersActivityName()).println(); + } + + pw.append(prefix).append(tab).append("enabled services:").println(); + for (ComponentName enabledService : mEnabledServices) { + String enabledServicePrefix = prefix + tab + tab; + pw.append(enabledServicePrefix).append("service:").println(); + pw.append(enabledServicePrefix).append(tab).append("componentName=") + .append(enabledService.flattenToString()); + pw.println(); + } + + pw.append(prefix).append(tab).append("active services:").println(); + final int activeServiceCount = mActiveServices.size(); + for (int i = 0; i < activeServiceCount; i++) { + RemotePrintService activeService = mActiveServices.valueAt(i); + activeService.dump(pw, prefix + tab + tab); + pw.println(); + } + + pw.append(prefix).append(tab).append("discovery mediator:").println(); + if (mPrinterDiscoverySession != null) { + mPrinterDiscoverySession.dump(pw, prefix + tab + tab); + } + + pw.append(prefix).append(tab).append("print spooler:").println(); + mSpooler.dump(fd, pw, prefix + tab + tab); + pw.println(); + } + private boolean readConfigurationLocked() { boolean somethingChanged = false; somethingChanged |= readInstalledPrintServicesLocked(); @@ -814,6 +867,47 @@ final class UserState implements PrintSpoolerCallbacks { } } + public void dump(PrintWriter pw, String prefix) { + pw.append(prefix).append("destroyed=") + .append(String.valueOf(mDestroyed)).println(); + + pw.append(prefix).append("printDiscoveryInProgress=") + .append(String.valueOf(!mStartedPrinterDiscoveryTokens.isEmpty())).println(); + + String tab = " "; + + pw.append(prefix).append(tab).append("printer discovery observers:").println(); + final int observerCount = mDiscoveryObservers.beginBroadcast(); + for (int i = 0; i < observerCount; i++) { + IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i); + pw.append(prefix).append(prefix).append(observer.toString()); + pw.println(); + } + mDiscoveryObservers.finishBroadcast(); + + pw.append(prefix).append(tab).append("start discovery requests:").println(); + final int tokenCount = this.mStartedPrinterDiscoveryTokens.size(); + for (int i = 0; i < tokenCount; i++) { + IBinder token = mStartedPrinterDiscoveryTokens.get(i); + pw.append(prefix).append(tab).append(tab).append(token.toString()).println(); + } + + pw.append(prefix).append(tab).append("tracked printer requests:").println(); + final int trackedPrinters = mStateTrackedPrinters.size(); + for (int i = 0; i < trackedPrinters; i++) { + PrinterId printer = mStateTrackedPrinters.get(i); + pw.append(prefix).append(tab).append(tab).append(printer.toString()).println(); + } + + pw.append(prefix).append(tab).append("printers:").println(); + final int pritnerCount = mPrinters.size(); + for (int i = 0; i < pritnerCount; i++) { + PrinterInfo printer = mPrinters.valueAt(i); + pw.append(prefix).append(tab).append(tab).append( + printer.toString()).println(); + } + } + private void handleDispatchPrintersAdded(List<PrinterInfo> addedPrinters) { final int observerCount = mDiscoveryObservers.beginBroadcast(); for (int i = 0; i < observerCount; i++) { |