Loading cmds/dumpstate/dumpstate.c +7 −0 Original line number Diff line number Diff line Loading @@ -252,6 +252,13 @@ static void dumpstate() { run_command("APP SERVICES", 30, "dumpsys", "activity", "service", "all", NULL); printf("========================================================\n"); printf("== Running Application Providers\n"); printf("========================================================\n"); run_command("APP SERVICES", 30, "dumpsys", "activity", "provider", "all", NULL); printf("========================================================\n"); printf("== dumpstate: done\n"); printf("========================================================\n"); Loading core/java/android/app/ActivityThread.java +32 −0 Original line number Diff line number Diff line Loading @@ -813,6 +813,19 @@ public final class ActivityThread { } } public void dumpProvider(FileDescriptor fd, IBinder providertoken, String[] args) { DumpComponentInfo data = new DumpComponentInfo(); try { data.fd = ParcelFileDescriptor.dup(fd); data.token = providertoken; data.args = args; queueOrSendMessage(H.DUMP_PROVIDER, data); } catch (IOException e) { Slog.w(TAG, "dumpProvider failed", e); } } @Override public Debug.MemoryInfo dumpMemInfo(FileDescriptor fd, boolean checkin, boolean all, String[] args) { Loading Loading @@ -1044,6 +1057,7 @@ public final class ActivityThread { public void scheduleTrimMemory(int level) { queueOrSendMessage(H.TRIM_MEMORY, null, level); } } private class H extends Handler { Loading Loading @@ -1088,6 +1102,7 @@ public final class ActivityThread { public static final int SET_CORE_SETTINGS = 138; public static final int UPDATE_PACKAGE_COMPATIBILITY_INFO = 139; public static final int TRIM_MEMORY = 140; public static final int DUMP_PROVIDER = 141; String codeToString(int code) { if (DEBUG_MESSAGES) { switch (code) { Loading Loading @@ -1132,6 +1147,7 @@ public final class ActivityThread { case SET_CORE_SETTINGS: return "SET_CORE_SETTINGS"; case UPDATE_PACKAGE_COMPATIBILITY_INFO: return "UPDATE_PACKAGE_COMPATIBILITY_INFO"; case TRIM_MEMORY: return "TRIM_MEMORY"; case DUMP_PROVIDER: return "DUMP_PROVIDER"; } } return "(unknown)"; Loading Loading @@ -1264,6 +1280,9 @@ public final class ActivityThread { case DUMP_ACTIVITY: handleDumpActivity((DumpComponentInfo)msg.obj); break; case DUMP_PROVIDER: handleDumpProvider((DumpComponentInfo)msg.obj); break; case SLEEPING: handleSleeping((IBinder)msg.obj, msg.arg1 != 0); break; Loading Loading @@ -2347,6 +2366,19 @@ public final class ActivityThread { } } private void handleDumpProvider(DumpComponentInfo info) { ProviderClientRecord r = mLocalProviders.get(info.token); if (r != null && r.mLocalProvider != null) { PrintWriter pw = new PrintWriter(new FileOutputStream(info.fd.getFileDescriptor())); r.mLocalProvider.dump(info.fd.getFileDescriptor(), pw, info.args); pw.flush(); try { info.fd.close(); } catch (IOException e) { } } } private void handleServiceArgs(ServiceArgsData data) { Service s = mServices.get(data.token); if (s != null) { Loading core/java/android/app/ApplicationThreadNative.java +26 −0 Original line number Diff line number Diff line Loading @@ -352,6 +352,21 @@ public abstract class ApplicationThreadNative extends Binder return true; } case DUMP_PROVIDER_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); ParcelFileDescriptor fd = data.readFileDescriptor(); final IBinder service = data.readStrongBinder(); final String[] args = data.readStringArray(); if (fd != null) { dumpProvider(fd.getFileDescriptor(), service, args); try { fd.close(); } catch (IOException e) { } } return true; } case SCHEDULE_REGISTERED_RECEIVER_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); IIntentReceiver receiver = IIntentReceiver.Stub.asInterface( Loading Loading @@ -931,6 +946,17 @@ class ApplicationThreadProxy implements IApplicationThread { data.recycle(); } public void dumpProvider(FileDescriptor fd, IBinder token, String[] args) throws RemoteException { Parcel data = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); data.writeFileDescriptor(fd); data.writeStrongBinder(token); data.writeStringArray(args); mRemote.transact(DUMP_PROVIDER_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); data.recycle(); } public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent, int resultCode, String dataStr, Bundle extras, boolean ordered, boolean sticky) throws RemoteException { Loading core/java/android/app/IApplicationThread.java +3 −0 Original line number Diff line number Diff line Loading @@ -102,6 +102,8 @@ public interface IApplicationThread extends IInterface { void processInBackground() throws RemoteException; void dumpService(FileDescriptor fd, IBinder servicetoken, String[] args) throws RemoteException; void dumpProvider(FileDescriptor fd, IBinder servicetoken, String[] args) throws RemoteException; void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky) throws RemoteException; Loading Loading @@ -171,4 +173,5 @@ public interface IApplicationThread extends IInterface { int SCHEDULE_TRIM_MEMORY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+41; int DUMP_MEM_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+42; int DUMP_GFX_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+43; int DUMP_PROVIDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+44; } core/java/android/content/ContentProvider.java +17 −0 Original line number Diff line number Diff line Loading @@ -32,8 +32,10 @@ import android.os.Process; import android.util.Log; import java.io.File; import java.io.FileDescriptor; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; /** Loading Loading @@ -1013,4 +1015,19 @@ public abstract class ContentProvider implements ComponentCallbacks2 { Log.w(TAG, "implement ContentProvider shutdown() to make sure all database " + "connections are gracefully shutdown"); } /** * Print the Provider's state into the given stream. This gets invoked if * you run "adb shell dumpsys activity provider <provider_component_name>". * * @param prefix Desired prefix to prepend at each line of output. * @param fd The raw file descriptor that the dump is being sent to. * @param writer The PrintWriter to which you should dump your state. This will be * closed for you after you return. * @param args additional arguments to the dump request. * @hide */ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { writer.println("nothing to dump"); } } Loading
cmds/dumpstate/dumpstate.c +7 −0 Original line number Diff line number Diff line Loading @@ -252,6 +252,13 @@ static void dumpstate() { run_command("APP SERVICES", 30, "dumpsys", "activity", "service", "all", NULL); printf("========================================================\n"); printf("== Running Application Providers\n"); printf("========================================================\n"); run_command("APP SERVICES", 30, "dumpsys", "activity", "provider", "all", NULL); printf("========================================================\n"); printf("== dumpstate: done\n"); printf("========================================================\n"); Loading
core/java/android/app/ActivityThread.java +32 −0 Original line number Diff line number Diff line Loading @@ -813,6 +813,19 @@ public final class ActivityThread { } } public void dumpProvider(FileDescriptor fd, IBinder providertoken, String[] args) { DumpComponentInfo data = new DumpComponentInfo(); try { data.fd = ParcelFileDescriptor.dup(fd); data.token = providertoken; data.args = args; queueOrSendMessage(H.DUMP_PROVIDER, data); } catch (IOException e) { Slog.w(TAG, "dumpProvider failed", e); } } @Override public Debug.MemoryInfo dumpMemInfo(FileDescriptor fd, boolean checkin, boolean all, String[] args) { Loading Loading @@ -1044,6 +1057,7 @@ public final class ActivityThread { public void scheduleTrimMemory(int level) { queueOrSendMessage(H.TRIM_MEMORY, null, level); } } private class H extends Handler { Loading Loading @@ -1088,6 +1102,7 @@ public final class ActivityThread { public static final int SET_CORE_SETTINGS = 138; public static final int UPDATE_PACKAGE_COMPATIBILITY_INFO = 139; public static final int TRIM_MEMORY = 140; public static final int DUMP_PROVIDER = 141; String codeToString(int code) { if (DEBUG_MESSAGES) { switch (code) { Loading Loading @@ -1132,6 +1147,7 @@ public final class ActivityThread { case SET_CORE_SETTINGS: return "SET_CORE_SETTINGS"; case UPDATE_PACKAGE_COMPATIBILITY_INFO: return "UPDATE_PACKAGE_COMPATIBILITY_INFO"; case TRIM_MEMORY: return "TRIM_MEMORY"; case DUMP_PROVIDER: return "DUMP_PROVIDER"; } } return "(unknown)"; Loading Loading @@ -1264,6 +1280,9 @@ public final class ActivityThread { case DUMP_ACTIVITY: handleDumpActivity((DumpComponentInfo)msg.obj); break; case DUMP_PROVIDER: handleDumpProvider((DumpComponentInfo)msg.obj); break; case SLEEPING: handleSleeping((IBinder)msg.obj, msg.arg1 != 0); break; Loading Loading @@ -2347,6 +2366,19 @@ public final class ActivityThread { } } private void handleDumpProvider(DumpComponentInfo info) { ProviderClientRecord r = mLocalProviders.get(info.token); if (r != null && r.mLocalProvider != null) { PrintWriter pw = new PrintWriter(new FileOutputStream(info.fd.getFileDescriptor())); r.mLocalProvider.dump(info.fd.getFileDescriptor(), pw, info.args); pw.flush(); try { info.fd.close(); } catch (IOException e) { } } } private void handleServiceArgs(ServiceArgsData data) { Service s = mServices.get(data.token); if (s != null) { Loading
core/java/android/app/ApplicationThreadNative.java +26 −0 Original line number Diff line number Diff line Loading @@ -352,6 +352,21 @@ public abstract class ApplicationThreadNative extends Binder return true; } case DUMP_PROVIDER_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); ParcelFileDescriptor fd = data.readFileDescriptor(); final IBinder service = data.readStrongBinder(); final String[] args = data.readStringArray(); if (fd != null) { dumpProvider(fd.getFileDescriptor(), service, args); try { fd.close(); } catch (IOException e) { } } return true; } case SCHEDULE_REGISTERED_RECEIVER_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); IIntentReceiver receiver = IIntentReceiver.Stub.asInterface( Loading Loading @@ -931,6 +946,17 @@ class ApplicationThreadProxy implements IApplicationThread { data.recycle(); } public void dumpProvider(FileDescriptor fd, IBinder token, String[] args) throws RemoteException { Parcel data = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); data.writeFileDescriptor(fd); data.writeStrongBinder(token); data.writeStringArray(args); mRemote.transact(DUMP_PROVIDER_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); data.recycle(); } public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent, int resultCode, String dataStr, Bundle extras, boolean ordered, boolean sticky) throws RemoteException { Loading
core/java/android/app/IApplicationThread.java +3 −0 Original line number Diff line number Diff line Loading @@ -102,6 +102,8 @@ public interface IApplicationThread extends IInterface { void processInBackground() throws RemoteException; void dumpService(FileDescriptor fd, IBinder servicetoken, String[] args) throws RemoteException; void dumpProvider(FileDescriptor fd, IBinder servicetoken, String[] args) throws RemoteException; void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky) throws RemoteException; Loading Loading @@ -171,4 +173,5 @@ public interface IApplicationThread extends IInterface { int SCHEDULE_TRIM_MEMORY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+41; int DUMP_MEM_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+42; int DUMP_GFX_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+43; int DUMP_PROVIDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+44; }
core/java/android/content/ContentProvider.java +17 −0 Original line number Diff line number Diff line Loading @@ -32,8 +32,10 @@ import android.os.Process; import android.util.Log; import java.io.File; import java.io.FileDescriptor; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; /** Loading Loading @@ -1013,4 +1015,19 @@ public abstract class ContentProvider implements ComponentCallbacks2 { Log.w(TAG, "implement ContentProvider shutdown() to make sure all database " + "connections are gracefully shutdown"); } /** * Print the Provider's state into the given stream. This gets invoked if * you run "adb shell dumpsys activity provider <provider_component_name>". * * @param prefix Desired prefix to prepend at each line of output. * @param fd The raw file descriptor that the dump is being sent to. * @param writer The PrintWriter to which you should dump your state. This will be * closed for you after you return. * @param args additional arguments to the dump request. * @hide */ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { writer.println("nothing to dump"); } }