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