StrictMode.java revision 438d0595121a7a2cdf19741e76e3c0e21a5c173d
1438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick/* 2438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * Copyright (C) 2010 The Android Open Source Project 3438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * 4438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * Licensed under the Apache License, Version 2.0 (the "License"); 5438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * you may not use this file except in compliance with the License. 6438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * You may obtain a copy of the License at 7438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * 8438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * http://www.apache.org/licenses/LICENSE-2.0 9438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * 10438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * Unless required by applicable law or agreed to in writing, software 11438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * distributed under the License is distributed on an "AS IS" BASIS, 12438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * See the License for the specific language governing permissions and 14438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * limitations under the License. 15438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick */ 16438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickpackage android.os; 17438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 18438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickimport android.app.ActivityManagerNative; 19438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickimport android.app.ApplicationErrorReport; 20438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickimport android.util.Log; 21438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 22438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickimport com.android.internal.os.RuntimeInit; 23438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 24438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickimport dalvik.system.BlockGuard; 25438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 26438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick/** 27438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * <p>StrictMode lets you impose stricter rules under which your 28438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * application runs.</p> 29438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick */ 30438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrickpublic final class StrictMode { 31438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick private static final String TAG = "StrictMode"; 32438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 33438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick private StrictMode() {} 34438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 35438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public static final int DISALLOW_DISK_WRITE = 0x01; 36438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public static final int DISALLOW_DISK_READ = 0x02; 37438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public static final int DISALLOW_NETWORK = 0x04; 38438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 39438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /** @hide */ 40438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public static final int DISALLOW_MASK = 41438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick DISALLOW_DISK_WRITE | DISALLOW_DISK_READ | DISALLOW_NETWORK; 42438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 43438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /** 44438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * Flag to log to the system log. 45438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick */ 46438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public static final int PENALTY_LOG = 0x10; // normal android.util.Log 47438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 48438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /** 49438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * Show an annoying dialog to the user. Will be rate-limited to be only 50438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * a little annoying. 51438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick */ 52438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public static final int PENALTY_DIALOG = 0x20; 53438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 54438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /** 55438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * Crash hard if policy is violated. 56438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick */ 57438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public static final int PENALTY_DEATH = 0x40; 58438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 59438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /** 60438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * Log a stacktrace to the DropBox on policy violation. 61438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick */ 62438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public static final int PENALTY_DROPBOX = 0x80; 63438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 64438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /** @hide */ 65438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public static final int PENALTY_MASK = 66438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick PENALTY_LOG | PENALTY_DIALOG | 67438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick PENALTY_DROPBOX | PENALTY_DEATH; 68438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 69438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /** 70438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * Sets the policy for what actions the current thread is denied, 71438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * as well as the penalty for violating the policy. 72438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * 73438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * @param policyMask a bitmask of DISALLOW_* and PENALTY_* values. 74438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick */ 75438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public static void setThreadBlockingPolicy(final int policyMask) { 76438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick BlockGuard.Policy policy = BlockGuard.getThreadPolicy(); 77438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick if (!(policy instanceof AndroidBlockGuardPolicy)) { 78438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick BlockGuard.setThreadPolicy(new AndroidBlockGuardPolicy(policyMask)); 79438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } else { 80438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick AndroidBlockGuardPolicy androidPolicy = (AndroidBlockGuardPolicy) policy; 81438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick androidPolicy.setPolicyMask(policyMask); 82438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 83438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 84438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 85438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /** 86438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * Returns the bitmask of the current thread's blocking policy. 87438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * 88438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick * @return the bitmask of all the DISALLOW_* and PENALTY_* bits currently enabled 89438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick */ 90438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public static int getThreadBlockingPolicy() { 91438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick return BlockGuard.getThreadPolicy().getPolicyMask(); 92438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 93438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 94438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /** @hide */ 95438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public static void setDropBoxManager(DropBoxManager dropBoxManager) { 96438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick BlockGuard.Policy policy = BlockGuard.getThreadPolicy(); 97438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick if (!(policy instanceof AndroidBlockGuardPolicy)) { 98438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick policy = new AndroidBlockGuardPolicy(0); 99438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick BlockGuard.setThreadPolicy(policy); 100438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 101438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick ((AndroidBlockGuardPolicy) policy).setDropBoxManager(dropBoxManager); 102438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 103438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 104438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick private static class AndroidBlockGuardPolicy implements BlockGuard.Policy { 105438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick private int mPolicyMask; 106438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick private DropBoxManager mDropBoxManager = null; 107438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 108438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public AndroidBlockGuardPolicy(final int policyMask) { 109438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick mPolicyMask = policyMask; 110438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 111438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 112438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // Part of BlockGuard.Policy interface: 113438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public int getPolicyMask() { 114438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick return mPolicyMask; 115438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 116438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 117438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // Part of BlockGuard.Policy interface: 118438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public void onWriteToDisk() { 119438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick if ((mPolicyMask & DISALLOW_DISK_WRITE) == 0) { 120438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick return; 121438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 122438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick handleViolation(DISALLOW_DISK_WRITE); 123438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 124438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 125438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // Part of BlockGuard.Policy interface: 126438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public void onReadFromDisk() { 127438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick if ((mPolicyMask & DISALLOW_DISK_READ) == 0) { 128438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick return; 129438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 130438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick handleViolation(DISALLOW_DISK_READ); 131438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 132438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 133438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // Part of BlockGuard.Policy interface: 134438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public void onNetwork() { 135438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick if ((mPolicyMask & DISALLOW_NETWORK) == 0) { 136438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick return; 137438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 138438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick handleViolation(DISALLOW_NETWORK); 139438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 140438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 141438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public void setPolicyMask(int policyMask) { 142438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick mPolicyMask = policyMask; 143438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 144438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 145438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public void setDropBoxManager(DropBoxManager dropBoxManager) { 146438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick mDropBoxManager = dropBoxManager; 147438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 148438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 149438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick private void handleViolation(int violationBit) { 150438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick final BlockGuard.BlockGuardPolicyException violation = 151438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick new BlockGuard.BlockGuardPolicyException(mPolicyMask, violationBit); 152438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick violation.fillInStackTrace(); 153438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 154438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick Looper looper = Looper.myLooper(); 155438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick if (looper == null) { 156438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // Without a Looper, we're unable to time how long the 157438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // violation takes place. This case should be rare, 158438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // as most users will care about timing violations 159438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // that happen on their main UI thread. 160438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick handleViolationWithTime(violation, -1L /* no time */); 161438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } else { 162438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick MessageQueue queue = Looper.myQueue(); 163438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick final long violationTime = SystemClock.uptimeMillis(); 164438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick queue.addIdleHandler(new MessageQueue.IdleHandler() { 165438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick public boolean queueIdle() { 166438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick long afterViolationTime = SystemClock.uptimeMillis(); 167438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick handleViolationWithTime(violation, afterViolationTime - violationTime); 168438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick return false; // remove this idle handler from the array 169438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 170438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick }); 171438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 172438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 173438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 174438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick private void handleViolationWithTime( 175438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick BlockGuard.BlockGuardPolicyException violation, 176438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick long durationMillis) { 177438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 178438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // It's possible (even quite likely) that mPolicyMask has 179438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // changed from the time the violation fired and now 180438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // (after the violating code ran) due to people who 181438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // push/pop temporary policy in regions of code. So use 182438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // the old policy here. 183438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick int policy = violation.getPolicy(); 184438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 185438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick if ((policy & PENALTY_LOG) != 0) { 186438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick if (durationMillis != -1) { 187438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick Log.d(TAG, "StrictMode policy violation; ~duration=" + durationMillis + " ms", 188438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick violation); 189438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } else { 190438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick Log.d(TAG, "StrictMode policy violation.", violation); 191438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 192438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 193438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 194438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick if ((policy & PENALTY_DIALOG) != 0) { 195438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // Currently this is just used for the dialog. 196438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick try { 197438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick ActivityManagerNative.getDefault().handleApplicationStrictModeViolation( 198438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick RuntimeInit.getApplicationObject(), 199438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick new ApplicationErrorReport.CrashInfo(violation)); 200438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } catch (RemoteException e) { 201438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick Log.e(TAG, "RemoteException trying to open strict mode dialog", e); 202438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 203438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 204438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 205438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick if ((policy & PENALTY_DROPBOX) != 0) { 206438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // TODO: call into ActivityManagerNative to do the dropboxing. 207438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // But do the first-layer signature dup-checking first client-side. 208438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // This conditional should be combined with the above, too, along 209438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick // with PENALTY_DEATH below. 210438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 211438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 212438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick if ((policy & PENALTY_DEATH) != 0) { 213438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick System.err.println("StrictMode policy violation with POLICY_DEATH; shutting down."); 214438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick Process.killProcess(Process.myPid()); 215438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick System.exit(10); 216438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 217438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 218438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 219438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick} 220