LoadTestsAutoTest.java revision 40656be65870932592daf070c7cbbc382dda67b5
1ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project/* 2ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * 4ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * you may not use this file except in compliance with the License. 6ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * You may obtain a copy of the License at 7ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * 8ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * 10ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * See the License for the specific language governing permissions and 14ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * limitations under the License. 15ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project */ 16ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 17ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectpackage com.android.dumprendertree; 18ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 1940656be65870932592daf070c7cbbc382dda67b5Guang Zhuimport dalvik.system.VMRuntime; 2040656be65870932592daf070c7cbbc382dda67b5Guang Zhu 21ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.app.Instrumentation; 22ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.content.Intent; 23ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.os.Bundle; 24b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport android.os.Debug; 2540656be65870932592daf070c7cbbc382dda67b5Guang Zhuimport android.os.Process; 26ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2; 2740656be65870932592daf070c7cbbc382dda67b5Guang Zhuimport android.util.Log; 28ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 29ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.FileOutputStream; 30ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.IOException; 31b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport java.io.InputStream; 32b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport java.io.OutputStream; 33b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport java.io.PrintStream; 34ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 35ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectpublic class LoadTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> { 36ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 37ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private final static String LOGTAG = "LoadTest"; 38ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private final static String LOAD_TEST_RESULT = "/sdcard/load_test_result.txt"; 39b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu private boolean mFinished; 40b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu static final String LOAD_TEST_RUNNER_FILES[] = { 41b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu "run_page_cycler.py" 424010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu }; 43b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 44ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public LoadTestsAutoTest() { 45ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project super("com.android.dumprendertree", TestShellActivity.class); 46ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 47ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 48ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // This function writes the result of the layout test to 49ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Am status so that it can be picked up from a script. 50ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void passOrFailCallback(String file, boolean result) { 51ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Instrumentation inst = getInstrumentation(); 52ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Bundle bundle = new Bundle(); 53ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project bundle.putBoolean(file, result); 54ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project inst.sendStatus(0, bundle); 55ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 56b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 57ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Invokes running of layout tests 58ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // and waits till it has finished running. 59b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu public void runPageCyclerTest() { 60ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation(); 61ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 62ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (runner.mTestPath == null) { 63ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, "No test specified"); 64ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 65ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 66b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 67ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project TestShellActivity activity = (TestShellActivity) getActivity(); 68ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 692a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu Log.v(LOGTAG, "About to run tests, calling gc first..."); 7040656be65870932592daf070c7cbbc382dda67b5Guang Zhu freeMem(); 712a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu 72ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Run tests 73ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project runTestAndWaitUntilDone(activity, runner.mTestPath, runner.mTimeoutInMillis); 74ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 75b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu dumpMemoryInfo(); 76b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 77ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Kill activity 78ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.finish(); 79ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 80ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 8140656be65870932592daf070c7cbbc382dda67b5Guang Zhu private void freeMem() { 8240656be65870932592daf070c7cbbc382dda67b5Guang Zhu Log.v(LOGTAG, "freeMem: calling gc/finalization..."); 8340656be65870932592daf070c7cbbc382dda67b5Guang Zhu final VMRuntime runtime = VMRuntime.getRuntime(); 8440656be65870932592daf070c7cbbc382dda67b5Guang Zhu 8540656be65870932592daf070c7cbbc382dda67b5Guang Zhu runtime.gcSoftReferences(); 8640656be65870932592daf070c7cbbc382dda67b5Guang Zhu runtime.runFinalizationSync(); 8740656be65870932592daf070c7cbbc382dda67b5Guang Zhu runtime.gcSoftReferences(); 8840656be65870932592daf070c7cbbc382dda67b5Guang Zhu runtime.runFinalizationSync(); 8940656be65870932592daf070c7cbbc382dda67b5Guang Zhu runtime.gcSoftReferences(); 9040656be65870932592daf070c7cbbc382dda67b5Guang Zhu runtime.runFinalizationSync(); 9140656be65870932592daf070c7cbbc382dda67b5Guang Zhu Runtime.getRuntime().runFinalization(); 9240656be65870932592daf070c7cbbc382dda67b5Guang Zhu Runtime.getRuntime().gc(); 9340656be65870932592daf070c7cbbc382dda67b5Guang Zhu Runtime.getRuntime().gc(); 9440656be65870932592daf070c7cbbc382dda67b5Guang Zhu 9540656be65870932592daf070c7cbbc382dda67b5Guang Zhu } 9640656be65870932592daf070c7cbbc382dda67b5Guang Zhu 9740656be65870932592daf070c7cbbc382dda67b5Guang Zhu private void printRow(PrintStream ps, String format, Object...objs) { 9840656be65870932592daf070c7cbbc382dda67b5Guang Zhu ps.println(String.format(format, objs)); 9940656be65870932592daf070c7cbbc382dda67b5Guang Zhu } 10040656be65870932592daf070c7cbbc382dda67b5Guang Zhu 101b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu private void dumpMemoryInfo() { 102ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 10340656be65870932592daf070c7cbbc382dda67b5Guang Zhu freeMem(); 104b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu Log.v(LOGTAG, "Dumping memory information."); 105b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 106ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project FileOutputStream out = new FileOutputStream(LOAD_TEST_RESULT, true); 107b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu PrintStream ps = new PrintStream(out); 108b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 109b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu ps.print("\n\n\n"); 11040656be65870932592daf070c7cbbc382dda67b5Guang Zhu ps.println("** MEMINFO in pid " + Process.myPid() 11140656be65870932592daf070c7cbbc382dda67b5Guang Zhu + " [com.android.dumprendertree] **"); 11240656be65870932592daf070c7cbbc382dda67b5Guang Zhu String formatString = "%17s %8s %8s %8s %8s"; 11340656be65870932592daf070c7cbbc382dda67b5Guang Zhu 11440656be65870932592daf070c7cbbc382dda67b5Guang Zhu long nativeMax = Debug.getNativeHeapSize() / 1024; 11540656be65870932592daf070c7cbbc382dda67b5Guang Zhu long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024; 11640656be65870932592daf070c7cbbc382dda67b5Guang Zhu long nativeFree = Debug.getNativeHeapFreeSize() / 1024; 11740656be65870932592daf070c7cbbc382dda67b5Guang Zhu Runtime runtime = Runtime.getRuntime(); 11840656be65870932592daf070c7cbbc382dda67b5Guang Zhu long dalvikMax = runtime.totalMemory() / 1024; 11940656be65870932592daf070c7cbbc382dda67b5Guang Zhu long dalvikFree = runtime.freeMemory() / 1024; 12040656be65870932592daf070c7cbbc382dda67b5Guang Zhu long dalvikAllocated = dalvikMax - dalvikFree; 12140656be65870932592daf070c7cbbc382dda67b5Guang Zhu 12240656be65870932592daf070c7cbbc382dda67b5Guang Zhu 12340656be65870932592daf070c7cbbc382dda67b5Guang Zhu Debug.MemoryInfo memInfo = new Debug.MemoryInfo(); 12440656be65870932592daf070c7cbbc382dda67b5Guang Zhu Debug.getMemoryInfo(memInfo); 12540656be65870932592daf070c7cbbc382dda67b5Guang Zhu 12640656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int nativeShared = memInfo.nativeSharedDirty; 12740656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int dalvikShared = memInfo.dalvikSharedDirty; 12840656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int otherShared = memInfo.otherSharedDirty; 12940656be65870932592daf070c7cbbc382dda67b5Guang Zhu 13040656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int nativePrivate = memInfo.nativePrivateDirty; 13140656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int dalvikPrivate = memInfo.dalvikPrivateDirty; 13240656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int otherPrivate = memInfo.otherPrivateDirty; 13340656be65870932592daf070c7cbbc382dda67b5Guang Zhu 13440656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "", "native", "dalvik", "other", "total"); 13540656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "size:", nativeMax, dalvikMax, "N/A", nativeMax + dalvikMax); 13640656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "allocated:", nativeAllocated, dalvikAllocated, "N/A", 13740656be65870932592daf070c7cbbc382dda67b5Guang Zhu nativeAllocated + dalvikAllocated); 13840656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "free:", nativeFree, dalvikFree, "N/A", 13940656be65870932592daf070c7cbbc382dda67b5Guang Zhu nativeFree + dalvikFree); 14040656be65870932592daf070c7cbbc382dda67b5Guang Zhu 14140656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "(Pss):", memInfo.nativePss, memInfo.dalvikPss, 14240656be65870932592daf070c7cbbc382dda67b5Guang Zhu memInfo.otherPss, memInfo.nativePss + memInfo.dalvikPss + memInfo.otherPss); 14340656be65870932592daf070c7cbbc382dda67b5Guang Zhu 14440656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "(shared dirty):", nativeShared, dalvikShared, otherShared, 14540656be65870932592daf070c7cbbc382dda67b5Guang Zhu nativeShared + dalvikShared + otherShared); 14640656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "(priv dirty):", nativePrivate, dalvikPrivate, otherPrivate, 14740656be65870932592daf070c7cbbc382dda67b5Guang Zhu nativePrivate + dalvikPrivate + otherPrivate); 148b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu ps.print("\n\n\n"); 149b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu ps.flush(); 150b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu ps.close(); 151b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out.flush(); 152b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out.close(); 153ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (IOException e) { 154ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, e.getMessage()); 155b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 156ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 157b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 158ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // A convenient method to be called by another activity. 159ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private void runTestAndWaitUntilDone(TestShellActivity activity, String url, int timeout) { 160ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.setCallback(new TestShellCallback() { 161ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void finished() { 162ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project synchronized (LoadTestsAutoTest.this) { 163b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu mFinished = true; 164ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LoadTestsAutoTest.this.notifyAll(); 165ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 166b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 16740656be65870932592daf070c7cbbc382dda67b5Guang Zhu 1684010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu public void timedOut(String url) { 1694010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu } 170ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project }); 171b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 172b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu mFinished = false; 173ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 174ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.setClass(activity, TestShellActivity.class); 175ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 176ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.TEST_URL, url); 177ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout); 178ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.RESULT_FILE, LOAD_TEST_RESULT); 179ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.startActivity(intent); 180b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 181ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Wait until done. 182ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project synchronized (this) { 183b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu while(!mFinished) { 184b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu try { 185b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu this.wait(); 186b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } catch (InterruptedException e) { } 187b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 188ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 189b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 190b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 191b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu public void copyRunnerAssetsToCache() { 192b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu try { 193b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu String out_dir = getActivity().getApplicationContext() 194b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu .getCacheDir().getPath() + "/"; 195b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 196b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu for( int i=0; i< LOAD_TEST_RUNNER_FILES.length; i++) { 197b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu InputStream in = getActivity().getAssets().open( 198b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu LOAD_TEST_RUNNER_FILES[i]); 199b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu OutputStream out = new FileOutputStream( 200b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out_dir + LOAD_TEST_RUNNER_FILES[i]); 201b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 202b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu byte[] buf = new byte[2048]; 203b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu int len; 204b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 205b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu while ((len = in.read(buf)) >= 0 ) { 206b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out.write(buf, 0, len); 207b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 208b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out.close(); 209b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu in.close(); 210b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 211b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu }catch (IOException e) { 212b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu e.printStackTrace(); 213b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 214b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 215b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 216b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 217ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project} 218