通过Intent传输图片导致广播消息异常的问题根因分析(通过分析Android源码反向推理)(三)
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;
再进一步分析一下之前的日志:
正常传输的图片大小 : 09-11 16:12:16.776: I/System.out(14177): bmp.getByteCount() = 367236
无法正常传输的图片大小 : 09-11 16:12:25.329: I/System.out(14177): bmp.getByteCount() = 524288
异常的那个图片,比正常的图片要大42%左右,再反向去推测,既然是图片过大,那这个问题可能出现在哪里?
出现BR_FAILED_REPLY关键字的地方,我都过了一下,如下地方我个人觉得最像,由于图片大小过大,导致分配buffer出现了问题:
[cpp]
static void binder_transaction(struct binder_proc *proc,
struct binder_thread *thread,
struct binder_transaction_data *tr, int reply)
{
...
t->buffer = binder_alloc_buf(target_proc, tr->data_size,
tr->offsets_size, !reply && (t->flags & TF_ONE_WAY));
if (t->buffer == NULL) {
return_error = BR_FAILED_REPLY;
goto err_binder_alloc_buf_failed;
}
当然,仅是推测,没有进一步验证。
大概分析出了问题根因,那怎么解决,其实就比较简单了:
1、将图片保存到sd卡,将路径传给应用B,让应用B自己去从sd卡加载;
2、将图片进行压缩后再传输;
搞Android,有一个好处,就是遇到问题,你可以通过全部的源码去进一步分析找到问题根因;通过解决某个问题,反过来又可以加深对Android的整体的了解。