=========04/19晚上更新了关于自制 bug 图的尝试=========
其他答主把 bug 最初产生的原因说的很完整了。至于Android M及以下的系统中崩溃的原因,考虑到是 SIGBUS ,可能是非对齐的内存访问,于是试着改了一下:
(external/jhead)
https://gist.github.com/updateing/2b58ebd4a8c75780443f28f514e9bb39- diff --git a/exif.c b/exif.cindex 8dfdaf1..fa9fd99 100644--- a/exif.c+++ b/exif.c@@ -453,7 +453,7 @@ double ConvertAnyFormat(void * ValuePtr, int Format) // Not sure if this is correct (never seen float used in Exif format) case FMT_SINGLE: Value = (double)*(float *)ValuePtr; break;- case FMT_DOUBLE: Value = *(double *)ValuePtr; break;+ case FMT_DOUBLE: memcpy(&Value, ValuePtr, sizeof(double));break; default: ErrNonfatal("Illegal format code %d",Format,0);
复制代码 应用之后无法复现此bug了:
测试机型是OnePlus One,CM13.0-20160408-NIGHTLY
不知道其他格式的转换有没有问题,反正关于这类图的问题无法复现,就这样好了[doge]
新人第一答,求轻拍啊~
================================
更新一发自制这类图的尝试:
这是EXIF规范的一点微小的解释(人家真的是这么说的)
http://www.media.mit.edu/pia/Research/deepview/exif.html
这是一张正常的图
这是它的文件头
(偷个懒)据说是曝光时间的锅?那么来改了试试:
- 曝光时间的 Tag 是0x829a,这个文件的EXIF信息指示字节序是 Motorola 风格(大端),于是这个 Tag 在文件中的表现就是0x829a
- 搜索到这个 Tag
- 82 9A 00 05 00 00 00 01 00 00 01 C6
复制代码 - 本来的类型是0x5(比值),改成0xc(双精度浮点)
- 保存,传到手机上
这是修改后的图,大家可以试试看有没有问题……(我这里社区客户端点大图就挂了)
注意:上面的过程中没有验算是否出现了对齐问题,因为基础地址会在哪里并不能提前得知……所以这张图能复现bug也许是个巧合
注意2:如果要实现在QQ里崩溃的效果,需要想办法避免二压。这里大家就自己开脑洞吧~
貌似并不是所有人点大图都会出问题,比如部分华为(基于 Android 6.0 的版本)和三星的设备。不清楚是不是它们的固件里已经打了针对此问题的补丁。基于 AOSP 的第三方固件几乎全军覆没……
如果存了 bug 图导致相册打不开,可以参照其他答案的方法来删除有问题的图片。比如 Root Explorer、终端模拟器、adb shell。
|