Loading core/java/android/ddm/DdmHandleHello.java +11 −14 Original line number Diff line number Diff line Loading @@ -42,12 +42,6 @@ public class DdmHandleHello extends DdmHandle { private static DdmHandleHello mInstance = new DdmHandleHello(); private static final String[] FRAMEWORK_FEATURES = new String[] { "opengl-tracing", "view-hierarchy", "support_boot_stages" }; /* singleton, do not instantiate */ private DdmHandleHello() {} Loading Loading @@ -193,22 +187,25 @@ public class DdmHandleHello extends DdmHandle { if (false) Log.v("ddm-heap", "Got feature list request"); int size = 4 + 4 * (vmFeatures.length + FRAMEWORK_FEATURES.length); for (int i = vmFeatures.length-1; i >= 0; i--) String[] fmFeatures = Debug.getFeatureList(); int size = 4 + 4 * (vmFeatures.length + fmFeatures.length); for (int i = vmFeatures.length - 1; i >= 0; i--) { size += vmFeatures[i].length() * 2; for (int i = FRAMEWORK_FEATURES.length-1; i>= 0; i--) size += FRAMEWORK_FEATURES[i].length() * 2; } for (int i = fmFeatures.length - 1; i >= 0; i--) { size += fmFeatures[i].length() * 2; } ByteBuffer out = ByteBuffer.allocate(size); out.order(ChunkHandler.CHUNK_ORDER); out.putInt(vmFeatures.length + FRAMEWORK_FEATURES.length); out.putInt(vmFeatures.length + fmFeatures.length); for (int i = vmFeatures.length-1; i >= 0; i--) { out.putInt(vmFeatures[i].length()); putString(out, vmFeatures[i]); } for (int i = FRAMEWORK_FEATURES.length-1; i >= 0; i--) { out.putInt(FRAMEWORK_FEATURES[i].length()); putString(out, FRAMEWORK_FEATURES[i]); for (int i = fmFeatures.length - 1; i >= 0; i--) { out.putInt(fmFeatures[i].length()); putString(out, fmFeatures[i]); } return new Chunk(CHUNK_FEAT, out); Loading core/java/android/os/Debug.java +17 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,12 @@ public final class Debug private static final String DEFAULT_TRACE_BODY = "dmtrace"; private static final String DEFAULT_TRACE_EXTENSION = ".trace"; private static final String[] FRAMEWORK_FEATURES = new String[] { "opengl-tracing", "view-hierarchy", "support_boot_stages", }; /** * This class is used to retrieved various statistics about the memory mappings for this * process. The returned info is broken down by dalvik, native, and other. All results are in kB. Loading Loading @@ -1105,6 +1111,17 @@ public final class Debug return VMDebug.getVmFeatureList(); } /** * Returns an array of strings that identify Framework features. This is * used by DDMS to determine what sorts of operations the Framework can * perform. * * @hide */ public static String[] getFeatureList() { return FRAMEWORK_FEATURES; } /** * Change the JDWP port. * Loading proto/src/am_capabilities.proto +10 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,16 @@ message Capability { string name = 1; } message VMCapability { string name = 1; } message FrameworkCapability { string name = 1; } message Capabilities { repeated Capability values = 1; repeated VMCapability vm_capabilities = 2; repeated FrameworkCapability framework_capabilities = 3; } services/core/java/com/android/server/am/ActivityManagerShellCommand.java +26 −1 Original line number Diff line number Diff line Loading @@ -96,6 +96,7 @@ import android.opengl.GLES10; import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.Debug; import android.os.IProgressListener; import android.os.ParcelFileDescriptor; import android.os.RemoteCallback; Loading Loading @@ -124,6 +125,8 @@ import com.android.server.LocalServices; import com.android.server.am.LowMemDetector.MemFactor; import com.android.server.am.nano.Capabilities; import com.android.server.am.nano.Capability; import com.android.server.am.nano.FrameworkCapability; import com.android.server.am.nano.VMCapability; import com.android.server.compat.PlatformCompat; import com.android.server.pm.UserManagerInternal; import com.android.server.utils.Slogf; Loading Loading @@ -442,6 +445,22 @@ final class ActivityManagerShellCommand extends ShellCommand { capabilities.values[i] = cap; } String[] vmCapabilities = Debug.getVmFeatureList(); capabilities.vmCapabilities = new VMCapability[vmCapabilities.length]; for (int i = 0; i < vmCapabilities.length; i++) { VMCapability cap = new VMCapability(); cap.name = vmCapabilities[i]; capabilities.vmCapabilities[i] = cap; } String[] fmCapabilities = Debug.getFeatureList(); capabilities.frameworkCapabilities = new FrameworkCapability[fmCapabilities.length]; for (int i = 0; i < fmCapabilities.length; i++) { FrameworkCapability cap = new FrameworkCapability(); cap.name = fmCapabilities[i]; capabilities.frameworkCapabilities[i] = cap; } try { getRawOutputStream().write(Capabilities.toByteArray(capabilities)); } catch (IOException e) { Loading @@ -451,10 +470,16 @@ final class ActivityManagerShellCommand extends ShellCommand { } else { // Unfortunately we don't have protobuf text format capabilities here. // Fallback to line separated list instead for text parser. pw.println("Format: 1"); pw.println("Format: 2"); for (String capability : CAPABILITIES) { pw.println(capability); } for (String capability : Debug.getVmFeatureList()) { pw.println("vm:" + capability); } for (String capability : Debug.getFeatureList()) { pw.println("framework:" + capability); } } return 0; } Loading Loading
core/java/android/ddm/DdmHandleHello.java +11 −14 Original line number Diff line number Diff line Loading @@ -42,12 +42,6 @@ public class DdmHandleHello extends DdmHandle { private static DdmHandleHello mInstance = new DdmHandleHello(); private static final String[] FRAMEWORK_FEATURES = new String[] { "opengl-tracing", "view-hierarchy", "support_boot_stages" }; /* singleton, do not instantiate */ private DdmHandleHello() {} Loading Loading @@ -193,22 +187,25 @@ public class DdmHandleHello extends DdmHandle { if (false) Log.v("ddm-heap", "Got feature list request"); int size = 4 + 4 * (vmFeatures.length + FRAMEWORK_FEATURES.length); for (int i = vmFeatures.length-1; i >= 0; i--) String[] fmFeatures = Debug.getFeatureList(); int size = 4 + 4 * (vmFeatures.length + fmFeatures.length); for (int i = vmFeatures.length - 1; i >= 0; i--) { size += vmFeatures[i].length() * 2; for (int i = FRAMEWORK_FEATURES.length-1; i>= 0; i--) size += FRAMEWORK_FEATURES[i].length() * 2; } for (int i = fmFeatures.length - 1; i >= 0; i--) { size += fmFeatures[i].length() * 2; } ByteBuffer out = ByteBuffer.allocate(size); out.order(ChunkHandler.CHUNK_ORDER); out.putInt(vmFeatures.length + FRAMEWORK_FEATURES.length); out.putInt(vmFeatures.length + fmFeatures.length); for (int i = vmFeatures.length-1; i >= 0; i--) { out.putInt(vmFeatures[i].length()); putString(out, vmFeatures[i]); } for (int i = FRAMEWORK_FEATURES.length-1; i >= 0; i--) { out.putInt(FRAMEWORK_FEATURES[i].length()); putString(out, FRAMEWORK_FEATURES[i]); for (int i = fmFeatures.length - 1; i >= 0; i--) { out.putInt(fmFeatures[i].length()); putString(out, fmFeatures[i]); } return new Chunk(CHUNK_FEAT, out); Loading
core/java/android/os/Debug.java +17 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,12 @@ public final class Debug private static final String DEFAULT_TRACE_BODY = "dmtrace"; private static final String DEFAULT_TRACE_EXTENSION = ".trace"; private static final String[] FRAMEWORK_FEATURES = new String[] { "opengl-tracing", "view-hierarchy", "support_boot_stages", }; /** * This class is used to retrieved various statistics about the memory mappings for this * process. The returned info is broken down by dalvik, native, and other. All results are in kB. Loading Loading @@ -1105,6 +1111,17 @@ public final class Debug return VMDebug.getVmFeatureList(); } /** * Returns an array of strings that identify Framework features. This is * used by DDMS to determine what sorts of operations the Framework can * perform. * * @hide */ public static String[] getFeatureList() { return FRAMEWORK_FEATURES; } /** * Change the JDWP port. * Loading
proto/src/am_capabilities.proto +10 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,16 @@ message Capability { string name = 1; } message VMCapability { string name = 1; } message FrameworkCapability { string name = 1; } message Capabilities { repeated Capability values = 1; repeated VMCapability vm_capabilities = 2; repeated FrameworkCapability framework_capabilities = 3; }
services/core/java/com/android/server/am/ActivityManagerShellCommand.java +26 −1 Original line number Diff line number Diff line Loading @@ -96,6 +96,7 @@ import android.opengl.GLES10; import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.Debug; import android.os.IProgressListener; import android.os.ParcelFileDescriptor; import android.os.RemoteCallback; Loading Loading @@ -124,6 +125,8 @@ import com.android.server.LocalServices; import com.android.server.am.LowMemDetector.MemFactor; import com.android.server.am.nano.Capabilities; import com.android.server.am.nano.Capability; import com.android.server.am.nano.FrameworkCapability; import com.android.server.am.nano.VMCapability; import com.android.server.compat.PlatformCompat; import com.android.server.pm.UserManagerInternal; import com.android.server.utils.Slogf; Loading Loading @@ -442,6 +445,22 @@ final class ActivityManagerShellCommand extends ShellCommand { capabilities.values[i] = cap; } String[] vmCapabilities = Debug.getVmFeatureList(); capabilities.vmCapabilities = new VMCapability[vmCapabilities.length]; for (int i = 0; i < vmCapabilities.length; i++) { VMCapability cap = new VMCapability(); cap.name = vmCapabilities[i]; capabilities.vmCapabilities[i] = cap; } String[] fmCapabilities = Debug.getFeatureList(); capabilities.frameworkCapabilities = new FrameworkCapability[fmCapabilities.length]; for (int i = 0; i < fmCapabilities.length; i++) { FrameworkCapability cap = new FrameworkCapability(); cap.name = fmCapabilities[i]; capabilities.frameworkCapabilities[i] = cap; } try { getRawOutputStream().write(Capabilities.toByteArray(capabilities)); } catch (IOException e) { Loading @@ -451,10 +470,16 @@ final class ActivityManagerShellCommand extends ShellCommand { } else { // Unfortunately we don't have protobuf text format capabilities here. // Fallback to line separated list instead for text parser. pw.println("Format: 1"); pw.println("Format: 2"); for (String capability : CAPABILITIES) { pw.println(capability); } for (String capability : Debug.getVmFeatureList()) { pw.println("vm:" + capability); } for (String capability : Debug.getFeatureList()) { pw.println("framework:" + capability); } } return 0; } Loading