前言

平常开发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


更多相关文章

  1. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  2. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  3. 开放的安卓系统遇上了麻烦
  4. 210开发板Android系统串口程序
  5. understand and use android mvc(理解及使用android mvc)
  6. 谷歌Android(安卓)艰难前行
  7. [新书]《Android和PHP开发最佳实践》
  8. Android进程绝杀技--forceStop
  9. [置顶] android浮动搜索框的使用

随机推荐

  1. Android 7.1 设置默认启动桌面,并设置为主
  2. Android Studio 打Jar包和混淆代码。
  3. android目录简介
  4. Android 采用SharedPreferences读/写数据
  5. android美化短信聊天记录使得输入长短信
  6. Android上中文排序
  7. Android(安卓)Handle的使用
  8. Android源码快速查找文件、搜索字符串和
  9. 使用SQLite中自带的API操作SQLite数据库
  10. 开发应用程序的Android(安卓)- 入门