19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.ddm; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.Chunk; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.ChunkHandler; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.DdmServer; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug; 24d693dfa75b7a156898890014e7192a792314b757Siva Velusamyimport android.os.UserHandle; 25e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertzimport dalvik.system.VMRuntime; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.ByteBuffer; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 307b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * Handle "hello" messages and feature discovery. 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DdmHandleHello extends ChunkHandler { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int CHUNK_HELO = type("HELO"); 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int CHUNK_WAIT = type("WAIT"); 367b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public static final int CHUNK_FEAT = type("FEAT"); 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static DdmHandleHello mInstance = new DdmHandleHello(); 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy private static final String[] FRAMEWORK_FEATURES = new String[] { 41945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy "opengl-tracing", 42945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy "view-hierarchy", 43945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy }; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* singleton, do not instantiate */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private DdmHandleHello() {} 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Register for the messages we're interested in. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void register() { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DdmServer.registerHandler(CHUNK_HELO, mInstance); 537b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project DdmServer.registerHandler(CHUNK_FEAT, mInstance); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when the DDM server connects. The handler is allowed to 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * send messages to the server. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void connected() { 6143a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v("ddm-hello", "Connected!"); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 64e577232406649450a513140bf09cb3fc8c3fe046Andy McFadden if (false) { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* test spontaneous transmission */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = new byte[] { 0, 1, 2, 3, 4, -4, -3, -2, -1, 127 }; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Chunk testChunk = 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Chunk(ChunkHandler.type("TEST"), data, 1, data.length-2); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DdmServer.sendChunk(testChunk); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when the DDM server disconnects. Can be used to disable 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * periodic transmissions or clean up saved state. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void disconnected() { 7843a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v("ddm-hello", "Disconnected!"); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 837b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * Handle a chunk of data. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Chunk handleChunk(Chunk request) { 8643a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) 877b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project Log.v("ddm-heap", "Handling " + name(request.type) + " chunk"); 887b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project int type = request.type; 897b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 907b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project if (type == CHUNK_HELO) { 917b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return handleHELO(request); 927b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } else if (type == CHUNK_FEAT) { 937b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return handleFEAT(request); 947b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } else { 957b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project throw new RuntimeException("Unknown packet " 967b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project + ChunkHandler.name(type)); 977b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 987b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1007b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /* 101406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao * Handle introductory packet. This is called during JNI_CreateJavaVM 102406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao * before frameworks native methods are registered, so be careful not 103406ec15647b7664cadadde41dbaaa10e298c582bJeff Hao * to call any APIs that depend on frameworks native code. 1047b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 1057b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project private Chunk handleHELO(Chunk request) { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createFailChunk(123, "This is a test"); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Process the request. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ByteBuffer in = wrapChunk(request); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int serverProtoVers = in.getInt(); 11543a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v("ddm-hello", "Server version is " + serverProtoVers); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a response. 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String vmName = System.getProperty("java.vm.name", "?"); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String vmVersion = System.getProperty("java.vm.version", "?"); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String vmIdent = vmName + " v" + vmVersion; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //String appName = android.app.ActivityThread.currentPackageName(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //if (appName == null) 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // appName = "unknown"; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String appName = DdmHandleAppName.getAppName(); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 130e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz VMRuntime vmRuntime = VMRuntime.getRuntime(); 131e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz String instructionSetDescription = 132e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz vmRuntime.is64Bit() ? "64-bit" : "32-bit"; 133e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz String vmInstructionSet = vmRuntime.vmInstructionSet(); 134e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz if (vmInstructionSet != null && vmInstructionSet.length() > 0) { 135e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz instructionSetDescription += " (" + vmInstructionSet + ")"; 136e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz } 137e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz String vmFlags = "CheckJNI=" 138e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz + (vmRuntime.isCheckJniEnabled() ? "true" : "false"); 139e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz 140e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz ByteBuffer out = ByteBuffer.allocate(28 141e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz + vmIdent.length() * 2 142e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz + appName.length() * 2 143e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz + instructionSetDescription.length() * 2 144e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz + vmFlags.length() * 2); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.order(ChunkHandler.CHUNK_ORDER); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.putInt(DdmServer.CLIENT_PROTOCOL_VERSION); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.putInt(android.os.Process.myPid()); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.putInt(vmIdent.length()); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.putInt(appName.length()); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project putString(out, vmIdent); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project putString(out, appName); 152d693dfa75b7a156898890014e7192a792314b757Siva Velusamy out.putInt(UserHandle.myUserId()); 153e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz out.putInt(instructionSetDescription.length()); 154e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz putString(out, instructionSetDescription); 155e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz out.putInt(vmFlags.length()); 156e901dbdee242182e4c768edebebc5bc9cbf67563Sebastien Hertz putString(out, vmFlags); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Chunk reply = new Chunk(CHUNK_HELO, out); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Take the opportunity to inform DDMS if we are waiting for a 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * debugger to attach. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Debug.waitingForDebugger()) 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendWAIT(0); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1707b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /* 1717b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * Handle request for list of supported features. 1727b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 1737b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project private Chunk handleFEAT(Chunk request) { 1747b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project // TODO: query the VM to ensure that support for these features 1757b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project // is actually compiled in 1760c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy final String[] vmFeatures = Debug.getVmFeatureList(); 1777b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 17843a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) 17998d493588f0ec55b8b6b3762189b2c02f17005c7Andy McFadden Log.v("ddm-heap", "Got feature list request"); 1807b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 181945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy int size = 4 + 4 * (vmFeatures.length + FRAMEWORK_FEATURES.length); 1820c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy for (int i = vmFeatures.length-1; i >= 0; i--) 1830c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy size += vmFeatures[i].length() * 2; 184945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy for (int i = FRAMEWORK_FEATURES.length-1; i>= 0; i--) 185945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy size += FRAMEWORK_FEATURES[i].length() * 2; 1867b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 1877b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project ByteBuffer out = ByteBuffer.allocate(size); 1887b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project out.order(ChunkHandler.CHUNK_ORDER); 189945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy out.putInt(vmFeatures.length + FRAMEWORK_FEATURES.length); 1900c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy for (int i = vmFeatures.length-1; i >= 0; i--) { 1910c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy out.putInt(vmFeatures[i].length()); 1920c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy putString(out, vmFeatures[i]); 1930c1761bd37815c3776608a19c8e11d862b3e910cSiva Velusamy } 194945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy for (int i = FRAMEWORK_FEATURES.length-1; i >= 0; i--) { 195945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy out.putInt(FRAMEWORK_FEATURES[i].length()); 196945bfb6068d4ac1414a37a3ebe4dc4d02383e38eSiva Velusamy putString(out, FRAMEWORK_FEATURES[i]); 1977b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 1987b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 1997b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return new Chunk(CHUNK_FEAT, out); 2007b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 2017b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Send up a WAIT chunk. The only currently defined value for "reason" 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is zero, which means "waiting for a debugger". 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void sendWAIT(int reason) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = new byte[] { (byte) reason }; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Chunk waitChunk = new Chunk(CHUNK_WAIT, data, 0, 1); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DdmServer.sendChunk(waitChunk); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 213