• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.os;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.annotation.SystemApi;
22 import android.annotation.UnsupportedAppUsage;
23 import android.util.ExceptionUtils;
24 import android.util.Log;
25 import android.util.Slog;
26 
27 import com.android.internal.os.BinderInternal;
28 import com.android.internal.os.BinderInternal.CallSession;
29 import com.android.internal.util.FastPrintWriter;
30 import com.android.internal.util.FunctionalUtils.ThrowingRunnable;
31 import com.android.internal.util.FunctionalUtils.ThrowingSupplier;
32 
33 import dalvik.annotation.optimization.CriticalNative;
34 
35 import libcore.io.IoUtils;
36 import libcore.util.NativeAllocationRegistry;
37 
38 import java.io.FileDescriptor;
39 import java.io.FileOutputStream;
40 import java.io.PrintWriter;
41 import java.lang.reflect.Modifier;
42 
43 /**
44  * Base class for a remotable object, the core part of a lightweight
45  * remote procedure call mechanism defined by {@link IBinder}.
46  * This class is an implementation of IBinder that provides
47  * standard local implementation of such an object.
48  *
49  * <p>Most developers will not implement this class directly, instead using the
50  * <a href="{@docRoot}guide/components/aidl.html">aidl</a> tool to describe the desired
51  * interface, having it generate the appropriate Binder subclass.  You can,
52  * however, derive directly from Binder to implement your own custom RPC
53  * protocol or simply instantiate a raw Binder object directly to use as a
54  * token that can be shared across processes.
55  *
56  * <p>This class is just a basic IPC primitive; it has no impact on an application's
57  * lifecycle, and is valid only as long as the process that created it continues to run.
58  * To use this correctly, you must be doing so within the context of a top-level
59  * application component (a {@link android.app.Service}, {@link android.app.Activity},
60  * or {@link android.content.ContentProvider}) that lets the system know your process
61  * should remain running.</p>
62  *
63  * <p>You must keep in mind the situations in which your process
64  * could go away, and thus require that you later re-create a new Binder and re-attach
65  * it when the process starts again.  For example, if you are using this within an
66  * {@link android.app.Activity}, your activity's process may be killed any time the
67  * activity is not started; if the activity is later re-created you will need to
68  * create a new Binder and hand it back to the correct place again; you need to be
69  * aware that your process may be started for another reason (for example to receive
70  * a broadcast) that will not involve re-creating the activity and thus run its code
71  * to create a new Binder.</p>
72  *
73  * @see IBinder
74  */
75 public class Binder implements IBinder {
76     /*
77      * Set this flag to true to detect anonymous, local or member classes
78      * that extend this Binder class and that are not static. These kind
79      * of classes can potentially create leaks.
80      */
81     private static final boolean FIND_POTENTIAL_LEAKS = false;
82     /** @hide */
83     public static final boolean CHECK_PARCEL_SIZE = false;
84     static final String TAG = "Binder";
85 
86     /** @hide */
87     public static boolean LOG_RUNTIME_EXCEPTION = false; // DO NOT SUBMIT WITH TRUE
88 
89     /**
90      * Value to represents that a calling work source is not set.
91      *
92      * This constatnt needs to be kept in sync with IPCThreadState::kUnsetWorkSource.
93      *
94      * @hide
95      */
96     public static final int UNSET_WORKSOURCE = -1;
97 
98     /**
99      * Control whether dump() calls are allowed.
100      */
101     private static volatile String sDumpDisabled = null;
102 
103     /**
104      * Global transaction tracker instance for this process.
105      */
106     private static volatile TransactionTracker sTransactionTracker = null;
107 
108     /**
109      * Global observer for this process.
110      */
111     private static BinderInternal.Observer sObserver = null;
112 
113     /**
114      * Guestimate of native memory associated with a Binder.
115      */
116     private static final int NATIVE_ALLOCATION_SIZE = 500;
117 
getNativeFinalizer()118     private static native long getNativeFinalizer();
119 
120     // Use a Holder to allow static initialization of Binder in the boot image, and
121     // possibly to avoid some initialization ordering issues.
122     private static class NoImagePreloadHolder {
123         public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry(
124                 Binder.class.getClassLoader(), getNativeFinalizer(), NATIVE_ALLOCATION_SIZE);
125     }
126 
127 
128     // Transaction tracking code.
129 
130     /**
131      * Flag indicating whether we should be tracing transact calls.
132      */
133     private static volatile boolean sTracingEnabled = false;
134 
135     /**
136      * Enable Binder IPC tracing.
137      *
138      * @hide
139      */
enableTracing()140     public static void enableTracing() {
141         sTracingEnabled = true;
142     }
143 
144     /**
145      * Disable Binder IPC tracing.
146      *
147      * @hide
148      */
disableTracing()149     public static void disableTracing() {
150         sTracingEnabled = false;
151     }
152 
153     /**
154      * Check if binder transaction tracing is enabled.
155      *
156      * @hide
157      */
isTracingEnabled()158     public static boolean isTracingEnabled() {
159         return sTracingEnabled;
160     }
161 
162     /**
163      * Get the binder transaction tracker for this process.
164      *
165      * @hide
166      */
getTransactionTracker()167     public synchronized static TransactionTracker getTransactionTracker() {
168         if (sTransactionTracker == null)
169             sTransactionTracker = new TransactionTracker();
170         return sTransactionTracker;
171     }
172 
173     /**
174      * Get the binder transaction observer for this process.
175      *
176      * @hide
177      */
setObserver(@ullable BinderInternal.Observer observer)178     public static void setObserver(@Nullable BinderInternal.Observer observer) {
179         sObserver = observer;
180     }
181 
182     /** {@hide} */
183     static volatile boolean sWarnOnBlocking = false;
184 
185     /**
186      * Warn if any blocking binder transactions are made out from this process.
187      * This is typically only useful for the system process, to prevent it from
188      * blocking on calls to external untrusted code. Instead, all outgoing calls
189      * that require a result must be sent as {@link IBinder#FLAG_ONEWAY} calls
190      * which deliver results through a callback interface.
191      *
192      * @hide
193      */
setWarnOnBlocking(boolean warnOnBlocking)194     public static void setWarnOnBlocking(boolean warnOnBlocking) {
195         sWarnOnBlocking = warnOnBlocking;
196     }
197 
198     /**
199      * Allow blocking calls on the given interface, overriding the requested
200      * value of {@link #setWarnOnBlocking(boolean)}.
201      * <p>
202      * This should only be rarely called when you are <em>absolutely sure</em>
203      * the remote interface is a built-in system component that can never be
204      * upgraded. In particular, this <em>must never</em> be called for
205      * interfaces hosted by package that could be upgraded or replaced,
206      * otherwise you risk system instability if that remote interface wedges.
207      *
208      * @hide
209      */
allowBlocking(IBinder binder)210     public static IBinder allowBlocking(IBinder binder) {
211         try {
212             if (binder instanceof BinderProxy) {
213                 ((BinderProxy) binder).mWarnOnBlocking = false;
214             } else if (binder != null && binder.getInterfaceDescriptor() != null
215                     && binder.queryLocalInterface(binder.getInterfaceDescriptor()) == null) {
216                 Log.w(TAG, "Unable to allow blocking on interface " + binder);
217             }
218         } catch (RemoteException ignored) {
219         }
220         return binder;
221     }
222 
223     /**
224      * Reset the given interface back to the default blocking behavior,
225      * reverting any changes made by {@link #allowBlocking(IBinder)}.
226      *
227      * @hide
228      */
defaultBlocking(IBinder binder)229     public static IBinder defaultBlocking(IBinder binder) {
230         if (binder instanceof BinderProxy) {
231             ((BinderProxy) binder).mWarnOnBlocking = sWarnOnBlocking;
232         }
233         return binder;
234     }
235 
236     /**
237      * Inherit the current {@link #allowBlocking(IBinder)} value from one given
238      * interface to another.
239      *
240      * @hide
241      */
copyAllowBlocking(IBinder fromBinder, IBinder toBinder)242     public static void copyAllowBlocking(IBinder fromBinder, IBinder toBinder) {
243         if (fromBinder instanceof BinderProxy && toBinder instanceof BinderProxy) {
244             ((BinderProxy) toBinder).mWarnOnBlocking = ((BinderProxy) fromBinder).mWarnOnBlocking;
245         }
246     }
247 
248     /**
249      * Raw native pointer to JavaBBinderHolder object. Owned by this Java object. Not null.
250      */
251     @UnsupportedAppUsage
252     private final long mObject;
253 
254     private IInterface mOwner;
255     private String mDescriptor;
256 
257     /**
258      * Return the ID of the process that sent you the current transaction
259      * that is being processed.  This pid can be used with higher-level
260      * system services to determine its identity and check permissions.
261      * If the current thread is not currently executing an incoming transaction,
262      * then its own pid is returned.
263      */
264     @CriticalNative
getCallingPid()265     public static final native int getCallingPid();
266 
267     /**
268      * Return the Linux uid assigned to the process that sent you the
269      * current transaction that is being processed.  This uid can be used with
270      * higher-level system services to determine its identity and check
271      * permissions.  If the current thread is not currently executing an
272      * incoming transaction, then its own uid is returned.
273      */
274     @CriticalNative
getCallingUid()275     public static final native int getCallingUid();
276 
277     /**
278      * Returns {@code true} if the current thread is currently executing an
279      * incoming transaction.
280      *
281      * @hide
282      */
283     @CriticalNative
isHandlingTransaction()284     public static final native boolean isHandlingTransaction();
285 
286     /**
287      * Return the Linux uid assigned to the process that sent the transaction
288      * currently being processed.
289      *
290      * @throws IllegalStateException if the current thread is not currently
291      *        executing an incoming transaction.
292      */
getCallingUidOrThrow()293     public static final int getCallingUidOrThrow() {
294         if (!isHandlingTransaction()) {
295             throw new IllegalStateException(
296                   "Thread is not in a binder transcation");
297         }
298         return getCallingUid();
299     }
300 
301     /**
302      * Return the UserHandle assigned to the process that sent you the
303      * current transaction that is being processed.  This is the user
304      * of the caller.  It is distinct from {@link #getCallingUid()} in that a
305      * particular user will have multiple distinct apps running under it each
306      * with their own uid.  If the current thread is not currently executing an
307      * incoming transaction, then its own UserHandle is returned.
308      */
getCallingUserHandle()309     public static final @NonNull UserHandle getCallingUserHandle() {
310         return UserHandle.of(UserHandle.getUserId(getCallingUid()));
311     }
312 
313     /**
314      * Reset the identity of the incoming IPC on the current thread.  This can
315      * be useful if, while handling an incoming call, you will be calling
316      * on interfaces of other objects that may be local to your process and
317      * need to do permission checks on the calls coming into them (so they
318      * will check the permission of your own local process, and not whatever
319      * process originally called you).
320      *
321      * @return Returns an opaque token that can be used to restore the
322      * original calling identity by passing it to
323      * {@link #restoreCallingIdentity(long)}.
324      *
325      * @see #getCallingPid()
326      * @see #getCallingUid()
327      * @see #restoreCallingIdentity(long)
328      */
329     @CriticalNative
clearCallingIdentity()330     public static final native long clearCallingIdentity();
331 
332     /**
333      * Restore the identity of the incoming IPC on the current thread
334      * back to a previously identity that was returned by {@link
335      * #clearCallingIdentity}.
336      *
337      * @param token The opaque token that was previously returned by
338      * {@link #clearCallingIdentity}.
339      *
340      * @see #clearCallingIdentity
341      */
restoreCallingIdentity(long token)342     public static final native void restoreCallingIdentity(long token);
343 
344     /**
345      * Convenience method for running the provided action enclosed in
346      * {@link #clearCallingIdentity}/{@link #restoreCallingIdentity}
347      *
348      * Any exception thrown by the given action will be caught and rethrown after the call to
349      * {@link #restoreCallingIdentity}
350      *
351      * @hide
352      */
withCleanCallingIdentity(@onNull ThrowingRunnable action)353     public static final void withCleanCallingIdentity(@NonNull ThrowingRunnable action) {
354         long callingIdentity = clearCallingIdentity();
355         Throwable throwableToPropagate = null;
356         try {
357             action.runOrThrow();
358         } catch (Throwable throwable) {
359             throwableToPropagate = throwable;
360         } finally {
361             restoreCallingIdentity(callingIdentity);
362             if (throwableToPropagate != null) {
363                 throw ExceptionUtils.propagate(throwableToPropagate);
364             }
365         }
366     }
367 
368     /**
369      * Convenience method for running the provided action enclosed in
370      * {@link #clearCallingIdentity}/{@link #restoreCallingIdentity} returning the result
371      *
372      * Any exception thrown by the given action will be caught and rethrown after the call to
373      * {@link #restoreCallingIdentity}
374      *
375      * @hide
376      */
withCleanCallingIdentity(@onNull ThrowingSupplier<T> action)377     public static final <T> T withCleanCallingIdentity(@NonNull ThrowingSupplier<T> action) {
378         long callingIdentity = clearCallingIdentity();
379         Throwable throwableToPropagate = null;
380         try {
381             return action.getOrThrow();
382         } catch (Throwable throwable) {
383             throwableToPropagate = throwable;
384             return null; // overridden by throwing in finally block
385         } finally {
386             restoreCallingIdentity(callingIdentity);
387             if (throwableToPropagate != null) {
388                 throw ExceptionUtils.propagate(throwableToPropagate);
389             }
390         }
391     }
392 
393     /**
394      * Sets the native thread-local StrictMode policy mask.
395      *
396      * <p>The StrictMode settings are kept in two places: a Java-level
397      * threadlocal for libcore/Dalvik, and a native threadlocal (set
398      * here) for propagation via Binder calls.  This is a little
399      * unfortunate, but necessary to break otherwise more unfortunate
400      * dependencies either of Dalvik on Android, or Android
401      * native-only code on Dalvik.
402      *
403      * @see StrictMode
404      * @hide
405      */
406     @CriticalNative
setThreadStrictModePolicy(int policyMask)407     public static final native void setThreadStrictModePolicy(int policyMask);
408 
409     /**
410      * Gets the current native thread-local StrictMode policy mask.
411      *
412      * @see #setThreadStrictModePolicy
413      * @hide
414      */
415     @CriticalNative
getThreadStrictModePolicy()416     public static final native int getThreadStrictModePolicy();
417 
418     /**
419      * Sets the work source for this thread.
420      *
421      * <p>All the following binder calls on this thread will use the provided work source. If this
422      * is called during an on-going binder transaction, all the following binder calls will use the
423      * work source until the end of the transaction.
424      *
425      * <p>The concept of worksource is similar to {@link WorkSource}. However, for performance
426      * reasons, we only support one UID. This UID represents the original user responsible for the
427      * binder calls.
428      *
429      * <p>{@link Binder#restoreCallingWorkSource(long)} must always be called after setting the
430      * worksource.
431      *
432      * <p>A typical use case would be
433      * <pre>
434      * long token = Binder.setCallingWorkSourceUid(uid);
435      * try {
436      *   // Call an API.
437      * } finally {
438      *   Binder.restoreCallingWorkSource(token);
439      * }
440      * </pre>
441      *
442      * <p>The work source will be propagated for future outgoing binder transactions
443      * executed on this thread.
444      *
445      * @param workSource The original UID responsible for the binder call.
446      * @return token to restore original work source.
447      **/
448     @CriticalNative
setCallingWorkSourceUid(int workSource)449     public static final native long setCallingWorkSourceUid(int workSource);
450 
451     /**
452      * Returns the work source set by the caller.
453      *
454      * Unlike {@link Binder#getCallingUid()}, this result of this method cannot be trusted. The
455      * caller can set the value to whatever they want. Only use this value if you trust the calling
456      * uid.
457      *
458      * @return The original UID responsible for the binder transaction.
459      */
460     @CriticalNative
getCallingWorkSourceUid()461     public static final native int getCallingWorkSourceUid();
462 
463     /**
464      * Clears the work source on this thread.
465      *
466      * <p>The work source will be propagated for future outgoing binder transactions
467      * executed on this thread.
468      *
469      * <p>{@link Binder#restoreCallingWorkSource(long)} must always be called after clearing the
470      * worksource.
471      *
472      * <p>A typical use case would be
473      * <pre>
474      * long token = Binder.clearCallingWorkSource();
475      * try {
476      *   // Call an API.
477      * } finally {
478      *   Binder.restoreCallingWorkSource(token);
479      * }
480      * </pre>
481      *
482      * @return token to restore original work source.
483      **/
484     @CriticalNative
clearCallingWorkSource()485     public static final native long clearCallingWorkSource();
486 
487     /**
488      * Restores the work source on this thread using a token returned by
489      * {@link #setCallingWorkSourceUid(int) or {@link clearCallingWorkSource()}.
490      *
491      * <p>A typical use case would be
492      * <pre>
493      * long token = Binder.setCallingWorkSourceUid(uid);
494      * try {
495      *   // Call an API.
496      * } finally {
497      *   Binder.restoreCallingWorkSource(token);
498      * }
499      * </pre>
500      **/
501     @CriticalNative
restoreCallingWorkSource(long token)502     public static final native void restoreCallingWorkSource(long token);
503 
504     /**
505      * Flush any Binder commands pending in the current thread to the kernel
506      * driver.  This can be
507      * useful to call before performing an operation that may block for a long
508      * time, to ensure that any pending object references have been released
509      * in order to prevent the process from holding on to objects longer than
510      * it needs to.
511      */
flushPendingCommands()512     public static final native void flushPendingCommands();
513 
514     /**
515      * Add the calling thread to the IPC thread pool.  This function does
516      * not return until the current process is exiting.
517      */
joinThreadPool()518     public static final void joinThreadPool() {
519         BinderInternal.joinThreadPool();
520     }
521 
522     /**
523      * Returns true if the specified interface is a proxy.
524      * @hide
525      */
isProxy(IInterface iface)526     public static final boolean isProxy(IInterface iface) {
527         return iface.asBinder() != iface;
528     }
529 
530     /**
531      * Call blocks until the number of executing binder threads is less
532      * than the maximum number of binder threads allowed for this process.
533      * @hide
534      */
blockUntilThreadAvailable()535     public static final native void blockUntilThreadAvailable();
536 
537     /**
538      * Default constructor just initializes the object.
539      *
540      * If you're creating a Binder token (a Binder object without an attached interface),
541      * you should use {@link #Binder(String)} instead.
542      */
Binder()543     public Binder() {
544         this(null);
545     }
546 
547     /**
548      * Constructor for creating a raw Binder object (token) along with a descriptor.
549      *
550      * The descriptor of binder objects usually specifies the interface they are implementing.
551      * In case of binder tokens, no interface is implemented, and the descriptor can be used
552      * as a sort of tag to help identify the binder token. This will help identify remote
553      * references to these objects more easily when debugging.
554      *
555      * @param descriptor Used to identify the creator of this token, for example the class name.
556      * Instead of creating multiple tokens with the same descriptor, consider adding a suffix to
557      * help identify them.
558      */
Binder(@ullable String descriptor)559     public Binder(@Nullable String descriptor)  {
560         mObject = getNativeBBinderHolder();
561         NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, mObject);
562 
563         if (FIND_POTENTIAL_LEAKS) {
564             final Class<? extends Binder> klass = getClass();
565             if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
566                     (klass.getModifiers() & Modifier.STATIC) == 0) {
567                 Log.w(TAG, "The following Binder class should be static or leaks might occur: " +
568                     klass.getCanonicalName());
569             }
570         }
571         mDescriptor = descriptor;
572     }
573 
574     /**
575      * Convenience method for associating a specific interface with the Binder.
576      * After calling, queryLocalInterface() will be implemented for you
577      * to return the given owner IInterface when the corresponding
578      * descriptor is requested.
579      */
attachInterface(@ullable IInterface owner, @Nullable String descriptor)580     public void attachInterface(@Nullable IInterface owner, @Nullable String descriptor) {
581         mOwner = owner;
582         mDescriptor = descriptor;
583     }
584 
585     /**
586      * Default implementation returns an empty interface name.
587      */
getInterfaceDescriptor()588     public @Nullable String getInterfaceDescriptor() {
589         return mDescriptor;
590     }
591 
592     /**
593      * Default implementation always returns true -- if you got here,
594      * the object is alive.
595      */
pingBinder()596     public boolean pingBinder() {
597         return true;
598     }
599 
600     /**
601      * {@inheritDoc}
602      *
603      * Note that if you're calling on a local binder, this always returns true
604      * because your process is alive if you're calling it.
605      */
isBinderAlive()606     public boolean isBinderAlive() {
607         return true;
608     }
609 
610     /**
611      * Use information supplied to attachInterface() to return the
612      * associated IInterface if it matches the requested
613      * descriptor.
614      */
queryLocalInterface(@onNull String descriptor)615     public @Nullable IInterface queryLocalInterface(@NonNull String descriptor) {
616         if (mDescriptor != null && mDescriptor.equals(descriptor)) {
617             return mOwner;
618         }
619         return null;
620     }
621 
622     /**
623      * Control disabling of dump calls in this process.  This is used by the system
624      * process watchdog to disable incoming dump calls while it has detecting the system
625      * is hung and is reporting that back to the activity controller.  This is to
626      * prevent the controller from getting hung up on bug reports at this point.
627      * @hide
628      *
629      * @param msg The message to show instead of the dump; if null, dumps are
630      * re-enabled.
631      */
setDumpDisabled(String msg)632     public static void setDumpDisabled(String msg) {
633         sDumpDisabled = msg;
634     }
635 
636     /**
637      * Listener to be notified about each proxy-side binder call.
638      *
639      * See {@link setProxyTransactListener}.
640      * @hide
641      */
642     @SystemApi
643     public interface ProxyTransactListener {
644         /**
645          * Called before onTransact.
646          *
647          * @return an object that will be passed back to #onTransactEnded (or null).
648          */
649         @Nullable
onTransactStarted(@onNull IBinder binder, int transactionCode)650         Object onTransactStarted(@NonNull IBinder binder, int transactionCode);
651 
652         /**
653          * Called after onTranact (even when an exception is thrown).
654          *
655          * @param session The object return by #onTransactStarted.
656          */
onTransactEnded(@ullable Object session)657         void onTransactEnded(@Nullable Object session);
658     }
659 
660     /**
661      * Propagates the work source to binder calls executed by the system server.
662      *
663      * <li>By default, this listener will propagate the worksource if the outgoing call happens on
664      * the same thread as the incoming binder call.
665      * <li>Custom attribution can be done by calling {@link ThreadLocalWorkSource#setUid(int)}.
666      * @hide
667      */
668     public static class PropagateWorkSourceTransactListener implements ProxyTransactListener {
669         @Override
onTransactStarted(IBinder binder, int transactionCode)670         public Object onTransactStarted(IBinder binder, int transactionCode) {
671            // Note that {@link Binder#getCallingUid()} is already set to the UID of the current
672            // process when this method is called.
673            //
674            // We use ThreadLocalWorkSource instead. It also allows feature owners to set
675            // {@link ThreadLocalWorkSource#set(int) manually to attribute resources to a UID.
676             int uid = ThreadLocalWorkSource.getUid();
677             if (uid != ThreadLocalWorkSource.UID_NONE) {
678                 return Binder.setCallingWorkSourceUid(uid);
679             }
680             return null;
681         }
682 
683         @Override
onTransactEnded(Object session)684         public void onTransactEnded(Object session) {
685             if (session != null) {
686                 long token = (long) session;
687                 Binder.restoreCallingWorkSource(token);
688             }
689         }
690     }
691 
692     /**
693      * Sets a listener for the transact method on the proxy-side.
694      *
695      * <li>The listener is global. Only fast operations should be done to avoid thread
696      * contentions.
697      * <li>The listener implementation needs to handle synchronization if needed. The methods on the
698      * listener can be called concurrently.
699      * <li>Listener set will be used for new transactions. On-going transaction will still use the
700      * previous listener (if already set).
701      * <li>The listener is called on the critical path of the binder transaction so be careful about
702      * performance.
703      * <li>Never execute another binder transaction inside the listener.
704      * @hide
705      */
706     @SystemApi
setProxyTransactListener(@ullable ProxyTransactListener listener)707     public static void setProxyTransactListener(@Nullable ProxyTransactListener listener) {
708         BinderProxy.setTransactListener(listener);
709     }
710 
711     /**
712      * Default implementation is a stub that returns false.  You will want
713      * to override this to do the appropriate unmarshalling of transactions.
714      *
715      * <p>If you want to call this, call transact().
716      *
717      * <p>Implementations that are returning a result should generally use
718      * {@link Parcel#writeNoException() Parcel.writeNoException} and
719      * {@link Parcel#writeException(Exception) Parcel.writeException} to propagate
720      * exceptions back to the caller.</p>
721      *
722      * @param code The action to perform.  This should
723      * be a number between {@link #FIRST_CALL_TRANSACTION} and
724      * {@link #LAST_CALL_TRANSACTION}.
725      * @param data Marshalled data being received from the caller.
726      * @param reply If the caller is expecting a result back, it should be marshalled
727      * in to here.
728      * @param flags Additional operation flags.  Either 0 for a normal
729      * RPC, or {@link #FLAG_ONEWAY} for a one-way RPC.
730      *
731      * @return Return true on a successful call; returning false is generally used to
732      * indicate that you did not understand the transaction code.
733      */
onTransact(int code, @NonNull Parcel data, @Nullable Parcel reply, int flags)734     protected boolean onTransact(int code, @NonNull Parcel data, @Nullable Parcel reply,
735             int flags) throws RemoteException {
736         if (code == INTERFACE_TRANSACTION) {
737             reply.writeString(getInterfaceDescriptor());
738             return true;
739         } else if (code == DUMP_TRANSACTION) {
740             ParcelFileDescriptor fd = data.readFileDescriptor();
741             String[] args = data.readStringArray();
742             if (fd != null) {
743                 try {
744                     dump(fd.getFileDescriptor(), args);
745                 } finally {
746                     IoUtils.closeQuietly(fd);
747                 }
748             }
749             // Write the StrictMode header.
750             if (reply != null) {
751                 reply.writeNoException();
752             } else {
753                 StrictMode.clearGatheredViolations();
754             }
755             return true;
756         } else if (code == SHELL_COMMAND_TRANSACTION) {
757             ParcelFileDescriptor in = data.readFileDescriptor();
758             ParcelFileDescriptor out = data.readFileDescriptor();
759             ParcelFileDescriptor err = data.readFileDescriptor();
760             String[] args = data.readStringArray();
761             ShellCallback shellCallback = ShellCallback.CREATOR.createFromParcel(data);
762             ResultReceiver resultReceiver = ResultReceiver.CREATOR.createFromParcel(data);
763             try {
764                 if (out != null) {
765                     shellCommand(in != null ? in.getFileDescriptor() : null,
766                             out.getFileDescriptor(),
767                             err != null ? err.getFileDescriptor() : out.getFileDescriptor(),
768                             args, shellCallback, resultReceiver);
769                 }
770             } finally {
771                 IoUtils.closeQuietly(in);
772                 IoUtils.closeQuietly(out);
773                 IoUtils.closeQuietly(err);
774                 // Write the StrictMode header.
775                 if (reply != null) {
776                     reply.writeNoException();
777                 } else {
778                     StrictMode.clearGatheredViolations();
779                 }
780             }
781             return true;
782         }
783         return false;
784     }
785 
786     /**
787      * Resolves a transaction code to a human readable name.
788      *
789      * <p>Default implementation is a stub that returns null.
790      * <p>AIDL generated code will return the original method name.
791      *
792      * @param transactionCode The code to resolve.
793      * @return A human readable name.
794      * @hide
795      */
getTransactionName(int transactionCode)796     public @Nullable String getTransactionName(int transactionCode) {
797         return null;
798     }
799 
800     /**
801      * Implemented to call the more convenient version
802      * {@link #dump(FileDescriptor, PrintWriter, String[])}.
803      */
dump(@onNull FileDescriptor fd, @Nullable String[] args)804     public void dump(@NonNull FileDescriptor fd, @Nullable String[] args) {
805         FileOutputStream fout = new FileOutputStream(fd);
806         PrintWriter pw = new FastPrintWriter(fout);
807         try {
808             doDump(fd, pw, args);
809         } finally {
810             pw.flush();
811         }
812     }
813 
doDump(FileDescriptor fd, PrintWriter pw, String[] args)814     void doDump(FileDescriptor fd, PrintWriter pw, String[] args) {
815         final String disabled = sDumpDisabled;
816         if (disabled == null) {
817             try {
818                 dump(fd, pw, args);
819             } catch (SecurityException e) {
820                 pw.println("Security exception: " + e.getMessage());
821                 throw e;
822             } catch (Throwable e) {
823                 // Unlike usual calls, in this case if an exception gets thrown
824                 // back to us we want to print it back in to the dump data, since
825                 // that is where the caller expects all interesting information to
826                 // go.
827                 pw.println();
828                 pw.println("Exception occurred while dumping:");
829                 e.printStackTrace(pw);
830             }
831         } else {
832             pw.println(sDumpDisabled);
833         }
834     }
835 
836     /**
837      * Like {@link #dump(FileDescriptor, String[])}, but ensures the target
838      * executes asynchronously.
839      */
dumpAsync(@onNull final FileDescriptor fd, @Nullable final String[] args)840     public void dumpAsync(@NonNull final FileDescriptor fd, @Nullable final String[] args) {
841         final FileOutputStream fout = new FileOutputStream(fd);
842         final PrintWriter pw = new FastPrintWriter(fout);
843         Thread thr = new Thread("Binder.dumpAsync") {
844             public void run() {
845                 try {
846                     dump(fd, pw, args);
847                 } finally {
848                     pw.flush();
849                 }
850             }
851         };
852         thr.start();
853     }
854 
855     /**
856      * Print the object's state into the given stream.
857      *
858      * @param fd The raw file descriptor that the dump is being sent to.
859      * @param fout The file to which you should dump your state.  This will be
860      * closed for you after you return.
861      * @param args additional arguments to the dump request.
862      */
dump(@onNull FileDescriptor fd, @NonNull PrintWriter fout, @Nullable String[] args)863     protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter fout,
864             @Nullable String[] args) {
865     }
866 
867     /**
868      * @param in The raw file descriptor that an input data stream can be read from.
869      * @param out The raw file descriptor that normal command messages should be written to.
870      * @param err The raw file descriptor that command error messages should be written to.
871      * @param args Command-line arguments.
872      * @param callback Callback through which to interact with the invoking shell.
873      * @param resultReceiver Called when the command has finished executing, with the result code.
874      * @throws RemoteException
875      * @hide
876      */
shellCommand(@ullable FileDescriptor in, @Nullable FileDescriptor out, @Nullable FileDescriptor err, @NonNull String[] args, @Nullable ShellCallback callback, @NonNull ResultReceiver resultReceiver)877     public void shellCommand(@Nullable FileDescriptor in, @Nullable FileDescriptor out,
878             @Nullable FileDescriptor err,
879             @NonNull String[] args, @Nullable ShellCallback callback,
880             @NonNull ResultReceiver resultReceiver) throws RemoteException {
881         onShellCommand(in, out, err, args, callback, resultReceiver);
882     }
883 
884     /**
885      * Handle a call to {@link #shellCommand}.  The default implementation simply prints
886      * an error message.  Override and replace with your own.
887      * <p class="caution">Note: no permission checking is done before calling this method; you must
888      * apply any security checks as appropriate for the command being executed.
889      * Consider using {@link ShellCommand} to help in the implementation.</p>
890      * @hide
891      */
onShellCommand(@ullable FileDescriptor in, @Nullable FileDescriptor out, @Nullable FileDescriptor err, @NonNull String[] args, @Nullable ShellCallback callback, @NonNull ResultReceiver resultReceiver)892     public void onShellCommand(@Nullable FileDescriptor in, @Nullable FileDescriptor out,
893             @Nullable FileDescriptor err,
894             @NonNull String[] args, @Nullable ShellCallback callback,
895             @NonNull ResultReceiver resultReceiver) throws RemoteException {
896         FileOutputStream fout = new FileOutputStream(err != null ? err : out);
897         PrintWriter pw = new FastPrintWriter(fout);
898         pw.println("No shell command implementation.");
899         pw.flush();
900         resultReceiver.send(0, null);
901     }
902 
903     /**
904      * Default implementation rewinds the parcels and calls onTransact.  On
905      * the remote side, transact calls into the binder to do the IPC.
906      */
transact(int code, @NonNull Parcel data, @Nullable Parcel reply, int flags)907     public final boolean transact(int code, @NonNull Parcel data, @Nullable Parcel reply,
908             int flags) throws RemoteException {
909         if (false) Log.v("Binder", "Transact: " + code + " to " + this);
910 
911         if (data != null) {
912             data.setDataPosition(0);
913         }
914         boolean r = onTransact(code, data, reply, flags);
915         if (reply != null) {
916             reply.setDataPosition(0);
917         }
918         return r;
919     }
920 
921     /**
922      * Local implementation is a no-op.
923      */
linkToDeath(@onNull DeathRecipient recipient, int flags)924     public void linkToDeath(@NonNull DeathRecipient recipient, int flags) {
925     }
926 
927     /**
928      * Local implementation is a no-op.
929      */
unlinkToDeath(@onNull DeathRecipient recipient, int flags)930     public boolean unlinkToDeath(@NonNull DeathRecipient recipient, int flags) {
931         return true;
932     }
933 
checkParcel(IBinder obj, int code, Parcel parcel, String msg)934     static void checkParcel(IBinder obj, int code, Parcel parcel, String msg) {
935         if (CHECK_PARCEL_SIZE && parcel.dataSize() >= 800*1024) {
936             // Trying to send > 800k, this is way too much
937             StringBuilder sb = new StringBuilder();
938             sb.append(msg);
939             sb.append(": on ");
940             sb.append(obj);
941             sb.append(" calling ");
942             sb.append(code);
943             sb.append(" size ");
944             sb.append(parcel.dataSize());
945             sb.append(" (data: ");
946             parcel.setDataPosition(0);
947             sb.append(parcel.readInt());
948             sb.append(", ");
949             sb.append(parcel.readInt());
950             sb.append(", ");
951             sb.append(parcel.readInt());
952             sb.append(")");
953             Slog.wtfStack(TAG, sb.toString());
954         }
955     }
956 
getNativeBBinderHolder()957     private static native long getNativeBBinderHolder();
getFinalizer()958     private static native long getFinalizer();
959 
960     /**
961      * By default, we use the calling uid since we can always trust it.
962      */
963     private static volatile BinderInternal.WorkSourceProvider sWorkSourceProvider =
964             (x) -> Binder.getCallingUid();
965 
966     /**
967      * Sets the work source provider.
968      *
969      * <li>The callback is global. Only fast operations should be done to avoid thread
970      * contentions.
971      * <li>The callback implementation needs to handle synchronization if needed. The methods on the
972      * callback can be called concurrently.
973      * <li>The callback is called on the critical path of the binder transaction so be careful about
974      * performance.
975      * <li>Never execute another binder transaction inside the callback.
976      * @hide
977      */
setWorkSourceProvider(BinderInternal.WorkSourceProvider workSourceProvider)978     public static void setWorkSourceProvider(BinderInternal.WorkSourceProvider workSourceProvider) {
979         if (workSourceProvider == null) {
980             throw new IllegalArgumentException("workSourceProvider cannot be null");
981         }
982         sWorkSourceProvider = workSourceProvider;
983     }
984 
985     // Entry point from android_util_Binder.cpp's onTransact
986     @UnsupportedAppUsage
execTransact(int code, long dataObj, long replyObj, int flags)987     private boolean execTransact(int code, long dataObj, long replyObj,
988             int flags) {
989         // At that point, the parcel request headers haven't been parsed so we do not know what
990         // WorkSource the caller has set. Use calling uid as the default.
991         final int callingUid = Binder.getCallingUid();
992         final long origWorkSource = ThreadLocalWorkSource.setUid(callingUid);
993         try {
994             return execTransactInternal(code, dataObj, replyObj, flags, callingUid);
995         } finally {
996             ThreadLocalWorkSource.restore(origWorkSource);
997         }
998     }
999 
execTransactInternal(int code, long dataObj, long replyObj, int flags, int callingUid)1000     private boolean execTransactInternal(int code, long dataObj, long replyObj, int flags,
1001             int callingUid) {
1002         // Make sure the observer won't change while processing a transaction.
1003         final BinderInternal.Observer observer = sObserver;
1004         final CallSession callSession =
1005                 observer != null ? observer.callStarted(this, code, UNSET_WORKSOURCE) : null;
1006         Parcel data = Parcel.obtain(dataObj);
1007         Parcel reply = Parcel.obtain(replyObj);
1008         // theoretically, we should call transact, which will call onTransact,
1009         // but all that does is rewind it, and we just got these from an IPC,
1010         // so we'll just call it directly.
1011         boolean res;
1012         // Log any exceptions as warnings, don't silently suppress them.
1013         // If the call was FLAG_ONEWAY then these exceptions disappear into the ether.
1014         final boolean tracingEnabled = Binder.isTracingEnabled();
1015         try {
1016             if (tracingEnabled) {
1017                 final String transactionName = getTransactionName(code);
1018                 Trace.traceBegin(Trace.TRACE_TAG_ALWAYS, getClass().getName() + ":"
1019                         + (transactionName != null ? transactionName : code));
1020             }
1021             res = onTransact(code, data, reply, flags);
1022         } catch (RemoteException|RuntimeException e) {
1023             if (observer != null) {
1024                 observer.callThrewException(callSession, e);
1025             }
1026             if (LOG_RUNTIME_EXCEPTION) {
1027                 Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e);
1028             }
1029             if ((flags & FLAG_ONEWAY) != 0) {
1030                 if (e instanceof RemoteException) {
1031                     Log.w(TAG, "Binder call failed.", e);
1032                 } else {
1033                     Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e);
1034                 }
1035             } else {
1036                 // Clear the parcel before writing the exception
1037                 reply.setDataSize(0);
1038                 reply.setDataPosition(0);
1039                 reply.writeException(e);
1040             }
1041             res = true;
1042         } finally {
1043             if (tracingEnabled) {
1044                 Trace.traceEnd(Trace.TRACE_TAG_ALWAYS);
1045             }
1046             if (observer != null) {
1047                 // The parcel RPC headers have been called during onTransact so we can now access
1048                 // the worksource uid from the parcel.
1049                 final int workSourceUid = sWorkSourceProvider.resolveWorkSourceUid(
1050                         data.readCallingWorkSourceUid());
1051                 observer.callEnded(callSession, data.dataSize(), reply.dataSize(), workSourceUid);
1052             }
1053         }
1054         checkParcel(this, code, reply, "Unreasonably large binder reply buffer");
1055         reply.recycle();
1056         data.recycle();
1057 
1058         // Just in case -- we are done with the IPC, so there should be no more strict
1059         // mode violations that have gathered for this thread.  Either they have been
1060         // parceled and are now in transport off to the caller, or we are returning back
1061         // to the main transaction loop to wait for another incoming transaction.  Either
1062         // way, strict mode begone!
1063         StrictMode.clearGatheredViolations();
1064         return res;
1065     }
1066 }
1067