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 735dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu runTestAndWaitUntilDone(activity, runner.mTestPath, runner.mTimeoutInMillis, 745dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu runner.mGetDrawTime, runner.mSaveImagePath); 75ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 76889181d7fdf54b50a3cf4ee7e0f402a2fc026afeGuang Zhu activity.clearCache(); 771f6c72bff6fa875a08f2d5510b5a61ce766643d2Guang Zhu try { 781f6c72bff6fa875a08f2d5510b5a61ce766643d2Guang Zhu Thread.sleep(5000); 791f6c72bff6fa875a08f2d5510b5a61ce766643d2Guang Zhu } catch (InterruptedException e) { 801f6c72bff6fa875a08f2d5510b5a61ce766643d2Guang Zhu } 81b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu dumpMemoryInfo(); 82b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 83ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Kill activity 84ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.finish(); 85ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 86ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 8740656be65870932592daf070c7cbbc382dda67b5Guang Zhu private void freeMem() { 8840656be65870932592daf070c7cbbc382dda67b5Guang Zhu Log.v(LOGTAG, "freeMem: calling gc/finalization..."); 8940656be65870932592daf070c7cbbc382dda67b5Guang Zhu final VMRuntime runtime = VMRuntime.getRuntime(); 9040656be65870932592daf070c7cbbc382dda67b5Guang Zhu 9140656be65870932592daf070c7cbbc382dda67b5Guang Zhu runtime.gcSoftReferences(); 9240656be65870932592daf070c7cbbc382dda67b5Guang Zhu runtime.runFinalizationSync(); 9340656be65870932592daf070c7cbbc382dda67b5Guang Zhu runtime.gcSoftReferences(); 9440656be65870932592daf070c7cbbc382dda67b5Guang Zhu runtime.runFinalizationSync(); 9540656be65870932592daf070c7cbbc382dda67b5Guang Zhu runtime.gcSoftReferences(); 9640656be65870932592daf070c7cbbc382dda67b5Guang Zhu runtime.runFinalizationSync(); 9740656be65870932592daf070c7cbbc382dda67b5Guang Zhu Runtime.getRuntime().runFinalization(); 9840656be65870932592daf070c7cbbc382dda67b5Guang Zhu Runtime.getRuntime().gc(); 9940656be65870932592daf070c7cbbc382dda67b5Guang Zhu Runtime.getRuntime().gc(); 10040656be65870932592daf070c7cbbc382dda67b5Guang Zhu 10140656be65870932592daf070c7cbbc382dda67b5Guang Zhu } 10240656be65870932592daf070c7cbbc382dda67b5Guang Zhu 10340656be65870932592daf070c7cbbc382dda67b5Guang Zhu private void printRow(PrintStream ps, String format, Object...objs) { 10440656be65870932592daf070c7cbbc382dda67b5Guang Zhu ps.println(String.format(format, objs)); 10540656be65870932592daf070c7cbbc382dda67b5Guang Zhu } 10640656be65870932592daf070c7cbbc382dda67b5Guang Zhu 107b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu private void dumpMemoryInfo() { 108ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 10940656be65870932592daf070c7cbbc382dda67b5Guang Zhu freeMem(); 110b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu Log.v(LOGTAG, "Dumping memory information."); 111b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 112ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project FileOutputStream out = new FileOutputStream(LOAD_TEST_RESULT, true); 113b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu PrintStream ps = new PrintStream(out); 114b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 115b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu ps.print("\n\n\n"); 11640656be65870932592daf070c7cbbc382dda67b5Guang Zhu ps.println("** MEMINFO in pid " + Process.myPid() 11740656be65870932592daf070c7cbbc382dda67b5Guang Zhu + " [com.android.dumprendertree] **"); 11840656be65870932592daf070c7cbbc382dda67b5Guang Zhu String formatString = "%17s %8s %8s %8s %8s"; 11940656be65870932592daf070c7cbbc382dda67b5Guang Zhu 12040656be65870932592daf070c7cbbc382dda67b5Guang Zhu long nativeMax = Debug.getNativeHeapSize() / 1024; 12140656be65870932592daf070c7cbbc382dda67b5Guang Zhu long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024; 12240656be65870932592daf070c7cbbc382dda67b5Guang Zhu long nativeFree = Debug.getNativeHeapFreeSize() / 1024; 12340656be65870932592daf070c7cbbc382dda67b5Guang Zhu Runtime runtime = Runtime.getRuntime(); 12440656be65870932592daf070c7cbbc382dda67b5Guang Zhu long dalvikMax = runtime.totalMemory() / 1024; 12540656be65870932592daf070c7cbbc382dda67b5Guang Zhu long dalvikFree = runtime.freeMemory() / 1024; 12640656be65870932592daf070c7cbbc382dda67b5Guang Zhu long dalvikAllocated = dalvikMax - dalvikFree; 12740656be65870932592daf070c7cbbc382dda67b5Guang Zhu 12840656be65870932592daf070c7cbbc382dda67b5Guang Zhu 12940656be65870932592daf070c7cbbc382dda67b5Guang Zhu Debug.MemoryInfo memInfo = new Debug.MemoryInfo(); 13040656be65870932592daf070c7cbbc382dda67b5Guang Zhu Debug.getMemoryInfo(memInfo); 13140656be65870932592daf070c7cbbc382dda67b5Guang Zhu 13240656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int nativeShared = memInfo.nativeSharedDirty; 13340656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int dalvikShared = memInfo.dalvikSharedDirty; 13440656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int otherShared = memInfo.otherSharedDirty; 13540656be65870932592daf070c7cbbc382dda67b5Guang Zhu 13640656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int nativePrivate = memInfo.nativePrivateDirty; 13740656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int dalvikPrivate = memInfo.dalvikPrivateDirty; 13840656be65870932592daf070c7cbbc382dda67b5Guang Zhu final int otherPrivate = memInfo.otherPrivateDirty; 13940656be65870932592daf070c7cbbc382dda67b5Guang Zhu 14040656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "", "native", "dalvik", "other", "total"); 14140656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "size:", nativeMax, dalvikMax, "N/A", nativeMax + dalvikMax); 14240656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "allocated:", nativeAllocated, dalvikAllocated, "N/A", 14340656be65870932592daf070c7cbbc382dda67b5Guang Zhu nativeAllocated + dalvikAllocated); 14440656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "free:", nativeFree, dalvikFree, "N/A", 14540656be65870932592daf070c7cbbc382dda67b5Guang Zhu nativeFree + dalvikFree); 14640656be65870932592daf070c7cbbc382dda67b5Guang Zhu 14740656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "(Pss):", memInfo.nativePss, memInfo.dalvikPss, 14840656be65870932592daf070c7cbbc382dda67b5Guang Zhu memInfo.otherPss, memInfo.nativePss + memInfo.dalvikPss + memInfo.otherPss); 14940656be65870932592daf070c7cbbc382dda67b5Guang Zhu 15040656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "(shared dirty):", nativeShared, dalvikShared, otherShared, 15140656be65870932592daf070c7cbbc382dda67b5Guang Zhu nativeShared + dalvikShared + otherShared); 15240656be65870932592daf070c7cbbc382dda67b5Guang Zhu printRow(ps, formatString, "(priv dirty):", nativePrivate, dalvikPrivate, otherPrivate, 15340656be65870932592daf070c7cbbc382dda67b5Guang Zhu nativePrivate + dalvikPrivate + otherPrivate); 154b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu ps.print("\n\n\n"); 155b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu ps.flush(); 156b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu ps.close(); 157b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out.flush(); 158b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out.close(); 159ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (IOException e) { 160ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.e(LOGTAG, e.getMessage()); 161b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 162ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 163b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 164ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // A convenient method to be called by another activity. 1655dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu private void runTestAndWaitUntilDone(TestShellActivity activity, String url, int timeout, 1665dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu boolean getDrawTime, String saveImagePath) { 167ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.setCallback(new TestShellCallback() { 168ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void finished() { 169ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project synchronized (LoadTestsAutoTest.this) { 170b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu mFinished = true; 171ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project LoadTestsAutoTest.this.notifyAll(); 172ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 173b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 17440656be65870932592daf070c7cbbc382dda67b5Guang Zhu 1754010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu public void timedOut(String url) { 1764010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu } 177ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project }); 178b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 179b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu mFinished = false; 180ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 181ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.setClass(activity, TestShellActivity.class); 182ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 183ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.TEST_URL, url); 184ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout); 185ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project intent.putExtra(TestShellActivity.RESULT_FILE, LOAD_TEST_RESULT); 1865dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu intent.putExtra(TestShellActivity.GET_DRAW_TIME, getDrawTime); 1875dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu if (saveImagePath != null) 1885dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu intent.putExtra(TestShellActivity.SAVE_IMAGE, saveImagePath); 189ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project activity.startActivity(intent); 190b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 191ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // Wait until done. 192ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project synchronized (this) { 193b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu while(!mFinished) { 194b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu try { 195b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu this.wait(); 196b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } catch (InterruptedException e) { } 197b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 198ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 199b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 200b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 201b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu public void copyRunnerAssetsToCache() { 202b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu try { 203b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu String out_dir = getActivity().getApplicationContext() 204b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu .getCacheDir().getPath() + "/"; 205b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 206b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu for( int i=0; i< LOAD_TEST_RUNNER_FILES.length; i++) { 207b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu InputStream in = getActivity().getAssets().open( 208b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu LOAD_TEST_RUNNER_FILES[i]); 209b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu OutputStream out = new FileOutputStream( 210b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out_dir + LOAD_TEST_RUNNER_FILES[i]); 211b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 212b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu byte[] buf = new byte[2048]; 213b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu int len; 214b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 215b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu while ((len = in.read(buf)) >= 0 ) { 216b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out.write(buf, 0, len); 217b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 218b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu out.close(); 219b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu in.close(); 220b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 221b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu }catch (IOException e) { 222b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu e.printStackTrace(); 223b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 224b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 225b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu } 226b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu 227ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project} 228