StrictModeActivity.java revision 91f194ee7d75f2fe88427afef4705928b6023e31
198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick/* 298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * Copyright (C) 2010 The Android Open Source Project 398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * 498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * Licensed under the Apache License, Version 2.0 (the "License"); 598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * you may not use this file except in compliance with the License. 698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * You may obtain a copy of the License at 798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * 898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * http://www.apache.org/licenses/LICENSE-2.0 998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * 1098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * Unless required by applicable law or agreed to in writing, software 1198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * distributed under the License is distributed on an "AS IS" BASIS, 1298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * See the License for the specific language governing permissions and 1498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * limitations under the License. 1598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick */ 1698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 1798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickpackage com.android.strictmodetest; 1898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 1998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.app.Activity; 2098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.ComponentName; 2198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.ContentQueryMap; 2298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.ContentResolver; 2398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.ContentValues; 2498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.Context; 2598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.IContentProvider; 2698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.Intent; 2798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.ServiceConnection; 2898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.pm.PackageManager; 2998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.pm.ResolveInfo; 3098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.res.Configuration; 3198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.res.Resources; 3298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.database.Cursor; 3398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.database.Cursor; 3498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.database.SQLException; 3598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.database.sqlite.SQLiteDatabase; 3698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.net.LocalSocket; 3798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.net.LocalSocketAddress; 3898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.net.Uri; 3998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.Bundle; 4098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.Debug; 4198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.Handler; 4298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.IBinder; 4398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.Parcel; 4498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.RemoteException; 4598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.ServiceManager; 4698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.StrictMode; 4798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.SystemClock; 4898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.telephony.TelephonyManager; 4998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.text.TextUtils; 5098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.util.AndroidException; 5198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.util.Config; 5298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.util.Log; 5398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.view.View; 5498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.widget.Button; 5598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.widget.CheckBox; 5698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.widget.TextView; 5798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 58750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport org.apache.http.HttpResponse; 59750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport org.apache.http.client.methods.HttpUriRequest; 60750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport org.apache.http.client.methods.HttpGet; 61750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport org.apache.http.impl.client.DefaultHttpClient; 62750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick 6398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.File; 6498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.FileInputStream; 6591f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrickimport java.io.FileOutputStream; 6698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.IOException; 6798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.InputStream; 6898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.OutputStream; 6998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.RandomAccessFile; 70750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport java.net.InetAddress; 71750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport java.net.URL; 7298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 7398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickpublic class StrictModeActivity extends Activity { 7498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 7598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick private static final String TAG = "StrictModeActivity"; 7698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick private static final Uri SYSTEM_SETTINGS_URI = Uri.parse("content://settings/system"); 7798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 7898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick private ContentResolver cr; 7998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 80bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick private final static class SimpleConnection implements ServiceConnection { 81bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick public IService stub = null; 82bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick public void onServiceConnected(ComponentName name, IBinder service) { 83bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick stub = IService.Stub.asInterface(service); 84bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick Log.v(TAG, "Service connected: " + name); 85bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } 86bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick public void onServiceDisconnected(ComponentName name) { 87bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick stub = null; 88bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick Log.v(TAG, "Service disconnected: " + name); 89bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } 90bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } 91bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick 92bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick private final SimpleConnection mLocalServiceConn = new SimpleConnection(); 93bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick private final SimpleConnection mRemoteServiceConn = new SimpleConnection(); 94bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick 9598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick /** Called when the activity is first created. */ 9698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick @Override 9798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick public void onCreate(Bundle savedInstanceState) { 9898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick super.onCreate(savedInstanceState); 9998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick setContentView(R.layout.main); 10098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 10198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick cr = getContentResolver(); 10298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick final SQLiteDatabase db = openOrCreateDatabase("foo.db", MODE_PRIVATE, null); 10398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 10498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick final Button readButton = (Button) findViewById(R.id.read_button); 10598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick readButton.setOnClickListener(new View.OnClickListener() { 10698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick public void onClick(View v) { 10798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick Cursor c = null; 10898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick try { 10998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick c = db.rawQuery("SELECT * FROM foo", null); 11098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } finally { 11198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick if (c != null) c.close(); 11298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } 11398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } 11498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick }); 11598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 11698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick final Button writeButton = (Button) findViewById(R.id.write_button); 11798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick writeButton.setOnClickListener(new View.OnClickListener() { 11898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick public void onClick(View v) { 11998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick db.execSQL("CREATE TABLE IF NOT EXISTS FOO (a INT)"); 12098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } 12198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick }); 12298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 123750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick final Button dnsButton = (Button) findViewById(R.id.dns_button); 124750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick dnsButton.setOnClickListener(new View.OnClickListener() { 125750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick public void onClick(View v) { 126750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick Log.d(TAG, "Doing DNS lookup for www.l.google.com... " 127750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick + "(may be cached by InetAddress)"); 128750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick try { 129750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick InetAddress[] addrs = InetAddress.getAllByName("www.l.google.com"); 130750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick for (int i = 0; i < addrs.length; ++i) { 131750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick Log.d(TAG, "got: " + addrs[i]); 132750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } 133750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } catch (java.net.UnknownHostException e) { 134750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick Log.d(TAG, "DNS error: " + e); 135750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } 136750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } 137750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick }); 138750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick 139750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick final Button httpButton = (Button) findViewById(R.id.http_button); 140750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick httpButton.setOnClickListener(new View.OnClickListener() { 141750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick public void onClick(View v) { 142750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick try { 143750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick // Note: not using AndroidHttpClient, as that comes with its 144750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick // own pre-StrictMode network-on-Looper thread check. The 145750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick // intent of this test is that we test the network stack's 146750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick // instrumentation for StrictMode instead. 147750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick DefaultHttpClient httpClient = new DefaultHttpClient(); 148750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick HttpResponse res = httpClient.execute( 149750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick new HttpGet("http://www.android.com/favicon.ico")); 150750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick Log.d(TAG, "Fetched http response: " + res); 151750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } catch (IOException e) { 152750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick Log.d(TAG, "HTTP fetch error: " + e); 153750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } 154750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } 155750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick }); 156750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick 157750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick final Button http2Button = (Button) findViewById(R.id.http2_button); 158750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick http2Button.setOnClickListener(new View.OnClickListener() { 159750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick public void onClick(View v) { 160750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick try { 161750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick // Usually this ends up tripping in DNS resolution, 162750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick // so see http3Button below, which connects directly to an IP 163750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick InputStream is = new URL("http://www.android.com/") 164750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick .openConnection() 165750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick .getInputStream(); 166750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick Log.d(TAG, "Got input stream: " + is); 167750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } catch (IOException e) { 168750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick Log.d(TAG, "HTTP fetch error: " + e); 169750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } 170750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } 171750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick }); 172750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick 173750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick final Button http3Button = (Button) findViewById(R.id.http3_button); 174750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick http3Button.setOnClickListener(new View.OnClickListener() { 175750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick public void onClick(View v) { 176750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick try { 177750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick // One of Google's web IPs, as of 2010-06-16.... 178750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick InputStream is = new URL("http://74.125.19.14/") 179750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick .openConnection() 180750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick .getInputStream(); 181750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick Log.d(TAG, "Got input stream: " + is); 182750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } catch (IOException e) { 183750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick Log.d(TAG, "HTTP fetch error: " + e); 184750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } 185750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick } 186750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick }); 187750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick 188bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick final Button binderLocalButton = (Button) findViewById(R.id.binder_local_button); 189bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick binderLocalButton.setOnClickListener(new View.OnClickListener() { 190bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick public void onClick(View v) { 191bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick try { 192bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick boolean value = mLocalServiceConn.stub.doDiskWrite(123 /* dummy */); 193bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick Log.d(TAG, "local writeToDisk returned: " + value); 194bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } catch (RemoteException e) { 195bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick Log.d(TAG, "local binderButton error: " + e); 196bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } 197bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } 198bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick }); 199bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick 200bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick final Button binderRemoteButton = (Button) findViewById(R.id.binder_remote_button); 201bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick binderRemoteButton.setOnClickListener(new View.OnClickListener() { 202bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick public void onClick(View v) { 203bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick try { 204bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick boolean value = mRemoteServiceConn.stub.doDiskWrite(123 /* dummy */); 205bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick Log.d(TAG, "remote writeToDisk returned: " + value); 206bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } catch (RemoteException e) { 207bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick Log.d(TAG, "remote binderButton error: " + e); 208bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } 209bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } 210bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick }); 211bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick 212bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick final Button binderCheckButton = (Button) findViewById(R.id.binder_check_button); 213bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick binderCheckButton.setOnClickListener(new View.OnClickListener() { 214bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick public void onClick(View v) { 215bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick int policy; 216bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick try { 217bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick policy = mLocalServiceConn.stub.getThreadPolicy(); 218bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick Log.d(TAG, "local service policy: " + policy); 219bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick policy = mRemoteServiceConn.stub.getThreadPolicy(); 220bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick Log.d(TAG, "remote service policy: " + policy); 221bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } catch (RemoteException e) { 222bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick Log.d(TAG, "binderCheckButton error: " + e); 223bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } 224bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } 225bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick }); 226bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick 22791f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick final Button serviceDumpButton = (Button) findViewById(R.id.service_dump); 22891f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick serviceDumpButton.setOnClickListener(new View.OnClickListener() { 22991f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick public void onClick(View v) { 23091f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick Log.d(TAG, "About to do a service dump..."); 23191f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick File file = new File("/sdcard/strictmode-service-dump.txt"); 23291f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick FileOutputStream output = null; 23391f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick final int oldPolicy = StrictMode.getThreadBlockingPolicy(); 23491f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick try { 23591f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick StrictMode.setThreadBlockingPolicy(0); 23691f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick output = new FileOutputStream(file); 23791f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick StrictMode.setThreadBlockingPolicy(oldPolicy); 23891f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick boolean dumped = Debug.dumpService("cpuinfo", 23991f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick output.getFD(), new String[0]); 24091f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick Log.d(TAG, "Dumped = " + dumped); 24191f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick } catch (IOException e) { 24291f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick Log.e(TAG, "Can't dump service", e); 24391f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick } finally { 24491f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick StrictMode.setThreadBlockingPolicy(oldPolicy); 24591f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick } 24691f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick Log.d(TAG, "Did service dump."); 24791f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick } 24891f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick }); 249bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick 25098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick final CheckBox checkNoWrite = (CheckBox) findViewById(R.id.policy_no_write); 25198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick final CheckBox checkNoRead = (CheckBox) findViewById(R.id.policy_no_reads); 25298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick final CheckBox checkNoNetwork = (CheckBox) findViewById(R.id.policy_no_network); 25398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick final CheckBox checkPenaltyLog = (CheckBox) findViewById(R.id.policy_penalty_log); 25498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick final CheckBox checkPenaltyDialog = (CheckBox) findViewById(R.id.policy_penalty_dialog); 25598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick final CheckBox checkPenaltyDeath = (CheckBox) findViewById(R.id.policy_penalty_death); 25698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick final CheckBox checkPenaltyDropBox = (CheckBox) findViewById(R.id.policy_penalty_dropbox); 25798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 25898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick View.OnClickListener changePolicy = new View.OnClickListener() { 25998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick public void onClick(View v) { 26098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick int newPolicy = 0; 26198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick if (checkNoWrite.isChecked()) newPolicy |= StrictMode.DISALLOW_DISK_WRITE; 26298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick if (checkNoRead.isChecked()) newPolicy |= StrictMode.DISALLOW_DISK_READ; 26398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick if (checkNoNetwork.isChecked()) newPolicy |= StrictMode.DISALLOW_NETWORK; 26498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick if (checkPenaltyLog.isChecked()) newPolicy |= StrictMode.PENALTY_LOG; 26598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick if (checkPenaltyDialog.isChecked()) newPolicy |= StrictMode.PENALTY_DIALOG; 26698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick if (checkPenaltyDeath.isChecked()) newPolicy |= StrictMode.PENALTY_DEATH; 26798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick if (checkPenaltyDropBox.isChecked()) newPolicy |= StrictMode.PENALTY_DROPBOX; 26898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick Log.v(TAG, "Changing policy to: " + newPolicy); 26998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick StrictMode.setThreadBlockingPolicy(newPolicy); 27098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } 27198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick }; 27298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick checkNoWrite.setOnClickListener(changePolicy); 27398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick checkNoRead.setOnClickListener(changePolicy); 27498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick checkNoNetwork.setOnClickListener(changePolicy); 27598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick checkPenaltyLog.setOnClickListener(changePolicy); 27698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick checkPenaltyDialog.setOnClickListener(changePolicy); 27798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick checkPenaltyDeath.setOnClickListener(changePolicy); 27898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick checkPenaltyDropBox.setOnClickListener(changePolicy); 27998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } 28098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 28198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick private void fileReadLoop() { 28298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick RandomAccessFile raf = null; 28398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick File filename = getFileStreamPath("test.dat"); 28498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick try { 28598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick long sumNanos = 0; 28698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick byte[] buf = new byte[512]; 28798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 28898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick //raf = new RandomAccessFile(filename, "rw"); 28998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick //raf.write(buf); 29098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick //raf.close(); 29198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick //raf = null; 29298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 29398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick // The data's almost certainly cached -- it's not clear what we're testing here 29498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick raf = new RandomAccessFile(filename, "r"); 29598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick raf.seek(0); 29698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick raf.read(buf); 29798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } catch (IOException e) { 29898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick Log.e(TAG, "File read failed", e); 29998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } finally { 30098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick try { if (raf != null) raf.close(); } catch (IOException e) {} 30198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } 30298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } 30398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick 30498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick // Returns milliseconds taken, or -1 on failure. 30598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick private long settingsWrite(int mode) { 30698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick Cursor c = null; 30798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick long startTime = SystemClock.uptimeMillis(); 30898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick // The database will take care of replacing duplicates. 30998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick try { 31098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick ContentValues values = new ContentValues(); 31198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick values.put("name", "dummy_for_testing"); 31298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick values.put("value", "" + startTime); 31398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick Uri uri = cr.insert(SYSTEM_SETTINGS_URI, values); 31498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick Log.v(TAG, "inserted uri: " + uri); 31598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } catch (SQLException e) { 31698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick Log.w(TAG, "sqliteexception during write: " + e); 31798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick return -1; 31898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } 31998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick long duration = SystemClock.uptimeMillis() - startTime; 32098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick return duration; 32198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick } 322bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick 323bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick @Override public void onResume() { 324bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick super.onResume(); 325bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick bindService(new Intent(this, LocalService.class), 326bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick mLocalServiceConn, Context.BIND_AUTO_CREATE); 327bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick bindService(new Intent(this, RemoteService.class), 328bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick mRemoteServiceConn, Context.BIND_AUTO_CREATE); 329bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } 330bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick 331bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick @Override public void onPause() { 332bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick super.onPause(); 333bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick unbindService(mLocalServiceConn); 334bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick unbindService(mRemoteServiceConn); 335bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick } 33698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick} 337