FileDocCategorySizeDatePackage
Binder.javaAPI DocAndroid 5.1 API20535Thu Mar 12 22:22:10 GMT 2015android.os

Binder

public class Binder extends Object implements IBinder
Base class for a remotable object, the core part of a lightweight remote procedure call mechanism defined by {@link IBinder}. This class is an implementation of IBinder that provides standard local implementation of such an object.

Most developers will not implement this class directly, instead using the aidl tool to describe the desired interface, having it generate the appropriate Binder subclass. You can, however, derive directly from Binder to implement your own custom RPC protocol or simply instantiate a raw Binder object directly to use as a token that can be shared across processes.

This class is just a basic IPC primitive; it has no impact on an application's lifecycle, and is valid only as long as the process that created it continues to run. To use this correctly, you must be doing so within the context of a top-level application component (a {@link android.app.Service}, {@link android.app.Activity}, or {@link android.content.ContentProvider}) that lets the system know your process should remain running.

You must keep in mind the situations in which your process could go away, and thus require that you later re-create a new Binder and re-attach it when the process starts again. For example, if you are using this within an {@link android.app.Activity}, your activity's process may be killed any time the activity is not started; if the activity is later re-created you will need to create a new Binder and hand it back to the correct place again; you need to be aware that your process may be started for another reason (for example to receive a broadcast) that will not involve re-creating the activity and thus run its code to create a new Binder.

see
IBinder

Fields Summary
private static final boolean
FIND_POTENTIAL_LEAKS
private static final boolean
CHECK_PARCEL_SIZE
static final String
TAG
private static String
sDumpDisabled
Control whether dump() calls are allowed.
private long
mObject
private IInterface
mOwner
private String
mDescriptor
Constructors Summary
public Binder()
Default constructor initializes the object.

        init();

        if (FIND_POTENTIAL_LEAKS) {
            final Class<? extends Binder> klass = getClass();
            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
                    (klass.getModifiers() & Modifier.STATIC) == 0) {
                Log.w(TAG, "The following Binder class should be static or leaks might occur: " +
                    klass.getCanonicalName());
            }
        }
    
Methods Summary
public voidattachInterface(IInterface owner, java.lang.String descriptor)
Convenience method for associating a specific interface with the Binder. After calling, queryLocalInterface() will be implemented for you to return the given owner IInterface when the corresponding descriptor is requested.

        mOwner = owner;
        mDescriptor = descriptor;
    
static voidcheckParcel(IBinder obj, int code, Parcel parcel, java.lang.String msg)

        if (CHECK_PARCEL_SIZE && parcel.dataSize() >= 800*1024) {
            // Trying to send > 800k, this is way too much
            StringBuilder sb = new StringBuilder();
            sb.append(msg);
            sb.append(": on ");
            sb.append(obj);
            sb.append(" calling ");
            sb.append(code);
            sb.append(" size ");
            sb.append(parcel.dataSize());
            sb.append(" (data: ");
            parcel.setDataPosition(0);
            sb.append(parcel.readInt());
            sb.append(", ");
            sb.append(parcel.readInt());
            sb.append(", ");
            sb.append(parcel.readInt());
            sb.append(")");
            Slog.wtfStack(TAG, sb.toString());
        }
    
public static final native longclearCallingIdentity()
Reset the identity of the incoming IPC on the current thread. This can be useful if, while handling an incoming call, you will be calling on interfaces of other objects that may be local to your process and need to do permission checks on the calls coming into them (so they will check the permission of your own local process, and not whatever process originally called you).

return
Returns an opaque token that can be used to restore the original calling identity by passing it to {@link #restoreCallingIdentity(long)}.
see
#getCallingPid()
see
#getCallingUid()
see
#restoreCallingIdentity(long)

private final native voiddestroy()

public voiddump(java.io.FileDescriptor fd, java.lang.String[] args)
Implemented to call the more convenient version {@link #dump(FileDescriptor, PrintWriter, String[])}.

        FileOutputStream fout = new FileOutputStream(fd);
        PrintWriter pw = new FastPrintWriter(fout);
        try {
            final String disabled;
            synchronized (Binder.class) {
                disabled = sDumpDisabled;
            }
            if (disabled == null) {
                try {
                    dump(fd, pw, args);
                } catch (SecurityException e) {
                    pw.println("Security exception: " + e.getMessage());
                    throw e;
                } catch (Throwable e) {
                    // Unlike usual calls, in this case if an exception gets thrown
                    // back to us we want to print it back in to the dump data, since
                    // that is where the caller expects all interesting information to
                    // go.
                    pw.println();
                    pw.println("Exception occurred while dumping:");
                    e.printStackTrace(pw);
                }
            } else {
                pw.println(sDumpDisabled);
            }
        } finally {
            pw.flush();
        }
    
protected voiddump(java.io.FileDescriptor fd, java.io.PrintWriter fout, java.lang.String[] args)
Print the object's state into the given stream.

param
fd The raw file descriptor that the dump is being sent to.
param
fout The file to which you should dump your state. This will be closed for you after you return.
param
args additional arguments to the dump request.

    
public voiddumpAsync(java.io.FileDescriptor fd, java.lang.String[] args)
Like {@link #dump(FileDescriptor, String[])}, but ensures the target executes asynchronously.

        final FileOutputStream fout = new FileOutputStream(fd);
        final PrintWriter pw = new FastPrintWriter(fout);
        Thread thr = new Thread("Binder.dumpAsync") {
            public void run() {
                try {
                    dump(fd, pw, args);
                } finally {
                    pw.flush();
                }
            }
        };
        thr.start();
    
private booleanexecTransact(int code, long dataObj, long replyObj, int flags)

        Parcel data = Parcel.obtain(dataObj);
        Parcel reply = Parcel.obtain(replyObj);
        // theoretically, we should call transact, which will call onTransact,
        // but all that does is rewind it, and we just got these from an IPC,
        // so we'll just call it directly.
        boolean res;
        // Log any exceptions as warnings, don't silently suppress them.
        // If the call was FLAG_ONEWAY then these exceptions disappear into the ether.
        try {
            res = onTransact(code, data, reply, flags);
        } catch (RemoteException e) {
            if ((flags & FLAG_ONEWAY) != 0) {
                Log.w(TAG, "Binder call failed.", e);
            } else {
                reply.setDataPosition(0);
                reply.writeException(e);
            }
            res = true;
        } catch (RuntimeException e) {
            if ((flags & FLAG_ONEWAY) != 0) {
                Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e);
            } else {
                reply.setDataPosition(0);
                reply.writeException(e);
            }
            res = true;
        } catch (OutOfMemoryError e) {
            // Unconditionally log this, since this is generally unrecoverable.
            Log.e(TAG, "Caught an OutOfMemoryError from the binder stub implementation.", e);
            RuntimeException re = new RuntimeException("Out of memory", e);
            reply.setDataPosition(0);
            reply.writeException(re);
            res = true;
        }
        checkParcel(this, code, reply, "Unreasonably large binder reply buffer");
        reply.recycle();
        data.recycle();

        // Just in case -- we are done with the IPC, so there should be no more strict
        // mode violations that have gathered for this thread.  Either they have been
        // parceled and are now in transport off to the caller, or we are returning back
        // to the main transaction loop to wait for another incoming transaction.  Either
        // way, strict mode begone!
        StrictMode.clearGatheredViolations();

        return res;
    
protected voidfinalize()

        try {
            destroy();
        } finally {
            super.finalize();
        }
    
public static final native voidflushPendingCommands()
Flush any Binder commands pending in the current thread to the kernel driver. This can be useful to call before performing an operation that may block for a long time, to ensure that any pending object references have been released in order to prevent the process from holding on to objects longer than it needs to.

public static final native intgetCallingPid()
Return the ID of the process that sent you the current transaction that is being processed. This pid can be used with higher-level system services to determine its identity and check permissions. If the current thread is not currently executing an incoming transaction, then its own pid is returned.

public static final native intgetCallingUid()
Return the Linux uid assigned to the process that sent you the current transaction that is being processed. This uid can be used with higher-level system services to determine its identity and check permissions. If the current thread is not currently executing an incoming transaction, then its own uid is returned.

public static final UserHandlegetCallingUserHandle()
Return the UserHandle assigned to the process that sent you the current transaction that is being processed. This is the user of the caller. It is distinct from {@link #getCallingUid()} in that a particular user will have multiple distinct apps running under it each with their own uid. If the current thread is not currently executing an incoming transaction, then its own UserHandle is returned.

    
                                                           
         
    
                                                              
         

                                                                             
         
        return new UserHandle(UserHandle.getUserId(getCallingUid()));
    
public java.lang.StringgetInterfaceDescriptor()
Default implementation returns an empty interface name.

        return mDescriptor;
    
public static final native intgetThreadStrictModePolicy()
Gets the current native thread-local StrictMode policy mask.

see
#setThreadStrictModePolicy
hide

private final native voidinit()

public booleanisBinderAlive()
{@inheritDoc} Note that if you're calling on a local binder, this always returns true because your process is alive if you're calling it.

        return true;
    
public static final booleanisProxy(IInterface iface)
Returns true if the specified interface is a proxy.

hide

        return iface.asBinder() != iface;
    
public static final native voidjoinThreadPool()
Add the calling thread to the IPC thread pool. This function does not return until the current process is exiting.

public voidlinkToDeath(DeathRecipient recipient, int flags)
Local implementation is a no-op.

    
protected booleanonTransact(int code, Parcel data, Parcel reply, int flags)
Default implementation is a stub that returns false. You will want to override this to do the appropriate unmarshalling of transactions.

If you want to call this, call transact().

        if (code == INTERFACE_TRANSACTION) {
            reply.writeString(getInterfaceDescriptor());
            return true;
        } else if (code == DUMP_TRANSACTION) {
            ParcelFileDescriptor fd = data.readFileDescriptor();
            String[] args = data.readStringArray();
            if (fd != null) {
                try {
                    dump(fd.getFileDescriptor(), args);
                } finally {
                    try {
                        fd.close();
                    } catch (IOException e) {
                        // swallowed, not propagated back to the caller
                    }
                }
            }
            // Write the StrictMode header.
            if (reply != null) {
                reply.writeNoException();
            } else {
                StrictMode.clearGatheredViolations();
            }
            return true;
        }
        return false;
    
public booleanpingBinder()
Default implementation always returns true -- if you got here, the object is alive.

        return true;
    
public IInterfacequeryLocalInterface(java.lang.String descriptor)
Use information supplied to attachInterface() to return the associated IInterface if it matches the requested descriptor.

        if (mDescriptor.equals(descriptor)) {
            return mOwner;
        }
        return null;
    
public static final native voidrestoreCallingIdentity(long token)
Restore the identity of the incoming IPC on the current thread back to a previously identity that was returned by {@link #clearCallingIdentity}.

param
token The opaque token that was previously returned by {@link #clearCallingIdentity}.
see
#clearCallingIdentity

public static voidsetDumpDisabled(java.lang.String msg)
Control disabling of dump calls in this process. This is used by the system process watchdog to disable incoming dump calls while it has detecting the system is hung and is reporting that back to the activity controller. This is to prevent the controller from getting hung up on bug reports at this point.

hide
param
msg The message to show instead of the dump; if null, dumps are re-enabled.

        synchronized (Binder.class) {
            sDumpDisabled = msg;
        }
    
public static final native voidsetThreadStrictModePolicy(int policyMask)
Sets the native thread-local StrictMode policy mask.

The StrictMode settings are kept in two places: a Java-level threadlocal for libcore/Dalvik, and a native threadlocal (set here) for propagation via Binder calls. This is a little unfortunate, but necessary to break otherwise more unfortunate dependencies either of Dalvik on Android, or Android native-only code on Dalvik.

see
StrictMode
hide

public final booleantransact(int code, Parcel data, Parcel reply, int flags)
Default implementation rewinds the parcels and calls onTransact. On the remote side, transact calls into the binder to do the IPC.

        if (false) Log.v("Binder", "Transact: " + code + " to " + this);
        if (data != null) {
            data.setDataPosition(0);
        }
        boolean r = onTransact(code, data, reply, flags);
        if (reply != null) {
            reply.setDataPosition(0);
        }
        return r;
    
public booleanunlinkToDeath(DeathRecipient recipient, int flags)
Local implementation is a no-op.

        return true;