历时四年,给Google提交的Android Framework Bug终于被Fixed了

7.0 CTS fail 项分析之google Issue (一) google.gmsversion=7.0_r3 cts测试工具:7.0_r1 1、 CtsAppTestCases - armeabi-v7a android.app.cts.ActivityManagerTest#testTimeTrackingAPI_ChainedActivityExit       fail junit.framework.AssertionFailedEr 阅读详情
历时四年,Google终于修复了一个我发现的Android Framework Bug

2014年在做一个Android终端设备开发过程中,发现了一个Android Framework层的Bug,给Google提交了issue和解决方案,和外界传言一致Google一般不太在意个人开发者提交的issue,直到2017年12月,再次提交了issue,在几轮沟通无果下,忍不住喷了Google几句后,终于该issue被转交给了Android development team处理,又经过快三个月的时间收到了下面的答复:

这里写图片描述
google issues:https://issuetracker.google.com/issues/70016687

issue背景:

在对我们自己研发的一款Android终端设备进行Camera拍照压力测试时,发现当拍照张数达到数万张时,出现OOM,导致系统崩溃。

issue分析解决过程:

该项目为开发一款Android工业终端设备,采用TI芯片方案,由于芯片方案商支持不够完善(主要TI被高通打的放弃了移动端芯片市场),Camera的HAL层需要我们自己移植适配。

分析思路:

首先看下Android系统架构图中中Camera功能模块的分布情况,从App层->Framework->HAL->Kernel一路下来:

这里写图片描述

(图片取自https://blog.youkuaiyun.com/asd1031/article/details/53699867)

  • 首先怀疑测试app自身存在内存问题。
  • Android application Framework,libraries层和jni相关模块是经过Google大量验证的模块,出现问题的概率比较小,暂时排除。
  • 怀疑HAL层移植问题。
怀疑1:测试app问题

压力测试app由测试同学开发提供的,该app每隔3s触发一次拍照操作,并对拍摄的照片进行清理,以达到拍摄10万张照片的测试目的。基于以上分析,为了排除测试app问题,采用Android原生Camera app进行压力测试,编写monkey测试脚本,触发原生Camera app拍照,进行压力测试。(此处遇到的问题是:如何实现对照片的清理工作,直接触发shell环境下rm操作,并不会清除Android内部文件缓存索引,拍摄几千张照片后仍然会导致存储空间用尽,解决此问题也耗费了点时间,不过不是本文的重点,此处不做展开)

结果:通过原生Camera app进行测试后,仍然出现内存泄漏,此处基本排除测试app的问题。

怀疑2:HAl层

基于之前的分析,我们把怀疑对象聚集在我们自己集成的Android HAL层,在分析之前,简单描述下Android Camera拍照的流程:Linux Kernel提供标准的v4l2接口,供上层(此处即为HAL)获取图像原始数据,HAL层拿到图像数据进行编码(一般为jpeg),回调给Camera service。其中Linux Kernel下Camera驱动和HAL适配层一般由芯片厂商提供,其余部分由Linux Kernel和Android系统官方维护,开发。

这样对HAL的测试分为三步:

  • 验证芯片厂商的Camera驱动是否存在问题。
  • 验证HAL层图像数据捕获流程是否存在问题。
  • 验证图像编码流程是否存在问题。
Camera驱动

Android系统是基于Linux Kernel开发,支持标准的v4l2接口,只需要编写一个简单的基于v4l2的视频捕获程序就可以验证camera驱动的问题,此处测试验证没有内存泄漏,排查驱动问题。

HAL层视频捕获流程

测试思路非常明确,难点在于要把芯片提供商的HAL层源码中进行视频捕获功能的模块剥离出来,单独进行压力测试。(由于原厂提供的HAL层代码,耦合比较严重,在不影响内部流程,结构的情况下,要找到适合的切面mock一些数据接口,才好进行有效的测试。)

经过以上的工作,进行了压力测试,系统未出现内存泄漏,基本排除HAL层捕获流程。

HAL层图像编码流程

继续对图像编码部分剥离,进行压力测试,发现内存泄漏,基本定位大概的泄漏位置,不过由于Android整个编码过程也进行层层的封装,泄漏位置还需要继续细致的定位,这样经过层层的细化,像剥洋葱一样一层层mock输入数据,最终定位在Android系统层的jpeg编码处理中:(frameworks/base/core/jni/android/graphics/YuvToJpegEncoder.cpp)

关于Android的jpeg编码:Android系统jpeg编码支持硬编码和软编码,如果芯片集成了jpeg硬件编码模块,会优先选择硬编码,而如果没有该模块,会采用软件的jpeg编码进行处理。

Android采用的软件编码库是业内知名的libjpeg库,而正是对这个库的使用出了问题:

bool YuvToJpegEncoder::encode(SkWStream* stream, void* inYuv, int width,
        int height, int* offsets, int jpegQuality) {
    jpeg_compress_struct    cinfo;
    skjpeg_error_mgr        sk_err;
    skjpeg_destination_mgr  sk_wstream(stream);

    cinfo.err = jpeg_std_error(&sk_err);
    sk_err.error_exit = skjpeg_error_exit;
    if (setjmp(sk_err.fJmpBuf)) {
        return false;
    }
    jpeg_create_compress(&cinfo);

    cinfo.dest = &sk_wstream;

    setJpegCompressStruct(&cinfo, width, height, jpegQuality);

    jpeg_start_compress(&cinfo, TRUE);

    compress(&cinfo, (uint8_t*) inYuv, offsets);

    jpeg_finish_compress(&cinfo);

    return true;
}

坑就在上面这个接口函数中:

熟悉libjpeg的同学可能会注意到,上面的接口在调用完jpeg_finish_compress()后,没有调用jpeg_destroy_compress(),这个接口是释放压缩工作过程中所申请的资源,就是代码中的cinfo结构,该结构只占十几个字节的内存, 这样就导致了每拍摄一张照片,就泄漏一个cinfo的内存,当拍照数量达到万级时,才会有所察觉。

对这种数据流的控制,pipeline方式是比较好的方案,因为可以明确输入输出,这样非常方便通过伪造输入数据对各个模块进行单独的压力测试,最难控制的就是“洋葱”式的包裹调用,要像“剥洋葱”一样一层层的剥离,找准切面十分麻烦。

这个bug是否影响到你的Android手机

七成的概率下你的手机应该不会有这个问题,即时有这个问题你也很难发现这个问题,因为上面讲到android系统有两种编码方式选择,优先使用硬件编码模块,如果没有硬件编码模块,才会使用软编码的方式,而目前大部分中高端的芯片方案都集成了硬件模块,只有在少数低端芯片上才会使用软编码的方式,并且即使你的手机没有硬编码模块,用的软编码,也很难遇见这个问题,因为对于普通用户,持续拍摄上万张照片是不太可能的,第一受限于手机的存储空间(一万张照片,至少要30G的空间),第二即使能拍摄上万张照片,但要保持手机一直工作不重启也还是比较苦难的(总会死个机啥的)。

哈哈,这么一说发现这个bug其实是一个不会发生的bug了!!!不过我们之前的产品,定位于工业级别,对图像采集有比较高的要求,所以制定了10万张照片的测试标准,也就让我发现了这个不会影响到大部分人的bug。

最后再吐槽下Google

改bug我在2014年就已经提交了issue,不过没持续关注,过了几个月被莫名其妙的关闭了,当时没有在意,不过当Android 6.0,7.0版本出来时,我都看了下这个bug,一直存在,所以在去年(2017年)12月份又提了一个issue,Google方面的处理人仍然各种推诿扯皮,最后我没忍住喷了几句,这次Google方面回复会转给开发团队处理,终于在今年(2018年)给出了fixed的结论。

Android LaunchAnyWhere (Google Bug 7699048)漏洞详解及防御措施 开始 近日,Google修复一个组件安全的漏洞LaunchAnyWhere(Google Bug 7699048)。这个漏洞属于Intend Based提取漏洞,攻击者利用这个漏洞,可以突破了应用间的权限隔离,达到调用任意私有Activity(exported为false)的目的。 该漏洞影响Android 2.3至4.3固件。 漏洞分析 在分析这个漏洞之前,需要先介绍两个东西。 Acc 阅读详情

相关推荐

P450酶催化循环的Amber-Gromacs混合模拟实战:从血红素加氧到产物释放

本文详细介绍了针对P450酶完整催化循环的Amber-Gromacs混合模拟实战策略。通过Amber为关键氧合血红素中间体(CPDI)构建精确力场,再利用Gromacs的高效GPU加速进行长时间尺度动力学模拟,完整覆盖从底物结合到产物释放的催化过程,为研究酶催化机制提供了强大的计算工具。

weixin_29201859的博客 315

如何提交Code到google open source android gerrit

讲述如何提交修改到android Gerrit让google的开发者进行review并merge,详细讲解各个步骤以及注意点。

AnnaLoad的专栏 4737

告别 RPA 和 Selenium,MCP + Playwright 成为自动化开发新宠!

摘要: 随着数字化转型加速,传统自动化工具(如RPA和Selenium)在复杂场景中暴露出开发成本高、灵活性不足等问题。新一代解决方案MCP(Model Context Protocol)与Playwright的结合,通过AI与自动化的无缝对接,实现了智能化的任务处理。MCP支持自然语言交互和上下文感知,开发者无需编写复杂代码即可生成自动化脚本;Playwright则提供多浏览器支持、高性能和易用性。二者结合显著提升开发效率,使自动化更智能、灵活。文章还对比了VS Code与Trae中配置Playwrigh

我先测了 2208

倾情分享:Android 开发者们不要错过的网站宝藏~

从事 Android 开发多年,攒了很多宝贵的学习网站,分享给大家。涵盖了系统、API、语言、开发工具、以及各种官方学习平台,不求面面俱到,只求无私分享!

allisonchen的专栏 3598

Coze:手把手教你搭建 小红书二创 智能体

前一篇 “” ,讲了如何针对需求进行拆解,并拆解 ”小红书二创“ 智能体,分为四个内容模块。通过上述步骤,开始一步一步构建 “小红书二创” 智能体。用来测试的小红书地址:http://xhslink.com/a/quxWEDAj3J48。

保持敏感!保持学习! 1436

国产大模型高考横评:数学推理与教育落地能力实测

大模型能力评估正从开放榜单转向封闭任务的确定性验证,高考作为强逻辑、低容错、高精度的标准化考试,成为检验模型真实推理能力的理想标尺。其核心在于考察知识覆盖、步骤完整性、单位敏感性与教学对齐度,而非单纯答案正确率。数学解答题尤其凸显模型在前提校验、条件枚举与过程可控性上的差异,反映出训练数据与教育语料深度耦合带来的工程化优势。该范式已延伸至语文语感建模、英语表达习惯适配及理综跨学科缝合等场景,为智能阅卷、精准答疑和教培系统集成提供可复现、可解释、可部署的技术依据。

weixin_30436581的博客 288

99.99%的Google Play开发者都在用的5个重要网址

在平时的工作中,作为App出海从业者的我们经常会接触谷歌相关的实用网址,比如政策、资源、社区等,今天Android出海就带大家盘点下Google Play相关的常用网址。

Android出海 730

开源DIY龙门架:从零构建可编程运动控制平台

运动控制是自动化与机器人技术的核心基础,它通过精确指令驱动执行机构,实现物体的定位与轨迹规划。其原理通常涉及控制器、驱动器、电机与传动机构的协同工作,核心价值在于将数字指令转化为精准的物理运动,从而解放人力并提升作业一致性。在工业自动化、桌面制造(如3D打印、激光雕刻)及教育机器人等领域应用广泛。本文聚焦于一个具体的工程实践案例:使用**铝型材**、**3D打印**零件、Arduino控制器及步进电机,从机械结构设计、电路连接到代码编写,手把手教你打造一个模块化、可扩展的开源龙门架系统。该系统不仅成本可控,

weixin_33168937的博客 618

谷歌的bug系统

https://issuetracker.google.com/issues?q=assignee:test001code11@gmail.com%20status:open

... 377

科研绘图避坑指南:用PyMol制作期刊级蛋白-配体相互作用图(含氢键显示技巧)

本文是一份专业的科研绘图避坑指南,详细讲解如何利用PyMol软件制作符合期刊发表标准的蛋白-配体相互作用图。文章重点分享了从构图逻辑、精准选择到氢键等相互作用的艺术化表达技巧,并提供了视觉优化与期刊适配的终极参数设置,帮助科研人员产出兼具科学严谨性与视觉美感的专业图表。

weixin_29292431的博客 270

RV1126平台librga图像旋转裁剪实战

本文详细介绍了在rv1126平台上使用librga库实现图像旋转和裁剪的方法。首先解释了librga的基本概念和关键对象,包括源图像、目标图像和操作参数。随后分步骤说明了初始化设置、缓冲区创建、裁剪区域定义(通过坐标和尺寸参数)以及旋转操作(支持常见角度)。提供了完整的示例代码演示如何组合裁剪和旋转操作,并强调了性能优化、错误处理、格式支持等注意事项。通过硬件加速的librga,可以在rv1126平台上高效完成图像处理任务。

hwmxrhx的博客 1543

2.4GHz——蓝牙射频

本文总结了BLE射频技术学习要点:首先介绍蓝牙技术作为2.4GHz频段的低功耗无线通信方案;其次详述射频基础概念(频率、功率单位换算)和调制技术(AM/FM/PM及数字调制);重点分析BLE天线设计(PCB/芯片/SMA天线特性)、阻抗匹配原理及史密斯圆图应用;最后说明蓝牙认证流程(BQB)及各国射频合规性认证要求。全文通过图文结合的方式,系统梳理了BLE产品开发中的射频关键技术要点。

硬件工程师冰冰的博客 774

【VibeCoding系列】小白入门指南:模型选择、编辑器选择、项目预定全分析

开箱即用:下载安装就能用,不用配 API Key(也可以自己配)Cmd+K 快速修改:选中代码,按 Cmd+K,直接让 AI 修改Cmd+L 对话:侧边栏聊天,支持引用文件和代码@文件引用:输入 @ 就能引用项目中的文件,AI 自动读取上下文Agent 模式:告诉 AI 一个需求,它自动跨文件修改下载地址cursor.com(免费版有额度限制,足够入门)✅下载 Cursorcursor.com),安装打开✅选一个小项目(个人名片页 or Todo List)✅按照七步工作流开干。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 211

Android 8.1 Google issue-- 20190221

特别注意: 1.有link的Google issue ,不需要再来申请分析报告,用link申请waive. 2.已得到Google回复的: You can get a waiver . 3.已提交google等待google 回复的: Waiting for google feedback.   所有Waiting for Google feedback的Google issue, 均需要客户与G...

yanzhiweix的博客 1961

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

如何优雅的使用GMS,为此我做了个食用Google服务的magisk microG懒人模块。

如何优雅的使用GMS,为此我做了个食用Google服务的magisk懒人包。 开端 其实吧,我对google服务的需求并不大,我主要就是在play store下下软件,同步同步通讯录和用Google相机,所以我就在magisk仓库找到了microG体验了一下,挺好的,而且还有一个就是,之前我写的安装方法里的systemizer已经早就停止更新了,在android11用不了。 总结一下就是 1、省电 他不会像play服务一样常驻后台好多个进程,一般就1,2个进程在40m左右。 2、兼容性强 GMS套件中的Go

深夜听表 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android开发,你所不知道的Android原生开发的现状

如果你觉得这些内容对你有帮助,可以扫码领取!!!!

2301_79835671的博客 762

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

手机端常见 BUG 深度剖析:成因、表现与解决之道

手机端 BUG 成因复杂交织,涵盖兼容性、网络、性能、交互多维度,需开发者秉持严谨态度,全程把控开发流程,善用各类测试、分析工具,精准定位、高效修复问题。持续跟进系统、硬件、网络前沿动态,提前布局适配策略,雕琢细节、优化体验,方能铸就稳定可靠、备受用户青睐的手机应用,于激烈市场竞争中脱颖而出。

你若盛开,清风自来 4250

Android之一个很奇怪的生命周期bug

本文主要记录一个很奇怪的bug, 顺便重新认识了一下activity的生命周期 [问题前提]:手机摄像头处理,onResume里打开摄像头, onPause里关闭摄像头 [问题出现]:运行一段时间,会莫名其妙的自动 onPause->onResume。系统自动调用onPause,然后调用onResume, 这个本来看不出来,但是开摄像头时给了一个动画,每次打开都会调用这个动画,所以问题特别明显,打个

I_do_can的博客 939

Android中出现的一些BUG的解决方法

在使用Android的过程中,我们经常会遇到一些BUG,下面是欧柏泰克和大家分享的几个Android的BUG的解决办法,希望能帮助到大家: 1.问题:控制台出现emulator: ERROR: the user data image is used by another emulator. aborting提示 原因:没有正确关闭模拟器 解决:在进程中结束adb.exe,重启Eclipse即

2729

android——解决bug的流程以及细节(定位当前activity、定位哪里调用了当前的方法)

解决bug的第一步,当然是稳定的复现bug。根据我的经验,如果一个bug可以被稳定的复现,至少它就被解决了70%。通过观察bug的现象,就可以对bug做个大致的归类或者定位了。是因为数据问题?还是第三方库的问题?还或者是代码的问题?接着就是debug,看日志等常规操作了~如果经过上面的操作,你还是一筹莫展,那么请往下看。遇到bug,先观察bug现象,然后想想大概是什么原因导致的,然后尝试复现它,再调试它,处理它。

wy313622821的博客 2322

Android开发主要bug汇总

------vs2010生成项目错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 原因:没有Main函数或者WinMain函数文件。此时应该添加一个Main函数文件,拖一个Main函数文件进去是没有用的。 这个是由于日志文件引起的,可以将项目\属性\配置属性\清单工具\输入和输出\嵌入清单:原来是“是”,改成“否”。  ---

zcdreaming的专栏 1161

修复Android9原生bug-->无锁屏唤醒与第三方锁屏右滑解锁大概率性ui不更新

在mtk android9的平台上,一个第三方的apk设置为默认的桌面后(或在开机向导界面),在无锁屏的情况下,休眠后马上按电源键唤醒,比较大的概率出现点击或滑动界面无反应,通过调试后发现ViewRootImpl.java中的draw()方法中返回后造成的。surface.isValid()) { //快速休眠唤醒后view调用到这里会直接返回。在网上查到说是google的一个path造成的。// 屏蔽以下的代码即可,如下所示。解决这个问题可按如下修改。

qq_48192676的博客 823

Android M原生BUG,手机使用过程中SystemServer空指针异常导致手机重启

一、问题现象 手机正常使用过程中重启 二、问题分析 问题代码:NetworkPolicyManagerService.java:2381

寻箫之音 2124

Android 开发中常见bug 总结

密码形式 EditText 的 Hint 字体显示 异常EditText password = (EditText) findViewById(R.id.register_password_text); password.setTypeface(Typeface.DEFAULT); password.setTransformationMethod(new PasswordTransformation

BoBoMEe 2192

原生 android 5.0,Android 5.0原生bug及修补方法

Android 5.0原生bug及修复方法Android 5.0已经来了,这个版本改动非常大,也意味着会有更多的bug隐藏在其中,我会在这篇文章中一直更新自己遇到的原生bug及修复方法。1、bug1现象:5.0中ActivityManagerService.keyguardWaitingForActivityDrawn()接口替换了4.4中ActivityManagerService.dismi...

weixin_33397994的博客 433

Android开发中BUG、错误汇总(不断更新)

1、自定义Toolbar布局的时候左边始终留有一小段空白,就像这样:    Google了一下,发现很多答案是这样:  引入:  xmlns:app="http://schemas.Android.com/apk/res-auto"  然后利用: app:contentInsetLeft="0dp" app:contentInsetStart="0dp"1212 我试了试,不

静静人生 625
上一篇: 版本字符串比较工具接口&&常用接口函数
下一篇: Fragment Or DialogFragment Can not perform this action after onSaveInstanceState
voidreturn
博客等级 码龄10年 53粉丝 45原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值