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