前言
平常开发App,是将一堆组件整合在一起,满足产品的需求。但app开发的过程中经常会出现调用系统服务,自定义VIew,跨进程通信,动画...等等,这些知识点已经涉及到framework层,native层等。如果对这些知识没有积累的话,开发app,解bug的过程有时候是非常难受的。有时候根本没有思路。于是决定深入了解android体系结构。
Android整个源码系统是比较复杂的,刚开始阅读真是无从下手。在学习AMS,WindowManager,等过程中慢慢有了一些思路。于是决定探究framework层的一些东西,整个过程估计是个比较痛苦的过程,但我已经做好了准备。
图1-Android体系框架图
学习思路
1.使用AS静态阅读代码,要能快速找到相关实现代码,比如一个service,它的实现代码(aidl接口的实现),代理类代码
2.debug, debug & debug动态跟踪android framework代码
3.安卓好多功能都是C/S架构,调用端跟服务端通过binder通信
4.熟悉aidl的设计特点以及使用过程
5.因为系统服务都跑在system_server进程,所以从进程的角度理解
6.framework层也用到好多设计模式,如经常用的代理模式
7.framework有好多系统服务,熟悉这些服务的注册/获取过程
图2-安卓源码结构
图2为安卓源码部分结构,从上到下:
1.frameworks:framework层的主要代码,
系统好多服务的实现都在/framework/base/service下如:ams/pms/AlarmManagerService...
2.out:编译源码,所有的编译结果,如jar包,image文件等
3.package:所有系统app的源码
系统服务
Framework层有大量的系统服务实现代码。这些服务的实现结构大都是类似的,所以后边会已我们最长用的AMS为例子展开学习。一个系统服务要为系统其它进程提供服务,需要向系统注册自己,这样其它进程会通过getSystemService接口拿到该服务。匿名服务既我们定义的服务不需要向系统注册,因为该服务只限于当前使用场景。
1.系统服务的启动时机
系统启动时,Zygote会fork出system_server进程,该进程中会启动各类系统服务(用户空间的第一个进程init进程会fork出Zygote进程和SystemServer进程)
类位置:/frameworks/base/core/services/java/com/android/server/SystemServer.java
* The main entry point from zygote. */ public static void main(String[] args) { new SystemServer().run(); }run方法中具体启动服务
// Start services. try { startBootstrapServices(); startCoreServices(); startOtherServices(); } catch (Throwable ex) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting system services", ex); throw ex; }
2.系统服务所在的进程
system_server进程,该进程是系统最重要的进程之一,如果该进程挂了,手机直接重启。
通过 ps -t pid可以查看该进程中的线程情况。
shell@frank:/ $ ps | grep system_server
system 1704 305 1780080 107904 sys_epoll_ 00000000 S system_server
shell@frank:/ $
shell@frank:/ $
shell@frank:/ $ ps -t 1704
USER PID PPID VSIZE RSS WCHAN PC NAME
system 1704 305 1780080 107904 sys_epoll_ 00000000 S system_server
system 1710 1704 1780080 107904 do_sigtime 00000000 S Signal Catcher //信号量线程,系统杀进程的时候会发signal信号
system 1711 1704 1780080 107904 poll_sched 00000000 S JDWP
system 1712 1704 1780080 107904 futex_wait 00000000 S ReferenceQueueD
system 1713 1704 1780080 107904 futex_wait 00000000 S FinalizerDaemon
system 1714 1704 1780080 107904 futex_wait 00000000 S FinalizerWatchd
system 1715 1704 1780080 107904 futex_wait 00000000 S HeapTaskDaemon
system 1732 1704 1780080 107904 binder_thr 00000000 S Binder:1704_1//binder线程池,支持system_server进程与其它进程通信
system 1733 1704 1780080 107904 binder_thr 00000000 S Binder:1704_2
system 1740 1704 1780080 107904 inotify_re 00000000 S FileObserver
system 1754 1704 1780080 107904 sys_epoll_ 00000000 S android.bg
system 1756 1704 1780080 107904 sys_epoll_ 00000000 S ActivityManager//AMS服务
system 1757 1704 1780080 107904 sys_epoll_ 00000000 S android.ui
system 1758 1704 1780080 107904 sys_epoll_ 00000000 S ActivityManager
system 1763 1704 1780080 107904 sys_epoll_ 00000000 S android.fg
system 1777 1704 1780080 107904 sys_epoll_ 00000000 S android.io
system 1779 1704 1780080 107904 sys_epoll_ 00000000 S android.display
system 1780 1704 1780080 107904 futex_wait 00000000 S CpuTracker
system 1781 1704 1780080 107904 sys_epoll_ 00000000 S PowerManagerSer//PMS服务
system 1783 1704 1780080 107904 pm_get_wak 00000000 S system_server
system 1796 1704 1780080 107904 sys_epoll_ 00000000 S PackageManager
system 2765 1704 1780080 107904 sys_epoll_ 00000000 S PackageInstalle
system 2767 1704 1780080 107904 poll_sched 00000000 S system_server
system 2768 1704 1780080 107904 futex_wait 00000000 S system_server
system 2770 1704 1780080 107904 do_sigtime 00000000 S POSIX timer 6
system 2771 1704 1780080 107904 futex_wait 00000000 S system_server
system 2776 1704 1780080 107904 sys_epoll_ 00000000 S CameraService_p
system 2777 1704 1780080 107904 alarm_ioct 00000000 S AlarmManager
system 2785 1704 1780080 107904 sys_epoll_ 00000000 S SensorEventAckR
system 2786 1704 1780080 107904 futex_wait 00000000 S SensorService
system 2787 1704 1780080 107904 sys_epoll_ 00000000 S InputDispatcher
system 2788 1704 1780080 107904 sys_epoll_ 00000000 S InputReader
system 2789 1704 1780080 107904 sys_epoll_ 00000000 S MountService
从上面信息可以看出,一个进程中有一些基础的线程,如主线程,binder线程等(AMS,PMS是通过binder跟外界交互的),后期会对进程线程做深入学习。
3.系统服务的基本实现结构
系统服务从代码实现上有一些基本的共性
a)定义业务的aidl接口,系统工具会将该接口转换成三部分:IXXX extends IIterface|Stub extends Binder | Proxy
注:aidl接口并不是实现服务的必须接口,只是系统为我们提供了一种定义服务的一种方法,使用该接口方便的地方就是系统通过该接口自动为我们定义了一些基础类。我们只管去实现具体的服务,即实现Stub类。其实在系统中有一些服务没有通过aidl接口生成基础类,如AMS,可以看源码。
b) 服务的具体实现类,即Stub的具体实现类,该类中具体实现业务接口,即IXXX中定义的接口方法
c)服务的代理类, 即Proxy类,该类是对服务实现类的包装,类中会传入服务实现类的一个引用。
4.系统服务的注册/获取/使用
系统服务addservice
5.如何向系统添加一个自己定义的服务
当阅读完几种系统服务之后,理解了这些服务的基本实现过程,使用过程,管理过程,我们就可以自定义我们的“系统服务”,即系统启动起来之后,我们定义的服务被系统启动起来,跑在system_server进程,供其它应用使用。
自定义服务
注册服务
获取服务
使用服务
【整理了一些大神的学习资料】
AOSP官网:https://source.android.com/source/index.html
Android官方Training:https://developer.android.com/training/index.html
《深入理解android》http://blog.csdn.net/innost
设计模式https://github.com/simple-android-framework-exchange/android_design_patterns_analysis