读书笔记:深入理解Android卷I

闲来无事,重新系统地学习一下 Android 系统的整个框架,《深入理解Android卷I》这本书之前貌似有看过,但是那时对 Android 的理解尚浅,有很多地方都没有理解,现在重读,相信一定能对 Android 系统原理有更加深入的理解,“学而时习之,不亦说乎”。

书籍的具体章节,这里就不重新码字了,有兴趣的可以自己看看。这里只是记录自己读书的一些新的发现以及心得。

虽然这本书的内容是居于 Android 2.2 的,但是 Android 的很多编程理念,原理还是相通的。

第一章:阅读前的准备工作

这一章主要介绍了 Android 的整体框架,从上到下,依次是 apps 层,framework 层,这两层是 java 环境的;然后是 native 层的各种 library,以及 Android runtime,runtime 里面包括一些核心库,以及虚拟机;(书中并没有提到 hal 层,因为 Android 2.2 还没有 hal 这个概念)然后是 linux 层。
这一章还讲述了如何搭建开发环境,make module 这样的编译方式可以自行查找模块的依赖关系,具体效果需要实践进行验证。因为自己曾经试过 make module 方式,因为某些 test 模块没有编译而被中断。但是这种编译方式,对于 aboot,boot,system image 等镜像的编译时是有效的。如果 make sepolicy 编译 sepolicy 模块有效的话,对于调试 selinux 策略倒是帮助挺大的。
另外 make -B module 会强制编译所有的目标文件,这个对于某些情况下目标文件没有更新的情况,应该会挺有用的。

第二章:深入理解JNI

这一章介绍 JNI 相关的知识,对我自己比较新的知识点就是 java 中声明的 native 函数与 so 库中的 jni 函数的关联有两种注册方式:第一种是静态方式,直接通过特定规则的程序名称来查找,例如 JNI EXPORT void JNICALL Java_android_media_MediaScanner_processFile 这种命名方式,相信大家有了解过,以前写 app 的 jni 代码,经常用这种方式;第二种方式是动态注册方式,就是系统源码中常用的 JNI_OnLoad 函数中进行动态注册,这也是作者推荐的方式,因为有一些初始化工作可以在这个函数里面实现(如果是系统源码,的确是推荐这种方式)。

第三章:深入理解 init

这一章温习了 earlyinit、init、earlyboot、boot 的 几个section 的启动顺序;还有就是 Android 2.2 的 uevent 事件是放在 init 进程中进行处理的,而新版本的 Android 是通过独立的 ueventd 进程来处理 uevent 事件的,当然,ueventd 也是由 init 进程启动的。
还有就是 init 里面通过链表管理所有的 service。
同时还学习了进程的退出,重新启动的流程,以及 property_get 是通过共享内存进行读取,而 property_set 是客户端进程通过 socket 进行进程间通信,然后由 init 进程通过权限判断后,最终对 property 进行写入。比较特殊的 ro.xxx 属性是不能修改的。最后就是调用 property_change 函数对变化后的 property 的事件处理,例如 onproperty:persist.service.adb.enable=1 ,就启动 adbd。

第四章:深入理解zygote

创建 Java 世界的三部曲:
1. 创建虚拟机–startVm
2. 注册 jni 函数
3. 通过 jni,调用 Java 中的 zygoteInit 类的 main 函数,这样就进入了 Java 世界

jni check 的作用是对 jni 调用做检查工作,但是检查会影响系统运行速度,所以一般都是 eng 版本才启用。

preloadClass 是由 framework/base/tools/preload 工具生成,它需要判断每个类的加载的时间是否大于 1250 微秒,超过这个时间类会被写入到 preload-classes 文件中,然后由 zygote 加载(之前自己对 preload-classes 的理解有误,误以为是重要的类才有需要 preload )。

UI 编程中经常使用的 com.android.R.xxx 资源是由 zygote 在 preload-resources 中加载的,它主要是加载 framework-res.apk 中的资源。

system_server 由 zygote 创建。system_server 通过 socket 向 zygote 发送创建应用进程的请求;zygote 通过创建好的 zygote 服务端,接受其他进程的请求。

通过抛出异常的方式,对 exec 的一种近似的模拟,以此来避免堆栈的浪费,很精妙的设计。

system_server 通过 init1 创建各种 native 服务,通过 init2 创建各种 java 服务。

第五章:深入理解常见类 — 未完待续

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据