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.Log; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Modifier; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for a remotable object, the core part of a lightweight 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remote procedure call mechanism defined by {@link IBinder}. 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is an implementation of IBinder that provides 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the standard support creating a local implementation of such an object. 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Most developers will not implement this class directly, instead using the 3540eee61e25fb887f5267686f8a0a7c5bd9f95769Scott Main * <a href="{@docRoot}guide/components/aidl.html">aidl</a> tool to describe the desired 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface, having it generate the appropriate Binder subclass. You can, 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * however, derive directly from Binder to implement your own custom RPC 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protocol or simply instantiate a raw Binder object directly to use as a 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * token that can be shared across processes. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see IBinder 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Binder implements IBinder { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set this flag to true to detect anonymous, local or member classes 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that extend this Binder class and that are not static. These kind 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of classes can potentially create leaks. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean FIND_POTENTIAL_LEAKS = false; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "Binder"; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani /* mObject is used by native code, do not remove or rename */ 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 /** 6774ee8652e02fc94901177214fc9370659732c921Dianne Hackborn * Return the Linux uid 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(); 74742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 75742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani /** 7674ee8652e02fc94901177214fc9370659732c921Dianne Hackborn * Return the UserHandle assigned to the process that sent you the 7774ee8652e02fc94901177214fc9370659732c921Dianne Hackborn * current transaction that is being processed. This is the user 7874ee8652e02fc94901177214fc9370659732c921Dianne Hackborn * of the caller. It is distinct from {@link #getCallingUid()} in that a 7974ee8652e02fc94901177214fc9370659732c921Dianne Hackborn * particular user will have multiple distinct apps running under it each 8074ee8652e02fc94901177214fc9370659732c921Dianne Hackborn * with their own uid. If the current thread is not currently executing an 8174ee8652e02fc94901177214fc9370659732c921Dianne Hackborn * incoming transaction, then its own UserHandle is returned. 8274ee8652e02fc94901177214fc9370659732c921Dianne Hackborn */ 8374ee8652e02fc94901177214fc9370659732c921Dianne Hackborn public static final UserHandle getCallingUserHandle() { 8474ee8652e02fc94901177214fc9370659732c921Dianne Hackborn return new UserHandle(UserHandle.getUserId(getCallingUid())); 8574ee8652e02fc94901177214fc9370659732c921Dianne Hackborn } 8674ee8652e02fc94901177214fc9370659732c921Dianne Hackborn 8774ee8652e02fc94901177214fc9370659732c921Dianne Hackborn /** 88a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * Reset the identity of the incoming IPC on the current thread. This can 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be useful if, while handling an incoming call, you will be calling 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on interfaces of other objects that may be local to your process and 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to do permission checks on the calls coming into them (so they 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will check the permission of your own local process, and not whatever 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * process originally called you). 94a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns an opaque token that can be used to restore the 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * original calling identity by passing it to 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #restoreCallingIdentity(long)}. 98a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getCallingPid() 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getCallingUid() 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #restoreCallingIdentity(long) 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native long clearCallingIdentity(); 104a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 106a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * Restore the identity of the incoming IPC on the current thread 107a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * back to a previously identity that was returned by {@link 108a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * #clearCallingIdentity}. 109a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token The opaque token that was previously returned by 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #clearCallingIdentity}. 112a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #clearCallingIdentity 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native void restoreCallingIdentity(long token); 116727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 117727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick /** 118727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * Sets the native thread-local StrictMode policy mask. 119727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * 120727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * <p>The StrictMode settings are kept in two places: a Java-level 121727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * threadlocal for libcore/Dalvik, and a native threadlocal (set 122727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * here) for propagation via Binder calls. This is a little 123727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * unfortunate, but necessary to break otherwise more unfortunate 124727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * dependencies either of Dalvik on Android, or Android 125727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * native-only code on Dalvik. 126727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * 127727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * @see StrictMode 128727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * @hide 129727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick */ 130727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick public static final native void setThreadStrictModePolicy(int policyMask); 131727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 132727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick /** 133727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * Gets the current native thread-local StrictMode policy mask. 134727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * 135727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * @see #setThreadStrictModePolicy 136727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * @hide 137727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick */ 138727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick public static final native int getThreadStrictModePolicy(); 139727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flush any Binder commands pending in the current thread to the kernel 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * driver. This can be 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * useful to call before performing an operation that may block for a long 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time, to ensure that any pending object references have been released 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in order to prevent the process from holding on to objects longer than 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it needs to. 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native void flushPendingCommands(); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add the calling thread to the IPC thread pool. This function does 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not return until the current process is exiting. 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native void joinThreadPool(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default constructor initializes the object. 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Binder() { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FIND_POTENTIAL_LEAKS) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Class<? extends Binder> klass = getClass(); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (klass.getModifiers() & Modifier.STATIC) == 0) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "The following Binder class should be static or leaks might occur: " + 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project klass.getCanonicalName()); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convenience method for associating a specific interface with the Binder. 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * After calling, queryLocalInterface() will be implemented for you 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to return the given owner IInterface when the corresponding 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * descriptor is requested. 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void attachInterface(IInterface owner, String descriptor) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwner = owner; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDescriptor = descriptor; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default implementation returns an empty interface name. 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getInterfaceDescriptor() { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDescriptor; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default implementation always returns true -- if you got here, 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the object is alive. 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean pingBinder() { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that if you're calling on a local binder, this always returns true 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * because your process is alive if you're calling it. 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isBinderAlive() { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use information supplied to attachInterface() to return the 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * associated IInterface if it matches the requested 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * descriptor. 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IInterface queryLocalInterface(String descriptor) { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDescriptor.equals(descriptor)) { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOwner; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default implementation is a stub that returns false. You will want 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to override this to do the appropriate unmarshalling of transactions. 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If you want to call this, call transact(). 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onTransact(int code, Parcel data, Parcel reply, 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) throws RemoteException { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == INTERFACE_TRANSACTION) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeString(getInterfaceDescriptor()); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (code == DUMP_TRANSACTION) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ParcelFileDescriptor fd = data.readFileDescriptor(); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] args = data.readStringArray(); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd != null) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dump(fd.getFileDescriptor(), args); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fd.close(); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 241eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick // swallowed, not propagated back to the caller 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 245eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick // Write the StrictMode header. 246eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick if (reply != null) { 247eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick reply.writeNoException(); 248eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick } else { 249eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick StrictMode.clearGatheredViolations(); 250eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implemented to call the more convenient version 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #dump(FileDescriptor, PrintWriter, String[])}. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(FileDescriptor fd, String[] args) { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fout = new FileOutputStream(fd); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PrintWriter pw = new PrintWriter(fout); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dump(fd, pw, args); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.flush(); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 271e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn * Like {@link #dump(FileDescriptor, String[])}, but ensures the target 272e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn * executes asynchronously. 273e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn */ 274e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn public void dumpAsync(final FileDescriptor fd, final String[] args) { 275e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn final FileOutputStream fout = new FileOutputStream(fd); 276e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn final PrintWriter pw = new PrintWriter(fout); 277e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn Thread thr = new Thread("Binder.dumpAsync") { 278e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn public void run() { 279e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn try { 280e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn dump(fd, pw, args); 281e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } finally { 282e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn pw.flush(); 283e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 284e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 285e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn }; 286e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn thr.start(); 287e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 288e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn 289e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn /** 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Print the object's state into the given stream. 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fd The raw file descriptor that the dump is being sent to. 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fout The file to which you should dump your state. This will be 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * closed for you after you return. 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args additional arguments to the dump request. 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default implementation rewinds the parcels and calls onTransact. On 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the remote side, transact calls into the binder to do the IPC. 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean transact(int code, Parcel data, Parcel reply, 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) throws RemoteException { 30643a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) Log.v("Binder", "Transact: " + code + " to " + this); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data != null) { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.setDataPosition(0); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean r = onTransact(code, data, reply, flags); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reply != null) { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.setDataPosition(0); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Local implementation is a no-op. 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void linkToDeath(DeathRecipient recipient, int flags) { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Local implementation is a no-op. 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean unlinkToDeath(DeathRecipient recipient, int flags) { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project destroy(); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void init(); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void destroy(); 3405b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick 3415b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // Entry point from android_util_Binder.cpp's onTransact 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean execTransact(int code, int dataObj, int replyObj, 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(dataObj); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = Parcel.obtain(replyObj); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // theoretically, we should call transact, which will call onTransact, 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // but all that does is rewind it, and we just got these from an IPC, 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so we'll just call it directly. 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean res; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = onTransact(code, data, reply, flags); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3537f97e65add29b3887755e998804b013168f773b1Jeff Sharkey reply.setDataPosition(0); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeException(e); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = true; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 3577f97e65add29b3887755e998804b013168f773b1Jeff Sharkey reply.setDataPosition(0); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeException(e); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = true; 36019f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson } catch (OutOfMemoryError e) { 36119f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson RuntimeException re = new RuntimeException("Out of memory", e); 3627f97e65add29b3887755e998804b013168f773b1Jeff Sharkey reply.setDataPosition(0); 36319f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson reply.writeException(re); 36419f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson res = true; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.recycle(); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.recycle(); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class BinderProxy implements IBinder { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean pingBinder(); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean isBinderAlive(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IInterface queryLocalInterface(String descriptor) { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native String getInterfaceDescriptor() throws RemoteException; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean transact(int code, Parcel data, Parcel reply, 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) throws RemoteException; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void linkToDeath(DeathRecipient recipient, int flags) 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean unlinkToDeath(DeathRecipient recipient, int flags); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(FileDescriptor fd, String[] args) throws RemoteException { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 389eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick Parcel reply = Parcel.obtain(); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeFileDescriptor(fd); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeStringArray(args); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 393eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick transact(DUMP_TRANSACTION, data, reply, 0); 394eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick reply.readException(); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.recycle(); 397eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick reply.recycle(); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 401e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException { 402e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn Parcel data = Parcel.obtain(); 403e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn Parcel reply = Parcel.obtain(); 404e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn data.writeFileDescriptor(fd); 405e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn data.writeStringArray(args); 406e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn try { 407e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn transact(DUMP_TRANSACTION, data, reply, FLAG_ONEWAY); 408e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn reply.readException(); 409e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } finally { 410e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn data.recycle(); 411e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn reply.recycle(); 412e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 413e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 414e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BinderProxy() { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSelf = new WeakReference(this); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project destroy(); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void destroy(); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final void sendDeathNotice(DeathRecipient recipient) { 43143a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) Log.v("JavaBinder", "sendDeathNotice to " + recipient); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project recipient.binderDied(); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (RuntimeException exc) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("BinderNative", "Uncaught exception from death notification", 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project exc); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final private WeakReference mSelf; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mObject; 443bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate private int mOrgue; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 445