Binder.java revision eb75888e6479317151c2ed44d47bd28ef567a4c7
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Modifier; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for a remotable object, the core part of a lightweight 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remote procedure call mechanism defined by {@link IBinder}. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is an implementation of IBinder that provides 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the standard support creating a local implementation of such an object. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Most developers will not implement this class directly, instead using the 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/developing/tools/aidl.html">aidl</a> tool to describe the desired 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface, having it generate the appropriate Binder subclass. You can, 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * however, derive directly from Binder to implement your own custom RPC 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protocol or simply instantiate a raw Binder object directly to use as a 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * token that can be shared across processes. 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see IBinder 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Binder implements IBinder { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set this flag to true to detect anonymous, local or member classes 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that extend this Binder class and that are not static. These kind 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of classes can potentially create leaks. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean FIND_POTENTIAL_LEAKS = false; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "Binder"; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mObject; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IInterface mOwner; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mDescriptor; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the ID of the process that sent you the current transaction 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that is being processed. This pid can be used with higher-level 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system services to determine its identity and check permissions. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the current thread is not currently executing an incoming transaction, 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then its own pid is returned. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native int getCallingPid(); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the ID of the user assigned to the process that sent you the 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current transaction that is being processed. This uid can be used with 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * higher-level system services to determine its identity and check 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * permissions. If the current thread is not currently executing an 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * incoming transaction, then its own uid is returned. 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native int getCallingUid(); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 76a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * Reset the identity of the incoming IPC on the current thread. This can 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be useful if, while handling an incoming call, you will be calling 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on interfaces of other objects that may be local to your process and 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to do permission checks on the calls coming into them (so they 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will check the permission of your own local process, and not whatever 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * process originally called you). 82a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns an opaque token that can be used to restore the 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * original calling identity by passing it to 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #restoreCallingIdentity(long)}. 86a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getCallingPid() 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getCallingUid() 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #restoreCallingIdentity(long) 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native long clearCallingIdentity(); 92a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 94a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * Restore the identity of the incoming IPC on the current thread 95a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * back to a previously identity that was returned by {@link 96a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * #clearCallingIdentity}. 97a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token The opaque token that was previously returned by 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #clearCallingIdentity}. 100a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #clearCallingIdentity 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native void restoreCallingIdentity(long token); 104727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 105727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick /** 106727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * Sets the native thread-local StrictMode policy mask. 107727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * 108727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * <p>The StrictMode settings are kept in two places: a Java-level 109727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * threadlocal for libcore/Dalvik, and a native threadlocal (set 110727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * here) for propagation via Binder calls. This is a little 111727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * unfortunate, but necessary to break otherwise more unfortunate 112727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * dependencies either of Dalvik on Android, or Android 113727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * native-only code on Dalvik. 114727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * 115727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * @see StrictMode 116727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * @hide 117727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick */ 118727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick public static final native void setThreadStrictModePolicy(int policyMask); 119727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 120727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick /** 121727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * Gets the current native thread-local StrictMode policy mask. 122727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * 123727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * @see #setThreadStrictModePolicy 124727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * @hide 125727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick */ 126727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick public static final native int getThreadStrictModePolicy(); 127727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flush any Binder commands pending in the current thread to the kernel 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * driver. This can be 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * useful to call before performing an operation that may block for a long 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time, to ensure that any pending object references have been released 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in order to prevent the process from holding on to objects longer than 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it needs to. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native void flushPendingCommands(); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add the calling thread to the IPC thread pool. This function does 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not return until the current process is exiting. 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native void joinThreadPool(); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default constructor initializes the object. 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Binder() { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FIND_POTENTIAL_LEAKS) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Class<? extends Binder> klass = getClass(); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (klass.getModifiers() & Modifier.STATIC) == 0) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "The following Binder class should be static or leaks might occur: " + 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project klass.getCanonicalName()); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convenience method for associating a specific interface with the Binder. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * After calling, queryLocalInterface() will be implemented for you 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to return the given owner IInterface when the corresponding 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * descriptor is requested. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void attachInterface(IInterface owner, String descriptor) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwner = owner; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDescriptor = descriptor; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default implementation returns an empty interface name. 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getInterfaceDescriptor() { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDescriptor; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default implementation always returns true -- if you got here, 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the object is alive. 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean pingBinder() { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that if you're calling on a local binder, this always returns true 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * because your process is alive if you're calling it. 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isBinderAlive() { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use information supplied to attachInterface() to return the 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * associated IInterface if it matches the requested 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * descriptor. 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IInterface queryLocalInterface(String descriptor) { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDescriptor.equals(descriptor)) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOwner; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default implementation is a stub that returns false. You will want 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to override this to do the appropriate unmarshalling of transactions. 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If you want to call this, call transact(). 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onTransact(int code, Parcel data, Parcel reply, 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) throws RemoteException { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == INTERFACE_TRANSACTION) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeString(getInterfaceDescriptor()); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (code == DUMP_TRANSACTION) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ParcelFileDescriptor fd = data.readFileDescriptor(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] args = data.readStringArray(); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd != null) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dump(fd.getFileDescriptor(), args); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fd.close(); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 229eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick // swallowed, not propagated back to the caller 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 233eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick // Write the StrictMode header. 234eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick if (reply != null) { 235eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick reply.writeNoException(); 236eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick } else { 237eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick StrictMode.clearGatheredViolations(); 238eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implemented to call the more convenient version 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #dump(FileDescriptor, PrintWriter, String[])}. 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(FileDescriptor fd, String[] args) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fout = new FileOutputStream(fd); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PrintWriter pw = new PrintWriter(fout); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dump(fd, pw, args); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.flush(); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Print the object's state into the given stream. 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fd The raw file descriptor that the dump is being sent to. 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fout The file to which you should dump your state. This will be 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * closed for you after you return. 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args additional arguments to the dump request. 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default implementation rewinds the parcels and calls onTransact. On 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the remote side, transact calls into the binder to do the IPC. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean transact(int code, Parcel data, Parcel reply, 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) throws RemoteException { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Config.LOGV) Log.v("Binder", "Transact: " + code + " to " + this); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data != null) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.setDataPosition(0); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean r = onTransact(code, data, reply, flags); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reply != null) { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.setDataPosition(0); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Local implementation is a no-op. 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void linkToDeath(DeathRecipient recipient, int flags) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Local implementation is a no-op. 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean unlinkToDeath(DeathRecipient recipient, int flags) { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project destroy(); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void init(); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void destroy(); 3095b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick 3105b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // Entry point from android_util_Binder.cpp's onTransact 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean execTransact(int code, int dataObj, int replyObj, 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(dataObj); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = Parcel.obtain(replyObj); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // theoretically, we should call transact, which will call onTransact, 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // but all that does is rewind it, and we just got these from an IPC, 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so we'll just call it directly. 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean res; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = onTransact(code, data, reply, flags); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeException(e); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = true; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeException(e); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = true; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.recycle(); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.recycle(); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class BinderProxy implements IBinder { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean pingBinder(); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean isBinderAlive(); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IInterface queryLocalInterface(String descriptor) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native String getInterfaceDescriptor() throws RemoteException; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean transact(int code, Parcel data, Parcel reply, 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) throws RemoteException; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void linkToDeath(DeathRecipient recipient, int flags) 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean unlinkToDeath(DeathRecipient recipient, int flags); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(FileDescriptor fd, String[] args) throws RemoteException { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 351eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick Parcel reply = Parcel.obtain(); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeFileDescriptor(fd); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeStringArray(args); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 355eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick transact(DUMP_TRANSACTION, data, reply, 0); 356eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick reply.readException(); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.recycle(); 359eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick reply.recycle(); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BinderProxy() { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSelf = new WeakReference(this); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project destroy(); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void destroy(); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final void sendDeathNotice(DeathRecipient recipient) { 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Config.LOGV) Log.v("JavaBinder", "sendDeathNotice to " + recipient); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project recipient.binderDied(); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (RuntimeException exc) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("BinderNative", "Uncaught exception from death notification", 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project exc); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final private WeakReference mSelf; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mObject; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 392