Android系统正常启动流程以及异常问题处理流程

Android 系统从开机到正常启动的流程可以分为以下几个阶段:

  1. 加电自检(Power-On Self-Test,POST):当用户按下设备的电源键时,设备会进行加电自检,检查硬件设备是否正常。如果硬件设备正常,设备将加载启动程序并开始启动 Android 系统。

  2. 引导加载程序(Bootloader):启动程序是一个小型的程序,其主要任务是加载引导加载程序(bootloader)。引导加载程序是设备上的第一个软件程序,它负责初始化设备硬件,并加载 Android 系统内核。在加载内核之前,引导加载程序会对内存进行测试,并初始化必要的硬件设备,如存储器、显示屏、触摸屏等。

  3. 内核启动:当引导加载程序完成初始化后,它会加载 Android 系统内核。内核是操作系统的核心部分,它管理设备的硬件和软件资源,并提供与硬件交互的接口。在内核启动时,它会检查硬件设备是否支持 Android 系统,并加载相应的驱动程序。同时,内核会启动 init 进程,init 进程是 Android 系统中的第一个用户级进程,它负责初始化系统服务和启动其他进程。

  4. 设备初始化:在内核启动后,Android 系统会进行一系列的初始化操作,包括加载驱动程序、初始化文件系统、创建系统目录和文件等。此外,Android 系统还会启动 Zygote 进程,Zygote 进程是一个特殊的进程,它用于预加载常用的 Java 类和库,以加速应用程序的启动。

  5. 系统启动:当设备完成初始化后,Android 系统会启动系统服务和用户界面。系统服务包括各种管理和控制设备硬件和软件资源的服务,如电源管理、WIFI 管理、通信管理等。用户界面则包括 Launcher、系统设置、应用程序、通知等。

  6. 应用程序启动:最后,Android 系统会启动应用程序。当用户启动应用程序时,系统会加载应用程序代码和资源,并创建应用程序的进程。应用程序进程运行在沙箱环境中,与其他进程相互隔离,保证应用程序的安全性和稳定性。

总之,Android 系统从开机到正常启动的流程可以分为加电自检、引导加载程序、内核启动、设备初始化、系统启动和应用程序启动等阶段,每个阶段都有其特定的任务和功能,共同构成了 Android 系统的启动过程。

Android系统异常问题处理

1. addr2line工具


作用:把native的出错堆栈信息对应到代码的行数
通过find . -name * addr2line来搜索这个工具
查看出错的堆栈信息,xx.so库出问题,然后分析这个库的堆栈信息
根据出错的二进制地址和出错的库名就可以使用addr2line找出错误的行数
命令:addr2line  /xx.so  0015b6d5然后回车
然后继续看错误堆栈

2. Android死机

观察死机之前的log信息,一般都会有堆栈信息打印,根据这些堆栈信息找到哪个函数或者方法引起
一般先检查是不是内核异常死机,包括CPU和内存是否用完
再看看getevent是否上报,如果不上报,找出不上报原因(获取 input 输入事件,比如获取按键上报信息、获取触摸屏上报信息等)
或者看看inputDispatch是否出现异常导致无法分发事件
如果event没有问题,去分析surfacefinger和LCD驱动,看看是不是界面没有刷新导致的死机问题

3. android系统重启


分为三类,分别是内核重启,modem重启,framework重启
怎么判断是哪类?
3.1 通过重启时间来判断,如果是内核重启和modem重启,那么重启的时间肯定比上层重启的时间长
3.2 看看重启是否有震动,如果有,就是内核重启或者modem重启,反之是framework重启
3.3 通过ps进程号来判断,如果是framework重启,zygote、servicemanager等的进程号比较大,正常来说zygote的进程号是500左右,如果出现问题的时候,进程号是1000多,framework就得重启
内核重启的标志:sysreboot reason:software EXCE AP,导致它的原因主要是kernel代码出现异常和硬件狗复位
对应kernel代码出现异常,主要是指kernel主动panic或者被动panic,这种情况一般是出现了踩内存、非法指针等错误
medem重启的log:sysreboot reason:software EXCE AP和kernel差不多

framework的重启原因:
1. native crash引起的重启
一般会在tombstone目录下面找到相关的log
2. watchdog杀死systemserver系统进程引起的重启
需要分析anr里面的trace.txt文件,这类问题一般是死锁,首先是搜索system_server,如果没有搜索到,表示这个anr已经被覆盖,这时候去dropbox找到对应时间的文件,到搜索到system_server相关信息后,log会显示阻塞在什么地方,然后跟着它的阻塞的路径,一直追,知道找到真正触发阻塞的原因,这种异常重点关注时间点,一般在这个时间点之前一定有异常出现
3. systemserver进程出现了其他exception引起的重启
比较容易比如空指针等

4. 系统启动异常


与framework相关的有三种
1 按电源键,系统无法启动,没有任何反应
一般是硬件故障,需要硬件帮忙
2 按电源键,有反应,但是一直停在开机第一个静态界面,即kernel开机界面
一般是内核问题,需要kernel分析
3 按电源键,有反应,一直停在开机动画界面。即一直停在bootanimation
一般是开机时各种异常所致
可以通过如下步骤定位

1 确定是否进入了zygote进程
log: START com.android.internal.os.ZygoteInit uid
2 如果进入了zygote进程,确定是否进入了systemserver进程
log: Entered the android system server!
3 如果也进入了systemserver进程,再确定进程里的ams服务、wms服务等是否出现问题
adb shell dumpsys activity
adb shell dumpsys window


android系统开机,一直停在开机第一个静态界面,如何进行kernel问题分析

当 Android 系统无法正常启动并且停留在开机第一个静态界面时,可能是由于内核(Kernel)出现了问题导致的。下面是一些可能的解决方案和 Kernel 问题分析方法:

  1. 检查内核启动日志:当 Android 系统启动时,内核会生成一份启动日志(Kernel Log),其中包含了内核启动过程中的各种信息和错误消息。可以通过以下命令查看内核启动日志:

    adb shell dmesg

    通过查看内核启动日志,可以了解系统启动过程中是否出现了错误或异常,以及导致错误或异常的原因。

  2. 检查硬件问题:Kernel 问题可能是由于硬件问题导致的,例如存储器故障、电源供应问题等。可以通过以下方法检查硬件问题:

    • 使用 Android 系统自带的硬件诊断工具;
    • 检查设备是否有未修复的硬件问题,例如裂纹、水患等;
    • 将设备连接到另一台计算机并尝试启动,以查看问题是否是由于设备硬件或软件的兼容性问题导致的。
  3. 恢复出厂设置:如果无法找到内核问题的原因,可以尝试恢复出厂设置以解决问题。这将抹掉设备上的所有数据,并将系统恢复到出厂设置。恢复出厂设置可能会解决由于软件问题导致的内核问题。

  4. 刷入新的系统固件:如果上述方法无法解决问题,可以尝试刷入新的系统固件以解决内核问题。在刷入新的系统固件之前,请确保备份了设备上的所有数据,并确保刷入的固件与设备型号和硬件兼容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 第1章 Activity的生命周期和启动模式 1 1.1 Activity的生命周期全面分析 1 1.1.1 典型情况下的生命周期分析 2 1.1.2 异常情况下的生命周期分析 8 1.2 Activity的启动模式 16 1.2.1 Activity的LaunchMode 16 1.2.2 Activity的Flags 27 1.3 IntentFilter的匹配规则 28 第2章 IPC机制 35 2.1 Android IPC简介 35 2.2 Android中的多进程模式 36 2.2.1 开启多进程模式 36 2.2.2 多进程模式的运行机制 39 2.3 IPC基础概念介绍 42 2.3.1 Serializable接口 42 2.3.2 Parcelable接口 45 2.3.3 Binder 47 2.4 Android中的IPC方式 61 2.4.1 使用Bundle 61 2.4.2 使用文件共享 62 2.4.3 使用Messenger 65 2.4.4 使用AIDL 71 2.4.5 使用ContentProvider 91 2.4.6 使用Socket 103 2.5 Binder连接池 112 2.6 选用合适的IPC方式 121 第3章 View的事件体系 122 3.1 View基础知识 122 3.1.1 什么是View 123 3.1.2 View的位置参数 123 3.1.3 MotionEvent和TouchSlop 125 3.1.4 VelocityTracker、GestureDetector和Scroller 126 3.2 View的滑动 129 3.2.1 使用scrollTo/scrollBy 129 3.2.2 使用动画 131 3.2.3 改变布局参数 133 3.2.4 各种滑动方式的对比 133 3.3 弹性滑动 135 3.3.1 使用Scroller 136 3.3.2 通过动画 138 3.3.3 使用延时策略 139 3.4 View的事件分发机制 140 3.4.1 点击事件的传递规则 140 3.4.2 事件分发的源码解析 144 3.5 View的滑动冲突 154 3.5.1 常见的滑动冲突场景 155 3.5.2 滑动冲突的处理规则 156 3.5.3 滑动冲突的解决方式 157 第4章 View的工作原理 174 4.1 初识ViewRoot和DecorView 174 4.2 理解MeasureSpec 177 4.2.1 MeasureSpec 177 4.2.2 MeasureSpec和LayoutParams的对应关系 178 4.3 View的工作流程 183 4.3.1 measure过程 183 4.3.2 layout过程 193 4.3.3 draw过程 197 4.4 自定义View 199 4.4.1 自定义View的分类 200 4.4.2 自定义View须知 201 4.4.3 自定义View示例 202 4.4.4 自定义View的思想 217 第5章 理解RemoteViews 218 5.1 RemoteViews的应用 218 5.1.1 RemoteViews在通知栏上的应用 219 5.1.2 RemoteViews在桌面小部件上的应用 221 5.1.3 PendingIntent概述 228 5.2 RemoteViews的内部机制 230 5.3 RemoteViews的意义 239 第6章 Android的Drawable 243 6.1 Drawable简介 243 6.2 Drawable的分类 244 6.2.1 BitmapDrawable 244 6.2.2 ShapeDrawable 247 6.2.3 LayerDrawable 251 6.2.4 StateListDrawable 253 6.2.5 LevelListDrawable 255 6.2.6 TransitionDrawable 256 6.2.7 Ins
目录 第1章 Activity的生命周期和启动模式 / 1 1.1 Activity的生命周期全面分析 / 1 1.1.1 典型情况下的生命周期分析 / 2 1.1.2 异常情况下的生命周期分析 / 8 1.2 Activity的启动模式 / 16 1.2.1 Activity的Launch Mode / 16 1.2.2 Activity的Flags / 27 1.3 Intent Filter的匹配规则 / 28 第2章 IPC机制 / 35 2.1 Android IPC简介 / 35 2.2 Android中的多进程模式 / 36 2.2.1 开启多进程模式 / 36 2.2.2 多进程模式的运行机制 / 39 2.3 IPC基础概念介绍 / 42 2.3.1 Serializable接口 / 42 2.3.2 Parcelable接口 / 45 2.3.3 Binder / 47 2.4 Android中的IPC方式 / 61 2.4.1 使用Bundle / 61 2.4.2 使用文件共享 / 62 2.4.3 使用Messenger / 65 2.4.4 使用AIDL / 71 2.4.5 使用 Content Provider / 91 2.4.6 使用Socket / 103 2.5 Binder连接池 / 112 2.6 选用合适的IPC方式 / 121 第3章 View的事件体系 / 122 3.1 View基础知识 / 122 3.1.1 什么是View / 123 3.1.2 View的位置参数 / 123 3.1.3 Motion Event和Touch Slop / 125 3.1.4 VelocityT racker、Gesture Detector和Scroller / 126 3.2 View的滑动 / 129 3.2.1 使用scroll To/scroll By / 129 3.2.2 使用动画 / 131 3.2.3 改变布局参数 / 133 3.2.4 各种滑动方式的对比 / 133 3.3 弹性滑动 / 135 3.3.1 使用Scroller / 136 3.3.2 通过动画 / 138 3.3.3 使用延时策略 / 139 3.4 View的事件分发机制 / 140 3.4.1 点击事件的传递规则 / 140 3.4.2 事件分发的源码解析 / 144 3.5 View的滑动冲突 / 154 3.5.1 常见的滑动冲突场景 / 155 3.5.2 滑动冲突的处理规则 / 156 3.5.3 滑动冲突的解决方式 / 157 第4章 View的工作原理 / 174 4.1 初识View Root和Decor View / 174 4.2 理解Measure Spec / 177 4.2.1 Measure Spec / 177 4.2.2 Measure Spec和Layout Params的对应关系 / 178 4.3 View的工作流程 / 183 4.3.1 measure过程 / 183 4.3.2 layout过程 / 193 4.3.3 draw过程 / 197 4.4 自定义View / 199 4.4.1 自定义View的分类 / 200 4.4.2 自定义View须知 / 201 4.4.3 自定义View示例 / 202 4.4.4 自定义View的思想 / 217 第5章 理解Remote Views / 218 5.1 Remote Views的应用 / 218 5.1.1 Remote Views在通知栏上的应用 / 219 5.1.2 Remote Views在桌面小部件上的应用 / 221 5.1.3 Pending Intent概述 / 228 5.2 Remote Views的内部机制 / 230 5.3 Remote Views的意义 / 239 第6章 Android的Drawable / 243 6.1 Drawable简介 / 243 6.2 Drawable的分类 / 244 6.2.1 Bitmap Drawable / 244 6.2.2 Shape Drawable / 247 6.2.3 Layer Drawable / 251 6.2.4 State List Drawable / 253 6.2.5 Level List Drawable / 255 6.2.6 Transition Drawable / 256 6.2.7 Inset Drawable / 257 6.2.8 Scale Drawable / 258 6.2.9 Clip Drawable / 260 6.3 自定义Drawable / 262 第7章 Android动画深入分析 / 265 7.1 View动画 / 265 7.1.1 View动画的种类 / 265 7.1.2 自定义View动画 / 270 7.1.3 帧动画 / 272 7.2 View动画的特殊使用场景 / 273 7.2.1 LayoutAnimation / 273 7.2.2 Activity的切换效果 / 275 7.3 属性动画 / 276 7.3.1 使用属性动画 / 276 7.3.2 理解插值器和估值器 / 280 7.3.3 属性动画的监听器 / 282 7.3.4 对任意属性做动画 / 282 7.3.5 属性动画的工作原理 / 288 7.4 使用动画的注意事项 / 292 第8章 理解Window和Window Manager / 294 8.1 Window和Window Manager / 294 8.2 Window的内部机制 / 297 8.2.1 Window的添加过程 / 298 8.2.2 Window的删除过程 / 301 8.2.3 Window的更新过程 / 303 8.3 Window的创建过程 / 304 8.3.1 Activity的Window创建过程 / 304 8.3.2 Dialog的Window创建过程 / 308 8.3.3 Toast的Window创建过程 / 311 第9章 四大组件的工作过程 / 316 9.1 四大组件的运行状态 / 316 9.2 Activity的工作过程 / 318 9.3 Service的工作过程 / 336 9.3.1 Service的启动过程 / 336 9.3.2 Service的绑定过程 / 344 9.4 Broadcast Receiver的工作过程 / 352 9.4.1 广播的注册过程 / 353 9.4.2 广播的发送和接收过程 / 356 9.5 Content Provider的工作过程 / 362 第10章 Android的消息机制 / 372 10.1 Android的消息机制概述 / 373 10.2 Android的消息机制分析 / 375 10.2.1 Thread Local的工作原理 / 375 10.2.2 消息队列的工作原理 / 380 10.2.3 Looper的工作原理 / 383 10.2.4 Handler的工作原理 / 385 10.3 主线程的消息循环 / 389 第11章 Android的线程和线程池 / 391 11.1 主线程和子线程 / 392 11.2 Android中的线程形态 / 392 11.2.1 Async Task / 392 11.2.2 Async Task的工作原理 / 395 11.2.3 Handler Thread / 402 11.2.4 Intent Service / 403 11.3 Android中的线程池 / 406 11.3.1 Thread Pool Executor / 407 11.3.2 线程池的分类 / 410 第12章 Bitmap的加载和Cache / 413 12.1 Bitmap的高效加载 / 414 12.2 Android中的缓存策略 / 417 12.2.1 Lru Cache / 418 12.2.2 Disk Lru Cache / 419 12.2.3 Image Loader的实现 / 424 12.3 Image Loader的使用 / 441 12.3.1 照片墙效果 / 441 12.3.2 优化列表的卡顿现象 / 446 第13章 综合技术 / 448 13.1 使用Crash Handler来获取应用的crash信息 / 449 13.2 使用multidex来解决方法数越界 / 455 13.3 Android的动态加载技术 / 463 13.4 反编译初步 / 469 13.4.1 使用dex2jar和jd—gui反编译apk / 470 13.4.2 使用apktool对apk进行二次打包 / 470 第14章 JNI和NDK编程 / 473 14.1 JNI的开发流程 / 474 14.2 NDK的开发流程 / 478 14.3 JNI的数据类型和类型签名 / 484 14.4 JNI调用Java方法的流程 / 486 第15章 Android性能优化 / 489 15.1 Android的性能优化方法 / 490 15.1.1 布局优化 / 490 15.1.2 绘制优化 / 493 15.1.3 内存泄露优化 / 493 15.1.4 响应速度优化和ANR日志分析 / 496 15.1.5 List View和Bitmap优化 / 501 15.1.6 线程优化 / 501 15.1.7 一些性能优化建议 / 501 15.2 内存泄露分析之MAT工具 / 502 15.3 提高程序的可维护性 / 506

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值