栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

都2021年了,你还不会 Android Framework ?

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

都2021年了,你还不会 Android Framework ?

工作中很多任务是要去定制framework,但是还是很多不会的,不过我可以告诉你如何去摸索。在此抛砖引玉一下。
framework这个东西挺好挺大的,不过它的核心其实也好说。一是承上启下提供应用的API,一是提供操作系统的服务。

相信所有人开始学习android开发的时候都是从以下这张图开始的,framework位于hal、系统库之上,位于app之下。

framework同下层打交到的方式就是jni,同上层打交到的方式就是抽象出各种java接口,在开发app的时候,import的各种android.* 就是各位在查文档时候的东东了。

像题主这样从app而来想要学习framework的肯定对JNI不那么熟悉吧,没关系,Google的命名方式可以让你忽略这部分实现,好好看java代码就够了。

从哪里开始呢?上面那张结构图里面的各种Manager背后都是系统服务,framework包含各种系统服务,所以“得服务者、得framework”(我瞎说的,哈哈哈),这里可以简单介绍一下这些服务的结构。
framework里的服务按照“SystemService.java”里分的话,分为可以Binder的服务、LocalService两类,如下图所示:

每类服务都会在Systemserver.java里启动自己,然后其他服务就可以调用了。而且大部分服务都有一个Manager(就是结构图里的各种*Manager),这点在搜代码的时候会看到各种*ServiceManager.java的类。这里Managers很大一部分都是开放出来的调用接口。
来看看SystemServer.java这个文件的一些函数,如下图:

在这里启动了各种类型的服务,下面这些都很熟悉吧?

这样是不是找到了各个Service的启动位置了。就是在这里,各个服务完成初始化,被调用了构造函数,以及最初被调用的那几个函数找到了。程序入口找到了,是不是可以解决一半问题了呢?

以上这些都是很长的文件,看起来头晕有木有啊。这里推荐一个framework里最简单的Service——LightService,一共就以下几个文件。

./services/core/java/com/android/server/lights/LightsManager.java
./services/core/java/com/android/server/lights/Light.java
./services/core/java/com/android/server/lights/LightsService.java


这个就是控制一闪一闪LED的控制接口了。每个代码不超过百行,但是也代表了一共典型的Service在framework里面是种怎样的存在吧。

至于你的那些问题,就是要跟着函数调用慢慢走,慢慢看吧。

学习程序最需要会的一点就是--抽象。不管是写还是看。
写的抽象不必说。
看的抽象是啥玩意儿?
就是开始看的时候要忽略细节,跟着流程走。工作原理一般都可以文字描述,如何实现的,跟着函数调用一步一步套,流程通了,细节就不在话下了。
如果一开始就纠结各种变量、各种函数名、各种模式,估计会迷路吧。
 

自身总结了一套学习方法,大致如下三点。勤加练习,一般性模块可以看的非常快。
1、高度抽象,构建框架
2、重要函数,深究细节
3、善用工具,及时总结
下班再补充具体细节~

Android源码非常庞大,但设计很精妙。纵向分层,横向模块化,使得整个源码更易更新和维护。在手机厂商做framework的更倾向于说自己是做Android系统的,维护的模块主要包括ActivityManagerService、WindowManagerService、PackageManagerService、PowerManagerService、SurfaceFlinger、通信模块、多媒体模块等。Android系统良好的模块化设计使得各个模块负责人只需搞懂自己的模块就可以胜任工作。但是搞定自己的模块并不那么容易,对于新人一般要大概做半年才能掌握其精要,有的做了一年发现还有很多点没有掌握,这也是很常见的。

对于应用开发者来说,他们并不需要修改系统代码,学习framework只是为了了解并理解某个API调用底层的运行机制,要学到这个深度级别还是比较容易的。

首先必须了解一些背景知识。1⃣️Android系统采用C/S架构;2⃣️绝大部分IPC通信采用Binder通信;3⃣️核心Service大多运行在System_server进程;4⃣️核心Service代码大部分都在frameworks/base/services目录下;⑤别一上来就看Binder!!!6⃣️别一开始看源码就钻牛角尖!!!

以下便是我的学习方法,不保证适合其他人,供参考。

首先,大概了解下该Service是干什么的。我会搜一些好的分析文章收藏起来,大概浏览下该Service为上层应用提供了什么功能?(这些文章并不会去挨个读,这跟绝大多数人习惯不一样,他们一般是一边看分析文章一边看源码)。在源码里找到源码文件,大概看下核心几个文件开头的注释,注释一般会说的非常清楚这个是干嘛的。(我用source insight看源码)

然后,可以尝试写一个小demo,方便调试Service内部方法或抓取系统日志来追踪代码流程。运行在system_server进程中的Java代码均可使用Android studio调试,当然必须是自己编译的image才行。MTK平台手机部分service是可以通过adb shell dumpsys XXX log XX来开启对应service的log。

接着,从核心API调用入手,一步一步分析源码,理出一个从应用端到Service端,最后回到应用端的函数调用链。这条调用链必定很长很长,有非常多的分支,还会出现非常多的类,这个时候就要抓住主线不放,细枝末节可以不管。借助UML工具了,一般画两个图就够了,一个是类图,一个是时序图。画图要精简,只画重要的主线分支时序图和主要的类关系。这个步骤最难的是理出主线分支调用,切记钻牛角尖偏离目标任务,只需理出一个client-->service-->client的框架即可。将时序图画出来后,整个框架便构建出来了。(我用starUML工具)

然后,在上面的框架中必定有几个非常关键的函数,把它搞定。搞定方法就是一行一行读代码,读懂每一行并不容易,需要联系上下文进行理解。从重要函数中要理清service是如何管理target的,比如AMS是使用Stack和Task来管理Activity的,使用两个队列来处理广播,扮演连接者将client和目标ContentProvider建立起连接等。这个过程也是最花时间的,因为你需要从源码里面尽可能地还原作者的设计思想,还原的越彻底,理解的越透彻。一般我是一边理解一边用笔记记录自己的理解。(我用有道云笔记)

最后,整理出一篇笔记,方便以后回顾。在前面两步做完,图有了,分析也有了,稍微整理下便成了一篇文档。一般情况下是这样的,今天你理解的差不多了,一个月后你估计只记得大概个轮廓,细节全忘了,两个月后估计连轮廓都忘了。相信我,这时最管用的就是那两个图了,一看就能让你想起80%,所以我非常喜欢画类图和时序图。

这是我自己整理的一篇笔记,可以找我来拿

地址:【Android技术交流】https://jq.qq.com/?_wv=1027&k=I3yi18b8

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/355894.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号