热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android系统稳定性分析

分析Android问题时,经常会遇到一些稳定性问题。什么是稳定性问题呢,我归结有以下特点,非必现问题,或没有找到复现路径的问题。其实没有非必现问题,只有找不到复现方法。系统越

分析Android问题时,经常会遇到一些稳定性问题。什么是稳定性问题呢,我归结有以下特点,

非必现问题,或没有找到复现路径的问题。其实没有非必现问题,只有找不到复现方法。系统越复杂这类问题越多,因为软件路径太多了。

应用的死机重启。这类问题不能简单的归结为应用问题,毕竟应用是跑在系统上的。当应用开发人员无法分析出问题时,可能就会认为是稳定性问题。

系统死机重启。Android开发还是偏重应用的,这样导致系统开发人员较少。很多时候碰到这类问题就找不到分析方法,也就归到稳定性上。起始这类问题与Linux系统上的分析方法并没有太大却别,只不过深入底层的人越来越少了。

原生代码的问题。Android原生代码也是有bug的,因为这部分代码没人动,也就很少有人研究。最后又归到稳定性上。

性能问题。有时性能问题也会归到稳定性上,例如正常情况下某应用启动很快,在某种情况下启动很慢,这很可能就是性能导致的。我认为性能问题和稳定性问题不能混为一谈,二者的分析方法有很大差别。

没人愿意深入研究的问题。各模块都不承认是自己的问题,相互扯皮。因为没有人从系统角度上来分析问题,也不进行深入研究,觉得还是归到稳定性好些。

简单来说就是其他模块解决不了的或不愿意解决的就是稳定性问题。有真正的稳定性问题吗?我觉得严格来说时没有的,问题最终的根本原因总会落在一个模块上,也就是有主的。但是,Android系统真的是一个非常复杂的系统,不能要求每个开发人员都能了解整个系统。所以这类复杂的系统性问题还是交给一些资深的开发人员解决更好些。这也就对分析稳定性问题的人员要求较高,需要对系统有整体的概念,并且对许多模块有深入研究。我认为将稳定性问题改为系统问题会更加准确,解决稳定性问题的开发人员也应该是系统工程师。

成为一名Android系统工程师

我建议分析稳定性问题最好由资深工程师或系统工程师来进行,成为一个合格的Android系统工程师需要掌握以下知识点,

Linux Kernel基本的工作机制,如进程调度,进程空间,内存管理,文件系统等等。

Linux应用开发,如系统调用,IPC通信,多线程开发,常用的库等等。

Linux Kernel常用的调试手段,如crash,ftrace,kmemleak,kprobe,kgdb,trace32,perf,procfs,sysfs,debugfs等等

Linux应用常用的调试手段,如gdb,strace,ltrace,Valgrind,gprof,mtrace,iperf,blktrace,fio等等。

辅助系统的工作原理,如Bootloader,Recovery,DTB,busybox等等。

Android框架和基本原理。

Android Framework中主要模块的工作机制,包括Activity,Window,Package,Input,Storage,Audio,Media,Surface等等。

Android IPC通信(Binder)的原理和实现。

Android中日志收集手段的原理,包括logcat,ANR,Tombstones,Watchdog,GC等等。

Android中常用的调试手段,如Bionic的内存检测,LMK机制,Asan,Systrace,oatdump,dumpsys,dumpstate等等。

Android Studio中常用的调试工具,如Profiler,Systrace,TraceView,Heap Viewer,Allocation Tracker,Memory Monitor,Layout Inspector,MAT等等。

了解编译相关的工具,如LLVM,Makefiel,Android Make,Soong,Gradle,工具链,镜像制作,ota打包等等。

上面这么多,我感觉还没有好多没提到,目前只能想到这些。不需要全部精通,那是神人要做的。凡人要做到都有基本的了解,精通其中几个模块,否则给人一知半解的感觉,但做到这样也是不容易。掌握了上述的知识(这个要求有点高),就可以成为一名Android系统工程师了。但这离优秀的系统工程师还差很远,要想成为优秀必须有以下的品质。

三心:细心,耐心,恒心。复杂问题可能需要很长时间才能解决,要耐得住寂寞,并且不放过任何一个线索。

敢于挑战困难。复杂的问题一定经过了许多人的分析还没有结论,害怕了就一步也迈不出去。

快速的学习能力。稳定性问题遍布整个系统,可能经常会分析到陌生的模块,学习能力差就会影响问题解决。要不有一张快速的嘴到处问问,也不失为一种方法。

较强的逻辑思维。很多问题都是绕来绕去,很容易晕菜。

不走寻常路。遇到困难时,跳出来,换一种方法也许就解决了。

运气。这东西在哪里都很重要,有些问题就是碰出解决方案的,实际上并不不是完全的运气,但运气真的很重要。

写完这些,我想很少人想成为Android系统工程师了,我也想找一个三板斧就能混个高薪水的工作。

稳定性问题分析方法
稳定性问题千奇百怪,而且大部分都很难定位。我这里试图去总结一下各类问题的分析流程,这些不是标准,只是我的经验。先根据问题的表现分下类,

有稳定复现路径的问题。

偶现问题,且Debug信息足够。

偶现问题,且Debug信息不足。

不能复现的问题。

关于Debug信息,一部分是标准Android带有的logcat输出,ANR日志,tombstone日志,watchdog日志等。另一部分是系统开发商附加的。好的系统开发商能提供丰富的Debug信息,在问题发生时一同抓取上报。这些信息可能包括kernel log,dumpsys中的部分信息,Binder信息,详细的CPU内存信息,IO信息,调度信息,corefile,vmcore等等。厂商的不同,这些信息也会不同。下面根据问题的不同分别讲述一下。

有稳定复现路径的问题:

如果一个问题能有稳定的复现路径,解决问题就变得容易很多。

这类问题不论Debug信息的多少,都能找根本原因。因为能复现,就可以不断的增加Debug信息。

严格来说这类问题不能称为稳定性问题,但依然占据稳定性问题的多数。

偶现问题,且Debug信息足够:

仅使用Android标准的Debug信息就可以定位问题时,都比较容易解决,也不会太复杂。对系统有很好的理解,并且会分析栈信息可能就够用了。但可能需要分析源码来确定根本原因。

需要借助厂商附加的Debug信息定位问题时,问题会相对复杂。

面对复杂问题时,可能需要仔细分析不同的Debug信息,在它们之间找到关联。尽可能的搜索相关线索,这样才能找到根本原因。

有时可能能根据Debug信息定位到代码段,但真正的根本原因还需要分析代码逻辑才能确定。不要轻易下手修改代码,尤其是原生代码。

定位到原生代码出问题时,先在网上找一下是否有人给出Patch,相信你不可能是第一个碰到这种问题的人。

编写测试代码来验证你的解决方案。

偶现问题,且Debug信息不足:

Debug信息不够用时就麻烦了,这也是我认为最难解决的问题。

试图寻找复现路径,让问题变为有稳定复现路径的问题。

在怀疑点增加Debug信息,等待下一次复现。

根据怀疑点分析代码逻辑,试图使用测试代码来复现该问题。

根据core文件中的内存镜像来获取更多的有用信息。

仔细分析现有的Debug信息,往往一小句话就有很大的惊喜。

注意CPU,Memory,IO的状态对系统的影响。

怀疑内存问题时可以使用内存检测工具来检查一遍当前系统隐含的内存问题。

有时代码检查工具也能规避很多问题,提交前没有检查的最好检查一下。

问题很可能不是第一现场,先解决系统之前的错误,后面的错误可能就跟随解决。

同样的,在网上搜索是否有类似问题的解决方案。

总体来说,这类问题就是尝试各种方法来解决目前无法解决的问题。

不能复现的问题:

此类问题既然无法复现,也就不重要了。

如果可以根据Debug信息解决固然很好,不能解决时可以先降低优先级。

等待该问题变成偶先问题时,就可以根据上述方法分析了


推荐阅读
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 在Android开发中,通过调用系统内置的音频和视频播放功能,可以实现高效、便捷的多媒体处理。本文将详细介绍如何利用Android系统的媒体播放器组件,实现对音频和视频文件的播放控制,包括基本的播放、暂停、停止等操作,以及如何处理播放过程中的各种事件,确保应用的稳定性和用户体验。 ... [详细]
  • HTML5 Web存储技术是许多开发者青睐本地应用程序的重要原因之一,因为它能够实现在客户端本地存储数据。HTML5通过引入Web Storage API,使得Web应用程序能够在浏览器中高效地存储数据,从而提升了应用的性能和用户体验。相较于传统的Cookie机制,Web Storage不仅提供了更大的存储容量,还简化了数据管理和访问的方式。本文将从基础概念、关键技术到实际应用,全面解析HTML5 Web存储技术,帮助读者深入了解其工作原理和应用场景。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 在数据库开发中,`DROP`、`TRUNCATE` 和 `DELETE` 语句各有其特定的应用场景和行为特点。`DELETE` 语句通过逐行删除数据,并将每个删除操作记录为事务,适用于需要保留事务日志和触发器的场景。相比之下,`TRUNCATE` 语句则会快速清空整个表,不记录单个删除操作,因此执行速度更快,但无法恢复已删除的数据。而 `DROP` 语句不仅删除表中的所有数据,还会删除表结构本身,通常用于不再需要表结构的情况。了解这些区别有助于开发者在实际应用中选择合适的操作方式。 ... [详细]
  • 本文详细解析了 MySQL 5.7.20 版本中二进制日志(binlog)崩溃恢复机制的工作流程。假设使用 InnoDB 存储引擎,并且启用了 `sync_binlog=1` 配置,文章深入探讨了在系统崩溃后如何通过 binlog 进行数据恢复,确保数据的一致性和完整性。 ... [详细]
  • 在开发Xamarin.Forms应用程序时,遇到了使用Entity Framework Core 3.0访问SQLite数据库时 `Database.MigrateAsync` 方法调用的问题。本文详细探讨了该问题的根源,并提供了一种有效的解决方案,确保数据库迁移能够顺利执行。此外,还介绍了如何配置和优化EF Core以提高应用性能和稳定性。 ... [详细]
  • Therearelotsofexamplesofundefinedunspecifiedbehaviorwhendoingpointerarithmetics-pointe ... [详细]
author-avatar
Jes潔絲琳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有