Throw DeadObjectException on failed transaction, not RuntimeException

In practice we only see failed transactions with small payloads when
the remote dies while the binder operation is in flight.  Throw the
applicable exception type rather than the generic "oops binder went
haywire" one.

Bug 22104446

Change-Id: I785c15617db7a1f4d505aa11f16e61551c8357ba
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index e2cfa44..c139cd7 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -697,9 +697,11 @@
             } else {
                 // Heuristic: a payload smaller than this threshold "shouldn't" be too
                 // big, so it's probably some other, more subtle problem.  In practice
-                // it nearly always means that the remote process died while the binder
+                // it seems to always mean that the remote process died while the binder
                 // transaction was already in flight.
-                exceptionToThrow = "java/lang/RuntimeException";
+                exceptionToThrow = (canThrowRemoteException)
+                        ? "android/os/DeadObjectException"
+                        : "java/lang/RuntimeException";
                 snprintf(msg, sizeof(msg)-1,
                         "Transaction failed on small parcel; remote process probably died");
             }