- 想进一步了解Binder,可查看Binder系列—开篇,Binder系列花费了13篇文章的篇幅,从源码角度出发来讲述Driver、Native、Framework、App四个层面的整个完整流程。根据有些读者反馈这个系列还是不好理解,这个binder涉及的层次跨度比较大,知识量比较广,建议大家先知道binder是用于进程间通信,有个大致概念就可以先去学习系统基本知识,等后面有一定功力再进一步深入研究Binder机制。
Binder原理篇
- Binder系列-开篇 - Gityuan博客 | 袁辉辉的Android博客
- Binder系列3-启动ServiceManager - Gityuan博客 | 袁辉辉的Android博客
- Binder系列4-获取ServiceManager - Gityuan博客 | 袁辉辉的Android博客
- Binder系列5-注册服务(addService) - Gityuan博客 | 袁辉辉的Android博客
- Binder系列6-获取服务(getService) - Gityuan博客 | 袁辉辉的Android博客
- Binder系列7-framework层分析 - Gityuan博客 | 袁辉辉的Android博客
- 进程的Binder线程池工作过程 - Gityuan博客 | 袁辉辉的Android博客
- 彻底理解Android Binder通信架构
- Binder系列10-总结 - Gityuan博客 | 袁辉辉的Android博客
- Binder IPC的权限控制 - Gityuan博客 | 袁辉辉的Android博客
- Binder死亡通知机制之linkToDeath - Gityuan博客 | 袁辉辉的Android博客
Binder驱动篇:
Binder使用篇:
3.2 Socket
Socket通信方式也是C/S架构,比Binder简单很多。在Android系统中采用Socket通信方式的主要有:
- zygote:用于孵化进程,system_server创建进程是通过socket向zygote进程发起请求;
- installd:用于安装App的守护进程,上层PackageManagerService很多实现最终都是交给它来完成;
- lmkd:lowmemorykiller的守护进程,Java层的LowMemoryKiller最终都是由lmkd来完成;
- adbd:这个也不用说,用于服务adb;
- logcatd:这个不用说,用于服务logcat;
- vold:即volume Daemon,是存储类的守护进程,用于负责如USB、Sdcard等存储设备的事件处理。
等等还有很多,这里不一一列举,Socket方式更多的用于Android framework层与native层之间的通信。Socket通信方式相对于binder比较简单,这里省略。
3.3 Handler
Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信,Handler消息机制是由一组MessageQueue、Message、Looper、Handler共同组成的,为了方便且称之为Handler消息机制。
有人可能会疑惑,为何Binder/Socket用于进程间通信,能否用于线程间通信呢?答案是肯定,对于两个具有独立地址空间的进程通信都可以,当然也能用于共享内存空间的两个线程间通信,这就好比杀鸡用牛刀。接着可能还有人会疑惑,那handler消息机制能否用于进程间通信?答案是不能,Handler只能用于共享内存地址空间的两个线程间通信,即同进程的两个线程间通信。很多时候,Handler是工作线程向UI主线程发送消息,即App应用中只有主线程能更新UI,其他工作线程往往是完成相应工作后,通过Handler告知主线程需要做出相应地UI更新操作,Handler分发相应的消息给UI主线程去完成,如下图:
由于工作线程与主线程共享地址空间,即Handler实例对象mHandler位于线程间共享的内存堆上,工作线程与主线程都能直接使用该对象,只需要注意多线程的同步问题。工作线程通过mHandler向其成员变量MessageQueue中添加新Message,主线程一直处于loop()方法内,当收到新的Message时按照一定规则分发给相应的handleMessage()方法来处理。所以说,Handler消息机制用于同进程的线程间通信,其核心是线程间共享内存空间,而不同进程拥有不同的地址空间,也就不能用handler来实现进程间通信。
上图只是Handler消息机制的一种处理流程,是不是只能工作线程向UI主线程发消息呢,其实不然,可以是UI线程向工作线程发送消息,也可以是多个工作线程之间通过handler发送消息。更多关于Handler消息机制文章:
要理解framework层源码,掌握这3种基本的进程/线程间通信方式是非常有必要,当然Linux还有不少其他的IPC机制,比如共享内存、信号、信号量,在源码中也有体现,如果想全面彻底地掌握Android系统,还是需要对每一种IPC机制都有所了解。
四、核心提纲
博主对于Android从系统底层一路到上层都有自己的理解和沉淀,通过前面对系统启动的介绍,相信大家对Android系统有了一个整体观。接下来需抓核心、理思路,争取各个击破。后续将持续更新和完善整个大纲,不限于进程、内存、IO、系统服务架构以及分析实战等文章。
当然本站有一些文章没来得及进一步加工,有时间根据大家的反馈,不断修正和完善所有文章,争取给文章,再进一步精简非核心代码,增加可视化图表以及文字的结论性分析。基于Android 6.0的源码,专注于分享Android系统原理、架构分析的原创文章。
建议阅读群体: 适合于正从事或者有兴趣研究Android系统的工程师或者技术爱好者,也适合Android App高级工程师;对于尚未入门或者刚入门的App工程师阅读可能会有点困难,建议先阅读更基础的资料,再来阅读本站博客。
看到Android整个系统架构是如此庞大的, 该问如何学习Android系统, 以下是我自己的Android的学习和研究论,仅供参考如何自学Android。
从整理上来列举一下Android系统的核心知识点概览:
4.1 系统启动系列
Android系统启动-概述: Android系统中极其重要进程:init, zygote, system_server, servicemanager 进程:
- Android系统启动-Init篇 - Gityuan博客 | 袁辉辉的Android博客
- Android系统启动-zygote篇 - Gityuan博客 | 袁辉辉的Android博客
- Android系统启动-SystemServer上篇 - Gityuan博客 | 袁辉辉的Android博客
- Android系统启动-SystemServer下篇 - Gityuan博客 | 袁辉辉的Android博客
- Binder系列3-启动ServiceManager - Gityuan博客 | 袁辉辉的Android博客
- 理解Android进程创建流程 - Gityuan博客 | 袁辉辉的Android博客
再来看看守护进程(也就是进程名一般以d为后缀,比如logd,此处d是指daemon的简称), 下面介绍部分守护进程:
4.2 系统稳定性系列
Android系统稳定性主要是异常崩溃(crash)和执行超时(timeout),:
- 理解Android ANR的触发原理
- Input系统-ANR原理分析 - Gityuan博客 | 袁辉辉的Android博客
- 理解Android ANR的信息收集过程
- 解读Java进程的Trace文件 - Gityuan博客 | 袁辉辉的Android博客
- Native进程之Trace原理 - Gityuan博客 | 袁辉辉的Android博客
- WatchDog工作原理 - Gityuan博客 | 袁辉辉的Android博客
- 理解Android Crash处理流程
- 理解Native Crash处理流程
- global reference限制策略
4.3 Android进程系列
进程/线程是操作系统的魂,各种服务、组件、子系统都是依附于具体的进程实体。深入理解进程机制对于掌握Android系统整体架构和运转机制是非常有必要的,是系统工程师的基本功,下面列举进程相关的文章:
- 理解Android进程创建流程 - Gityuan博客 | 袁辉辉的Android博客
- 理解杀进程的实现原理 - Gityuan博客 | 袁辉辉的Android博客
- Android四大组件与进程启动的关系 - Gityuan博客 | 袁辉辉的Android博客
- Android进程绝杀技–forceStop - Gityuan博客 | 袁辉辉的Android博客
- 理解Android线程创建流程 - Gityuan博客 | 袁辉辉的Android博客
- 彻底理解Android Binder通信架构
- 进程的Binder线程池工作过程 - Gityuan博客 | 袁辉辉的Android博客
- Android进程生命周期与ADJ - Gityuan博客 | 袁辉辉的Android博客
- Android LowMemoryKiller原理分析
- 进程优先级 - Gityuan博客 | 袁辉辉的Android博客
- Android进程调度之adj算法 - Gityuan博客 | 袁辉辉的Android博客
- 进程篇-进程整理 - Gityuan博客 | 袁辉辉的Android博客
4.4 四大组件系列
对于App来说,Android应用的四大组件Activity,Service,Broadcast Receiver, Content Provider最为核心,接下分别展开介绍:
- startActivity启动过程分析 - Gityuan博客 | 袁辉辉的Android博客
- 简述Activity生命周期 - Gityuan博客 | 袁辉辉的Android博客
- startService启动过程分析 - Gityuan博客 | 袁辉辉的Android博客
- bindService启动过程分析 - Gityuan博客 | 袁辉辉的Android博客
- 彻底理解Android Binder通信架构
- Android Broadcast广播机制分析
- 理解ContentProvider原理 - Gityuan博客 | 袁辉辉的Android博客
- ContentProvider引用计数 - Gityuan博客 | 袁辉辉的Android博客
- Activity与Service生命周期 - Gityuan博客 | 袁辉辉的Android博客
- 简述Activity与Window关系 - Gityuan博客 | 袁辉辉的Android博客
- 四大组件之综述 - Gityuan博客 | 袁辉辉的Android博客
- 四大组件之ServiceRecord - Gityuan博客 | 袁辉辉的Android博客
- 四大组件之BroadcastRecord - Gityuan博客 | 袁辉辉的Android博客
- 四大组件之ContentProviderRecord - Gityuan博客 | 袁辉辉的Android博客
- 理解Android Context
- 理解Application创建过程 - Gityuan博客 | 袁辉辉的Android博客
- unbindService流程分析 - Gityuan博客 | 袁辉辉的Android博客
- 四大组件之ActivityRecord - Gityuan博客 | 袁辉辉的Android博客
- AMS总结(一) - Gityuan博客 | 袁辉辉的Android博客
4.5 图形系统系列
图形也是整个系统非常复杂且重要的一个系列,涉及WindowManager,SurfaceFlinger服务。
- WMS-启动过程 - Gityuan博客 | 袁辉辉的Android博客
- WMS-启动窗口(StartingWindow) - Gityuan博客 | 袁辉辉的Android博客
- 以Window视角来看startActivity - Gityuan博客 | 袁辉辉的Android博客
- Android图形系统概述 - Gityuan博客 | 袁辉辉的Android博客
- SurfaceFlinger启动篇 - Gityuan博客 | 袁辉辉的Android博客
- SurfaceFlinger绘图篇 - Gityuan博客 | 袁辉辉的Android博客
- Choreographer原理 - Gityuan博客 | 袁辉辉的Android博客
4.6 系统服务篇
再则就是在整个架构中有大量的服务,都是基于Binder来交互的,Android系统服务的注册过程也是在此之上的构建的。计划针对部分核心服务来重点分析:
- ActivityManagerService启动过程 - Gityuan博客 | 袁辉辉的Android博客
- Input系统-启动篇 - Gityuan博客 | 袁辉辉的Android博客
- Input系统-InputReader线程 - Gityuan博客 | 袁辉辉的Android博客
- Input系统-InputDispatcher线程 - Gityuan博客 | 袁辉辉的Android博客
- Input系统-UI线程 - Gityuan博客 | 袁辉辉的Android博客
- Input系统-事件处理全过程 - Gityuan博客 | 袁辉辉的Android博客
- Input系统-ANR原理分析 - Gityuan博客 | 袁辉辉的Android博客
- http://gityuan.com/2016/11/06/packagemanagerservice)
- Installd守护进程 - Gityuan博客 | 袁辉辉的Android博客)
- 理解AlarmManager机制 - Gityuan博客 | 袁辉辉的Android博客
- 理解JobScheduler机制 - Gityuan博客 | 袁辉辉的Android博客
- Android耗电统计算法 - Gityuan博客 | 袁辉辉的Android博客
- DropBoxManager启动篇 - Gityuan博客 | 袁辉辉的Android博客
- 多用户管理UserManager - Gityuan博客 | 袁辉辉的Android博客
- 更多系统服务,敬请期待
4.7 内存&&存储篇
-
内存篇
-
存储篇
-
Linux驱动篇
-
敬请期待
-
dalvik/art
4.8 工具篇
再来说说Android相关的一些常用命令和工具以及调试手段.
- 理解Android编译命令 - Gityuan博客 | 袁辉辉的Android博客
- 理解Android.bp - Gityuan博客 | 袁辉辉的Android博客
- 性能工具Systrace - Gityuan博客 | 袁辉辉的Android博客
- Android内存分析命令 - Gityuan博客 | 袁辉辉的Android博客
- ps进程命令 - Gityuan博客 | 袁辉辉的Android博客
- Am命令用法 - Gityuan博客 | 袁辉辉的Android博客
- Pm命令用法 - Gityuan博客 | 袁辉辉的Android博客
- 调试系列1:bugreport源码篇 - Gityuan博客 | 袁辉辉的Android博客
- 调试系列2:bugreport实战篇 - Gityuan博客 | 袁辉辉的Android博客
- dumpsys命令用法 - Gityuan博客 | 袁辉辉的Android博客
- Android logd日志原理
- 介绍gdb调试工具 - Gityuan博客 | 袁辉辉的Android博客
- 介绍addr2line调试命令 - Gityuan博客 | 袁辉辉的Android博客
4.9 实战篇
下面列举处理过的部分较为典型的案例,供大家参考
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/744405e78af71267ddd6bc97c7ba880e.jpeg)
尾声
面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。
不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
Android进阶学习资料库
一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
大厂面试真题
PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
《2017-2021字节跳动Android面试历年真题解析》
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-OBcpKqYl-1712437781324)]
《2017-2021字节跳动Android面试历年真题解析》
[外链图片转存中…(img-cLKPNWuX-1712437781324)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!