通过Intent传输图片导致广播消息异常的问题根因分析(通过分析Android源码反向推理)(二)

2014-11-24 09:21:51 · 作者: · 浏览: 1
// refers to an FD that has been closed. We should change the driver
// to enable us to distinguish these cases in the future.
jniThrowException(env, canThrowRemoteException
"android/os/TransactionTooLargeException"
: "java/lang/RuntimeException", NULL);
break;
...
再根据 “FAILED_TRANSACTION” 这个关键字,进一步搜索,在IPCThreadState.cpp的waitForResponse()方法中,有如下代码:
从这个问题出现的所在的函数,我们可以知道,说明这个广播消息已经传输给Binder驱动层了,正在等待Binder驱动层回应答。
为什么?这是一个相当长的话题,如果你不知道,看一下《Android框架揭秘》,或者老罗的Blog:《Android进程间通信(IPC)机制Binder简要介绍和学习计划》。
[cpp]
status_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult)
{
int32_t cmd;
int32_t err;
while (1) {
if ((err=talkWithDriver()) < NO_ERROR) break;
err = mIn.errorCheck();
if (err < NO_ERROR) break;
if (mIn.dataAvail() == 0) continue;
cmd = mIn.readInt32();
IF_LOG_COMMANDS() {
alog << "Processing waitForResponse Command: "
<< getReturnString(cmd) << endl;
}
switch (cmd) {
...
case BR_FAILED_REPLY:
err = FAILED_TRANSACTION;
goto finish;
...
}
}
finish:
if (err != NO_ERROR) {
if (acquireResult) *acquireResult = err;
if (reply) reply->setError(err);
mLastError = err;
}
return err;
}
IPCThreadState::waitForResponse() 将 BR_FAILED_REPLY这个错误码,转成了FAILED_TRANSACTION抛给了上层,
再看看BR_FAILED_REPLY这个错误码是在哪里生成的,进一步搜索了一下,发现这个错误码是在binder.c(Binder的驱动源码中)大量出现:
[cpp]
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_error = BR_FAILED_REPLY;
Binder.c (e:\git\android4.2.2源码\driver\binder): return_