Merge "Improve reporting to apps of transaction too large failures." into mnc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
fa4d547d58
@@ -23578,6 +23578,7 @@ package android.os {
|
||||
|
||||
public class TransactionTooLargeException extends android.os.RemoteException {
|
||||
ctor public TransactionTooLargeException();
|
||||
ctor public TransactionTooLargeException(java.lang.String);
|
||||
}
|
||||
|
||||
public final class UserHandle implements android.os.Parcelable {
|
||||
|
||||
@@ -25500,6 +25500,7 @@ package android.os {
|
||||
|
||||
public class TransactionTooLargeException extends android.os.RemoteException {
|
||||
ctor public TransactionTooLargeException();
|
||||
ctor public TransactionTooLargeException(java.lang.String);
|
||||
}
|
||||
|
||||
public final class UserHandle implements android.os.Parcelable {
|
||||
|
||||
@@ -689,7 +689,8 @@ class ContextImpl extends Context {
|
||||
intent.resolveTypeIfNeeded(getContentResolver()),
|
||||
null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, options,
|
||||
user.getIdentifier());
|
||||
} catch (RemoteException re) {
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -754,6 +755,7 @@ class ContextImpl extends Context {
|
||||
}
|
||||
Instrumentation.checkStartActivityResult(result, null);
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -768,6 +770,7 @@ class ContextImpl extends Context {
|
||||
Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, false,
|
||||
getUserId());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -782,6 +785,7 @@ class ContextImpl extends Context {
|
||||
Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE,
|
||||
false, false, getUserId());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -796,6 +800,7 @@ class ContextImpl extends Context {
|
||||
Activity.RESULT_OK, null, null, receiverPermission, appOp, false, false,
|
||||
getUserId());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -811,6 +816,7 @@ class ContextImpl extends Context {
|
||||
Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, true, false,
|
||||
getUserId());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -854,6 +860,7 @@ class ContextImpl extends Context {
|
||||
initialCode, initialData, initialExtras, receiverPermission, appOp,
|
||||
true, false, getUserId());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -866,6 +873,7 @@ class ContextImpl extends Context {
|
||||
intent, resolvedType, null, Activity.RESULT_OK, null, null, null,
|
||||
AppOpsManager.OP_NONE, false, false, user.getIdentifier());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -886,6 +894,7 @@ class ContextImpl extends Context {
|
||||
Activity.RESULT_OK, null, null, receiverPermission, appOp, false, false,
|
||||
user.getIdentifier());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -927,6 +936,7 @@ class ContextImpl extends Context {
|
||||
initialCode, initialData, initialExtras, receiverPermission,
|
||||
appOp, true, false, user.getIdentifier());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -942,6 +952,7 @@ class ContextImpl extends Context {
|
||||
Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true,
|
||||
getUserId());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -977,6 +988,7 @@ class ContextImpl extends Context {
|
||||
initialCode, initialData, initialExtras, null,
|
||||
AppOpsManager.OP_NONE, true, true, getUserId());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -993,6 +1005,7 @@ class ContextImpl extends Context {
|
||||
ActivityManagerNative.getDefault().unbroadcastIntent(
|
||||
mMainThread.getApplicationThread(), intent, getUserId());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1006,6 +1019,7 @@ class ContextImpl extends Context {
|
||||
mMainThread.getApplicationThread(), intent, resolvedType, null,
|
||||
Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true, user.getIdentifier());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1040,6 +1054,7 @@ class ContextImpl extends Context {
|
||||
initialCode, initialData, initialExtras, null,
|
||||
AppOpsManager.OP_NONE, true, true, user.getIdentifier());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1056,6 +1071,7 @@ class ContextImpl extends Context {
|
||||
ActivityManagerNative.getDefault().unbroadcastIntent(
|
||||
mMainThread.getApplicationThread(), intent, user.getIdentifier());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1171,7 +1187,7 @@ class ContextImpl extends Context {
|
||||
}
|
||||
return cn;
|
||||
} catch (RemoteException e) {
|
||||
return null;
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1193,7 +1209,7 @@ class ContextImpl extends Context {
|
||||
}
|
||||
return res != 0;
|
||||
} catch (RemoteException e) {
|
||||
return false;
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1242,7 +1258,7 @@ class ContextImpl extends Context {
|
||||
}
|
||||
return res != 0;
|
||||
} catch (RemoteException e) {
|
||||
return false;
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1274,9 +1290,8 @@ class ContextImpl extends Context {
|
||||
className, profileFile, 0, arguments, null, null, getUserId(),
|
||||
null /* ABI override */);
|
||||
} catch (RemoteException e) {
|
||||
// System has crashed, nothing we can do.
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1506,6 +1506,7 @@ public class Instrumentation {
|
||||
requestCode, 0, null, options);
|
||||
checkStartActivityResult(result, intent);
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -1563,6 +1564,7 @@ public class Instrumentation {
|
||||
token, options, userId);
|
||||
checkStartActivityResult(result, intents[0]);
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1622,6 +1624,7 @@ public class Instrumentation {
|
||||
token, target, requestCode, 0, null, options);
|
||||
checkStartActivityResult(result, intent);
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -1682,6 +1685,7 @@ public class Instrumentation {
|
||||
requestCode, 0, null, options, user.getIdentifier());
|
||||
checkStartActivityResult(result, intent);
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -1719,6 +1723,7 @@ public class Instrumentation {
|
||||
requestCode, 0, null, options, userId);
|
||||
checkStartActivityResult(result, intent);
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -1753,6 +1758,7 @@ public class Instrumentation {
|
||||
intent, intent.resolveTypeIfNeeded(who.getContentResolver()), options);
|
||||
checkStartActivityResult(result, intent);
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Failure from system", e);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -56,4 +56,8 @@ public class TransactionTooLargeException extends RemoteException {
|
||||
public TransactionTooLargeException() {
|
||||
super();
|
||||
}
|
||||
|
||||
public TransactionTooLargeException(String msg) {
|
||||
super(msg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -635,7 +635,7 @@ void set_dalvik_blockguard_policy(JNIEnv* env, jint strict_policy)
|
||||
}
|
||||
|
||||
void signalExceptionForError(JNIEnv* env, jobject obj, status_t err,
|
||||
bool canThrowRemoteException)
|
||||
bool canThrowRemoteException, int parcelSize)
|
||||
{
|
||||
switch (err) {
|
||||
case UNKNOWN_ERROR:
|
||||
@@ -680,8 +680,10 @@ void signalExceptionForError(JNIEnv* env, jobject obj, status_t err,
|
||||
case UNKNOWN_TRANSACTION:
|
||||
jniThrowException(env, "java/lang/RuntimeException", "Unknown transaction code");
|
||||
break;
|
||||
case FAILED_TRANSACTION:
|
||||
ALOGE("!!! FAILED BINDER TRANSACTION !!!");
|
||||
case FAILED_TRANSACTION: {
|
||||
ALOGE("!!! FAILED BINDER TRANSACTION !!! (parcel size = %d)", parcelSize);
|
||||
char msg[128];
|
||||
snprintf(msg, sizeof(msg)-1, "data parcel size %d bytes", parcelSize);
|
||||
// TransactionTooLargeException is a checked exception, only throw from certain methods.
|
||||
// FIXME: Transaction too large is the most common reason for FAILED_TRANSACTION
|
||||
// but it is not the only one. The Binder driver can return BR_FAILED_REPLY
|
||||
@@ -690,8 +692,9 @@ void signalExceptionForError(JNIEnv* env, jobject obj, status_t err,
|
||||
// to enable us to distinguish these cases in the future.
|
||||
jniThrowException(env, canThrowRemoteException
|
||||
? "android/os/TransactionTooLargeException"
|
||||
: "java/lang/RuntimeException", NULL);
|
||||
break;
|
||||
: "java/lang/RuntimeException",
|
||||
parcelSize > 0 ? msg : NULL);
|
||||
} break;
|
||||
case FDS_NOT_ALLOWED:
|
||||
jniThrowException(env, "java/lang/RuntimeException",
|
||||
"Not allowed to write file descriptors here");
|
||||
@@ -1121,7 +1124,7 @@ static jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj,
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
signalExceptionForError(env, obj, err, true /*canThrowRemoteException*/);
|
||||
signalExceptionForError(env, obj, err, true /*canThrowRemoteException*/, data->dataSize());
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ extern jobject newParcelFileDescriptor(JNIEnv* env, jobject fileDesc);
|
||||
extern void set_dalvik_blockguard_policy(JNIEnv* env, jint strict_policy);
|
||||
|
||||
extern void signalExceptionForError(JNIEnv* env, jobject obj, status_t err,
|
||||
bool canThrowRemoteException = false);
|
||||
bool canThrowRemoteException = false, int parcelSize = 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -427,6 +427,15 @@ public class ActivityTestMain extends Activity {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
menu.add("Transaction fail").setOnMenuItemClickListener(
|
||||
new MenuItem.OnMenuItemClickListener() {
|
||||
@Override public boolean onMenuItemClick(MenuItem item) {
|
||||
Intent intent = new Intent(Intent.ACTION_MAIN);
|
||||
intent.putExtra("gulp", new int[1024*1024]);
|
||||
startActivity(intent);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user