编辑推荐
源码解读,对Android底层源码进行系统剖析。
硬件实践,基于开源硬件pcDuino和Xilinx的可编程SoC——Zynq。
专家力推,谷歌、华为、CSDN社区专家联袂推荐。
掌握Android底层软件开发必备的工具书
开发一个Android应用往往非常简单,而要构建一个健壮、可靠、功耗和性能优异的软硬件一体系统确非易事。因此,市面上介绍Android应用开发的书籍很多,但是偏重底层软件开发的书却不多。Android如今已经是最为流行的嵌入式操作系统,如果想要从零开始定制一个全新的基于Android和ARM处理器的新系统,就必须要了解Android操作系统的底层软件。本书不仅覆盖了必要的嵌入式系统理论和Linux的基础知识,还对Android底层的源码进行分析,并用实例引导读者掌握底层开发的技能和调试方法。本书是掌握Android底层软件开发技术的必备工具书。
内容简介
《Android底层开发实战》分为四个部分:一部分为预备知识篇,简要介绍嵌入式系统的定义与软硬件开发以及Android开发环境的搭建。第二部分为系统结构篇,主要介绍Android系统的源码结构、内核与相关工具以及环境库。第三部分为驱动设计篇,主要介绍Android系统中常用外接设备的驱动架构以及实现。内容包括NDK编程、Android中HAL模型架构与实现流程。作为教学实例,最后分析了Android系统中的Camera与WIFI两个功能部件的的驱动设计。第四部分为实例分析篇,通过对具体开发板硬件结构编程原理的介绍到系统级的实例讲解。在简要介绍系统底层开发流程的基础上,首先分析了主流的Zynq和pcDuino平台上开发环境的搭建、Linux内核以及Android系统的编译、下载;然后结合前文学习过的知识点,从零开始设计LED显示系统的Linux内核驱动、AndroidHAL支持和服务层设计、顶层App的实现;作为进阶部分,本书最后介绍了对Android内核进行跟踪调试与性能测试的工具软件、工作流程以及结果分析。
作者简介
周庆国,兰州大学教授。理学博士,博士生导师,IET Fellow,教育部新世纪人才基金获得者,现为兰州大学开源软件与实时系统教育部工程研究中心副主任,兰州大学分布式与嵌入式系统实验室主任。2007年10月曾受聘担任Real Time Linux Foundation主任,2011年8月曾任《International Journal of Computational Science and Engineering 》(IJCSE)杂志副主编,2013年4月曾任《International Journal of Embedded System》(IJES)杂志主编。目前主要从事安全关键系统、嵌入式系统、实时系统、虚拟化技术的研究。
郑灵翔,博士,高级工程师。先后获得厦门市科技进步二等奖两项,福建省教学成果二等奖一项。主要研究领域包括嵌入式系统、移动互联网、物联网、人工智能和模式识别等。出版嵌入式系统教材三本,发表学术论文四十余篇。
康筱彬,兰州资源环境职业技术学院教师。毕业于兰州大学信息学院,工程硕士。从事一线教学工作,研究方向为嵌入式操作系统、移动互联网技术及应用。
刘同山,兰州大学教师。毕业于兰州大学无线电物理专业,现承担电路、单片机等课程的教学与实验工作。
目录
推荐序
自 序
前 言
第1章 Android嵌入式系统导论1
1.1 Android嵌入式系统概述1
1.1.1 嵌入式系统定义1
1.1.2 基于Android的嵌入式系统构成5
1.1.3 移动电话系统9
1.1.4 基于ARM的移动电话硬件结构10
1.2 嵌入式系统实例17
1.2.1 pcDuino部分硬件功能介绍17
1.2.2 基于Android的嵌入式系统30
第2章 Linux系统详解34
2.1 系统简介34
2.2 基础命令35
2.2.1 cd和ls命令35
2.2.2 touch和mkdir命令37
2.2.3 rm和rmdir命令38
2.2.4 cp和mv命令38
2.2.5 find和awk命令39
2.2.6 vim编辑器的使用43
2.3 Bash Shell44
2.3.1 Bash Shell简介44
2.3.2 Bash Shell脚本简介44
2.4 Linux源码与Android源码介绍45
2.4.1 Linux源码简介45
2.4.2 Android源码简介45
第3章 Android系统开发环境搭建47
3.1 编译前奏—Android上的开发工作47
3.1.1 Android的移植开发47
3.1.2 系统开发48
3.1.3 应用开发49
3.2 Android的系统架构 49
3.2.1 软件结构49
3.2.2 源代码的结构51
3.3 搭建开发环境 54
3.3.1 搭建编译环境54
3.3.2 使用repo64
3.3.3 Android的编译66
第4章 Android系统底层源码结构分析69
4.1 源码结构分析69
4.1.1 底层库结构介绍71
4.1.2 C基础函数库bionic73
4.1.3 C语言底层库libcutils74
4.1.4 C++工具库libutils74
4.1.5 底层文件系统库system 75
4.1.6 增加本地库的方法76
4.2 Android编译系统介绍78
4.2.1 build系统78
4.2.2 SDK79
4.3 init初始化脚本语言介绍82
4.3.1 概述82
4.3.2 init进程源码分析82
4.3.3 脚本文件的创建与分析85
4.3.4 创建设备节点文件89
4.3.5 子进程的创建与终止92
4.3.6 属性服务93
4.4 Zygote95
4.4.1 Zygote概述95
4.4.2 AppRuntime分析95
4.4.3 system_server分析100
第5章 Android系统内核分析109
5.1 Linux内核基础109
5.1.1 概述109
5.1.2 Linux内核的主要子系统110
5.1.3 Linux启动过程分析111
5.2 Android内核概况112
5.3 Android启动过程分析113
5.4 Binder框架分析115
5.4.1 概述116
5.4.2 Binder的系统架构117
5.4.3 Binder的机制和原理125
5.5 Ashmem内存管理方式128
5.5.1 概述128
5.5.2 Ashmem初始化128
5.5.3 内存的创建和释放131
5.5.4 内存的映射135
5.5.5 内存的锁定和解锁137
5.6 低内存管理139
5.7 Logger145
5.7.1 Logger概述145
5.7.2 Logger实现原理146
第6章 Android系统相关工具及运行环境156
6.1 Android开发工具分类及介绍156
6.1.1 应用程序开发工具156
6.1.2 框架开发工具157
6.1.3 交叉编译工具159
6.1.4 内核开发工具159
6.2 Dalvik虚拟机160
6.2.1 概述160
6.2.2 dex文件163
6.2.3 Dalvik内存管理165
6.2.4 Dalvik编译器 169
6.3 JNI171
6.3.1 概述171
6.3.2 JNI的架构171
6.3.3 JNI的实现方式172
6.4 Boot Loader173
6.4.1 概述173
6.4.2 Boot Loader 的操作模式174
6.4.3 启动过程175
6.5 busybox的使用176
第7章 Android驱动程序设计177
7.1 Android驱动概述177
7.2 Android NDK编程178
7.3 Android系统中的HAL层183
7.3.1 HAL_legacy和HAL对比184
7.3.2 HAL module 架构分析184
7.3.3 HAL实现流程186
7.4 Android系统Camera与WiFi实现187
7.4.1 Android中的Camera实现187
7.4.2 Android系统WiFi实现190
第8章 Android底层开发实例讲解193
8.1 底层开发相关技术概览193
8.2 实例讲解—基于Zynq的Android移植193
8.2.1 主机开发环境的搭建194
8.2.2 Linux内核的编译194
8.2.3 Android文件系统的编译203
8.2.4 SD卡的准备以及Android系统的启动 205
8.3 移植讲解—基于pcDuino的Android移植205
8.3.1 pcDuino介绍206
8.3.2 环境搭建208
8.3.3 编译内核209
8.3.4 编译Android210
8.3.5 烧录镜像211
8.4 Android LED驱动设计212
8.4.1 硬件原理212
8.4.2 Linux驱动设计212
8.4.3 Android HAL层驱动220
8.4.4 硬件服务层224
8.4.5 App应用编写229
8.5 进阶讲解—针对Android系统的内核跟踪与测试231
8.5.1 使用平台简介231
8.5.2 测试环境的建立232
8.5.3 测试工具235
8.5.4 Android内核调试与性能测试239
前言/序言
自第一款搭载Android系统的智能手机HTC G1发布至今已近6年,凭借日益完善与强大的功能、完全开放的内核源码以及Google公司在网络应用领域的无缝支持,Android系统从初出茅庐的行业新锐,已经成长壮大为手持设备智能化产业的推动者和市场的领导者,这一点已经毋庸置疑。
不可否认,众多独立软件开发者与商业软件公司的加入使Android系统不仅仅作为终端产品,还作为开发平台深入到各行业的技术开发中,包括学校、公司,乃至开发人员的工作、生活的各方面,这是Android系统旺盛生命力的表现,同时也是Android系统持续发展壮大的保障。近期,支持Android系统的开发板如Zynq、pcDuino等在功能不断完善的前提下成本也在大幅下降,助力了Android的推广与拓展;可穿戴设备以及嵌入式芯片的应用又将为Android系统及其软硬件开发提供新的发展机遇。接触Android领域、使用Android产品、学习Android系统,现在已经成为计算机软件、电子、自动化控制及相关专业的学生和已经参加工作的软硬件工程师的首选。
但是目前市场上同类的Android相关书籍中,多是介绍基于Android SDK的单纯应用程序(APP)的开发,且种类繁杂,对于Android的底层源码与系统内核的分析、驱动程序设计与存储优化、平台移植与内核测试等较为深入的内容则甚少涉及。为了对这些底层领域相关知识稍作弥补,作者编写了本书。
本书而用浅显易懂的语言向广大Android爱好者和开发人员讲解Android系统下嵌入式开发板的设计。
全书共8章,前3章为预备知识,简要介绍嵌入式系统的定义与软硬件开发以及Android开发环境的搭建。这一部分为基础知识,有一定Linux基础和Android开发经验的读者可以选读。
第4~6章为系统结构,主要介绍Android系统的源码结构、内核与相关工具以及环境库。内容包括:Android源码结构、init初始化脚本、Zygote、Android系统编译;Android内核启动、Binder框架、Ashmem内存管理、系统日志Logger实现;Android开发工具、Dalvik虚拟机、JNI、Boot Loader。
第7章为驱动设计,主要介绍Android系统中常用外接设备的驱动架构以及实现。内容包括NDK编程、Android中HAL模型架构与实现流程。作为教学实例,最后还分析了Android系统中的Camera与WiFi两个功能部件的驱动设计。
第8章为实例分析,介绍具体开发板硬件结构的编程原理以及系统级的实例。在简要介绍系统底层开发流程的基础上,首先分析主流的Zynq和pcDuino平台上开发环境的搭建、Linux内核以及Android系统的编译、下载;然后结合前文学习过的知识点,从零开始设计LED显示系统的Linux内核驱动、Android HAL支持和服务层设计、顶层App的实现;作为进阶部分,最后介绍了对Android内核进行跟踪调试与性能测试的工具软件、工作流程以及结果分析。
致谢
在此要特别感谢华章公司的策划编辑张国强,是他对Android和嵌入式系统开发的关注促成了本书的出版。笔者在撰写书稿时,他也对本书提出了宝贵的写作建议,并进行了仔细的审阅。
本书的编写同样离不开许多朋友的支持,在此特别感谢兰州大学信息科学与工程学院的陈华明的大力协助,这本书的出版离不开他的贡献。
还要感谢兰州大学的高博、郭守超、王小强和朱芳芳,感谢他们在本书编写过程中所给予的帮助与建议。
alt="" />
《Android底层开发实战》 内容简介 本书旨在为读者深入剖析Android操作系统的底层运行机制,揭示其核心组件的工作原理,并通过大量实战案例,引导读者掌握Android底层开发的关键技术。我们并非止步于应用层API的简单调用,而是将目光聚焦于驱动程序、HAL层、Binder IPC、系统服务、运行时环境以及内核等更深层次的领域,帮助开发者构建对Android系统有全局性、系统性理解,并具备解决复杂底层问题的能力。 第一部分:Android系统架构与启动流程解析 本部分将带领读者穿越Android系统的多层架构,从Linux内核到上层应用,建立起宏观的认知框架。我们将详细讲解Android的分层设计,包括Linux内核层、硬件抽象层(HAL)、Android运行时(ART)以及核心Java库、应用框架层和应用程序层。 Linux内核: 深入理解Android基于Linux内核的优势,探讨Linux内核在Android系统中的作用,包括进程管理、内存管理、设备驱动等关键模块。我们将分析Android对Linux内核的定制和优化,例如Binder驱动、Ashmem等,并讲解如何理解和调试内核代码。 硬件抽象层(HAL): 揭示HAL在连接上层Java框架与底层硬件驱动之间的桥梁作用。我们将分析HAL的接口设计原则,研究常用HAL模块(如Camera HAL、Audio HAL、Sensor HAL)的实现机制,并指导读者如何开发自定义HAL模块,以支持新的硬件设备。 Android运行时(ART): 深入剖析ART的执行流程,包括dex文件加载、方法编译(AOT/JIT)、垃圾回收等。我们将详细讲解ART的优化策略,以及如何在ART环境下进行性能调优和内存分析。 系统启动流程: 从按下电源键开始,逐步解析Android系统的完整启动过程。我们将详细讲解Bootloader、Kernel、init进程、Zygote进程、System Server等关键节点的职责和交互。通过源码分析和逻辑梳理,让读者彻底理解Android是如何一步步被“唤醒”的。 第二部分:Binder IPC机制深入研究 Binder是Android进程间通信(IPC)的核心机制,其高效、安全、灵活的特性是Android系统能够支撑复杂应用和服务的关键。本部分将对Binder IPC进行深度剖析。 Binder核心概念: 详细解释Binder的驱动层、用户空间库(libbinder)、Service Manager、Client/Server端架构。我们将分析Binder的Transaction、Message、Reply等核心数据结构,以及Binder对象是如何在进程间传递的。 Binder驱动源码分析: 深入研究Binder驱动的内核实现,理解Binder在内核中的文件操作、内存映射、线程模型等。我们将分析Binder驱动如何处理Binder命令、管理Binder对象、实现数据拷贝等。 Binder用户空间实现: 详细讲解`libbinder`库在用户空间的作用,包括Proxy/Stub模式、Binder代理对象的创建与管理、Binder线程池的运作等。 AIDL与Parcelable: 讲解Android Interface Definition Language(AIDL)的使用方法,以及如何利用AIDL定义跨进程接口。同时,深入分析Parcelable接口,理解它在Binder数据序列化与反序列化中的重要作用,以及如何自定义Parcelable对象。 Binder性能优化与安全: 探讨Binder通信的性能瓶颈,并给出相应的优化策略。同时,分析Binder的安全机制,例如权限检查、UID/PID验证等。 第三部分:Android系统服务剖析与定制 Android系统中存在大量的系统服务,它们为上层应用提供了丰富的功能。本部分将选取几个典型的系统服务进行深度剖析,并指导读者如何进行定制开发。 System Server: 深入理解System Server的职责,它如何启动、管理各种系统服务(如ActivityManagerService, PackageManagerService, WindowManagerService等)。我们将分析System Server的启动流程,以及它与Zygote进程的关系。 ActivityManagerService(AMS)与WindowManagerService(WMS): 详细解析AMS和WMS的功能,它们如何管理Activity生命周期、调度任务、处理窗口显示与交互。我们将分析AMS与WMS之间的通信机制,以及它们如何协同工作。 PackageManagerService(PMS): 讲解PMS的功能,包括应用安装、卸载、权限管理、资源解析等。我们将分析PMS如何扫描和管理系统中的APK文件,以及如何处理应用更新。 其他重要系统服务: 简要介绍其他关键系统服务,如LocationManagerService, NotificationManagerService, InputManagerService等,让读者对Android系统的服务生态有一个全面的认识。 自定义系统服务: 指导读者如何开发和集成自己的系统服务。我们将讲解如何编写System Server的插件,如何注册新的Binder服务,以及如何在应用层调用自定义服务。 第四部分:Android运行时与原生库开发 本部分将聚焦于Android的运行时环境以及原生库(Native Libraries)的开发。 JNI(Java Native Interface): 详细讲解JNI的使用方法,包括Java与C/C++之间的函数调用、数据类型转换、内存管理等。我们将通过实际案例,演示如何使用JNI将C/C++代码集成到Android应用中,以提升性能或利用现有原生库。 Android NDK(Native Development Kit): 介绍NDK的构成和作用,以及如何使用NDK开发原生C/C++代码。我们将讲解NDK的编译、链接、打包过程,以及如何管理原生库的依赖。 常用原生库解析: 分析Android系统中常用的原生库,如libc, libutils, libbinder, libgui, libstagefright等,理解它们在系统中的作用和实现。 内存管理与性能优化: 深入探讨Android的原生内存管理机制,包括malloc, free, mmap等。我们将分析常见的内存泄漏问题,并介绍使用Valgrind等工具进行内存分析和性能调优的方法。 第五部分:Android安全机制与底层加固 安全是Android系统不可忽视的重要方面。本部分将深入分析Android的安全机制,并探讨底层加固的技术。 Android权限模型: 详细解析Android的权限系统,包括运行时权限、签名权限、文件权限等。我们将分析权限是如何授予和检查的,以及如何避免权限滥用。 SELinux(Security-Enhanced Linux): 深入理解SELinux在Android系统中的安全作用,包括强制访问控制(MAC)模型、安全策略(policy)的编写与加载。我们将分析SELinux如何限制进程访问敏感资源,以及如何排查SELinux相关的denial日志。 应用沙箱机制: 讲解Android应用沙箱的工作原理,包括UID隔离、文件系统隔离等。我们将分析沙箱机制如何防止应用之间的相互干扰和恶意攻击。 底层加固技术: 介绍一些常见的Android底层加固技术,如代码混淆、反调试、Hook技术、加密等。我们将分析这些技术的原理和局限性,并指导读者如何选择和应用合适的加固方案。 第六部分:Android驱动开发基础 虽然Android系统上层开发较为普及,但深入的驱动开发能够让开发者对硬件有更深的理解,并能解决一些底层问题。本部分将介绍Android驱动开发的基础知识。 Linux设备驱动模型: 简要回顾Linux设备驱动的基本概念,包括字符设备、块设备、网络设备,以及设备文件的创建和访问。 Android特定驱动: 介绍Android系统中一些常见的驱动,如Binder驱动、Ashmem驱动、PMem驱动等,以及它们的用途。 驱动开发流程: 讲解一个简单的Linux设备驱动的开发流程,包括驱动源码编写、Makefile配置、模块加载与卸载。 HAL与驱动的交互: 再次强调HAL层在驱动开发中的重要性,以及HAL模块如何通过`ioctl`等方式与底层驱动进行交互。 调试技巧: 介绍在驱动开发过程中常用的调试方法,如`printk`日志输出、`/proc`文件系统、`strace`等。 实战案例 本书贯穿大量的实战案例,包括但不限于: 开发自定义HAL模块: 以一个简单的传感器为例,指导读者从硬件接口定义到HAL接口实现,再到上层Java框架的调用。 编写Binder服务: 创建一个简单的计算器Binder服务,演示客户端如何跨进程调用服务端的计算功能。 JNI接口开发: 实现一个用于图片处理的原生库,并通过JNI供Java层调用。 分析系统启动日志: 利用adb shell等工具,分析系统启动过程中的关键日志,定位启动问题。 SELinux策略修改与测试: 针对某个常见场景,修改SELinux策略,验证其安全性。 目标读者 对Android系统底层原理充满好奇的应用开发者。 希望深入理解Android运行机制,提升开发和调试能力的Android工程师。 从事嵌入式Linux开发,希望了解Android系统特性的开发者。 对操作系统、IPC、驱动等底层技术感兴趣的学生和研究人员。 学习本书,您将能够: 深入理解Android的“黑箱”: 揭开Android系统神秘的面纱,理解其核心组件的运行逻辑。 掌握Binder IPC的奥秘: 彻底理解Android进程间通信的实现原理,并能高效利用。 灵活定制Android系统: 了解如何开发自定义系统服务,扩展Android的功能。 高效进行底层开发: 掌握JNI和NDK的使用,实现高性能的原生应用。 提升Android安全意识: 理解Android的安全机制,并能进行基本的安全加固。 具备解决复杂问题的能力: 面对Android开发中的疑难杂症,能够从底层找到根源。 《Android底层开发实战》不仅仅是一本书,更是您深入Android世界,成为一名真正“懂”Android开发者的指南。