深入解析Android 虚拟机 封面

深入解析Android 虚拟机

评分 3.6
字数
43.4万字
章节数
406
ISBN
9787115423535

标签

内容简介

Android系统从诞生到现在的短短几年时间里,凭借其易用性和开发的简洁性,赢得了广大开发 者的支持。在整个Android系统中,Dalvik VM一直是贯穿从底层内核到高层应用开发的核心。本书循序渐进地讲解了Android虚拟机系统的基本知识,并剖析了其整个内存系统的进程和运作流程,并对虚拟机系统优化和异常处理的知识进行了详细讲解。本书几乎涵盖了Dalvik VM系统的所有主要内容,并且讲解方法通俗易懂,特别有利于读者学习并消化。 本书适合Android初学者、Android底层开发人员、源代码分析人员和虚拟机开发人员学习,也可以作为大专院校相关专业师生的学习用书和培训学校的教材。

编辑推荐

本书围绕Android系统中贯穿内核与上层应用的Dalvik虚拟机展开,从基本知识入手,逐步讲清内存系统的进程与运作流程,并延伸到虚拟机优化和异常处理。对于想理解Android应用为何这样运行、内存如何分配回收的读者,它提供了一条从概念到内部机制的路径。叙述风格偏通俗,注意降低底层知识的进入门槛,适合作为系统学习的参考而非零散查阅的手册。阅读时建议结合源码或调试环境对照理解,把抽象流程落到具体调用上,效果会更扎实。

适合谁读

适合

  • Android应用开发初学者,想补齐虚拟机与内存机制基础
  • Android底层开发人员,需要系统梳理Dalvik运行流程
  • 源代码分析人员,希望获得虚拟机层面的导读框架
  • 大专院校相关专业师生,可用作课程学习或培训教材

不适合

  • 完全没有编程基础、首次接触移动开发的读者
  • 只想快速查阅API用法、不关心底层机制的应用开发者
  • 期待覆盖最新Android运行时全部细节的资深系统工程师

阅读建议

  1. 先通读基本知识与内存系统章节,建立整体流程图,再进入优化与异常处理部分。
  2. 阅读进程与内存运作流程时,打开对应源码或调试工具同步对照,避免只记结论。
  3. 每章结束后用自己的话复述关键流程,并整理一份虚拟机术语与调用关系笔记。

出版社简介

人民邮电出版社 中国 · 成立于 1953 年

人民邮电出版社以科技、计算机与信息通信类图书见长,并由此延伸至摄影、艺术、软件学习与励志成长等门类,形成较为多元的出版方向。库内图书既涵盖《重构与模式(修订版)》《华为交换机学习指南(第二版)》等计算机与通信技术读物,也收录《小王子(中英法彩绘典藏纪念版)》《了不起的盖茨比》《假如给我三天光明》等双语典藏类作品;《北京十年:1980-1990》与《鬼刀 WLOP个人插画作品集》则体现其在摄影与艺术领域的布局。作者资源包括安东尼·圣埃克苏佩里、海伦·凯勒、Joshua Kerievsky、王达、张兆增与WLOP等。

目录

  1. 版权信息
  2. 内容提要
  3. 前言
  4. 第1章 获取并编译Android源码
  5. 1.1 获取Android源码
  6. 1.1.1 在Linux系统获取Android源码
  7. 1.1.2 在Windows平台获取Android源码
  8. 1.1.3 Windows获取Android L源码
  9. 1.2 分析Android源码结构
  10. 1.3 编译Android源码
  11. 1.3.1 搭建编译环境
  12. 1.3.2 开始编译
  13. 1.3.3 在模拟器中运行
  14. 1.3.4 常见的错误分析
  15. 1.3.5 实践演练——演示两种编译Android程序的方法
  16. 1.4 编译Android Kernel
  17. 1.4.1 获取Goldfish内核代码
  18. 1.4.2 获取MSM内核代码
  19. 1.4.3 获取OMAP内核代码
  20. 1.4.4 编译Android的Linux内核
  21. 第2章 Java虚拟机基础
  22. 2.1 虚拟机的作用
  23. 2.2 Java虚拟机概述
  24. 2.2.1 JVM的数据类型
  25. 2.2.2 Java虚拟机体系结构
  26. 2.2.3 JVM的生命周期
  27. 2.3 JVM的安全性
  28. 2.3.1 JVM的安全模型
  29. 2.3.2 沙箱模型的4种组件
  30. 2.3.3 分析Java的策略机制
  31. 2.4 网络移动性
  32. 2.4.1 现实需要网络移动性
  33. 2.4.2 网络移动性
  34. 2.5 内存异常和垃圾处理
  35. 2.5.1 内存分配中的栈和堆
  36. 2.5.2 运行时的数据区域
  37. 2.5.3 对象访问
  38. 2.5.4 内存泄露
  39. 2.5.5 JVM的垃圾收集策略
  40. 2.5.6 垃圾收集器
  41. 2.6 Java内存模型
  42. 2.6.1 Java内存模型概述
  43. 2.6.2 主内存与工作内存
  44. 2.6.3 内存间交互操作
  45. 第3章 Dalvik和ART基础
  46. 3.1 Dalvik VM和JVM的差异
  47. 3.2 Dalvik虚拟机的主要特征
  48. 3.3 Dalvik VM架构
  49. 3.3.1 Dalvik虚拟机的代码结构
  50. 3.3.2 dx工具
  51. 3.3.3 Dalvik VM的进程管理
  52. 3.3.4 Android的初始化流程
  53. 3.4 Dalvik VM控制VM命令详解
  54. 3.4.1 基本命令
  55. 3.4.2 扩展的JNI检测
  56. 3.4.3 断言
  57. 3.4.4 字节码校验和优化
  58. 3.4.5 Dalvik VM的运行模式
  59. 3.4.6 死锁预测
  60. 3.4.7 dump堆栈追踪
  61. 3.4.8 dex文件和校验
  62. 3.4.9 产生标志位
  63. 3.5 ART机制基础
  64. 3.5.1 什么是ART模式
  65. 3.5.2 ART优化机制基础
  66. 第4章 分析JNI
  67. 4.1 JNI的本质
  68. 4.2 分析Java层
  69. 4.2.1 加载JNI库
  70. 4.2.2 实现扫描工作
  71. 4.2.3 读取并保存信息
  72. 4.2.4 删除SD卡外的信息
  73. 4.2.5 直接转向JNI
  74. 4.2.6 扫描函数scanFile
  75. 4.2.7 JNI中的异常处理
  76. 4.3 分析JNI层
  77. 4.3.1 将Native对象的指针保存到Java对象
  78. 4.3.2 创建Native层的MediaScanner对象
  79. 4.4 Native(本地)层
  80. 4.4.1 注册JNI函数
  81. 4.4.2 完成注册工作
  82. 4.4.3 动态注册
  83. 4.4.4 处理路径参数
  84. 4.4.5 扫描文件
  85. 4.4.6 添加TAG信息
  86. 4.4.7 总结函数JNI_OnLoad()与函数JNI_OnUnload()的用途
  87. 4.4.8 Java与JNI基本数据类型转换
  88. 4.4.9 JNIEnv接口
  89. 4.4.10 JNI中的环境变量
  90. 第5章 分析内存系统
  91. 5.1 分析Android的进程通信机制
  92. 5.1.1 Android的进程间通信(IPC)机制Binder
  93. 5.1.2 Service Manager是Binder机制的上下文管理者
  94. 5.1.3 Service Manager服务
  95. 5.2 匿名共享内存子系统详解
  96. 5.2.1 基础数据结构
  97. 5.2.2 初始化处理
  98. 5.2.3 打开匿名共享内存设备文件
  99. 5.2.4 内存映射
  100. 5.2.5 读写操作
  101. 5.2.6 锁定和解锁
  102. 5.2.7 回收内存块
  103. 5.3 C++访问接口层详解
  104. 5.3.1 接口MemoryBase
  105. 5.3.2 接口MemoryBase
  106. 5.4 Java访问接口层详解
  107. 第6章 Android程序的生命周期管理
  108. 6.1 Android程序的生命周期
  109. 6.1.1 进程和线程
  110. 6.1.2 进程的类型
  111. 6.2 Activity的生命周期
  112. 6.2.1 Activity的几种状态
  113. 6.2.2 分解剖析Activity
  114. 6.2.3 几个典型的场景
  115. 6.2.4 管理Activity的生命周期
  116. 6.2.5 Activity的实例化与启动
  117. 6.2.6 Activity的暂停与继续
  118. 6.2.7 Activity的关闭/销毁与重新运行
  119. 6.2.8 Activity的启动模式
  120. 6.3 进程与线程
  121. 6.3.1 进程
  122. 6.3.2 线程
  123. 6.3.3 线程安全的方法
  124. 6.3.4 Android的线程模型
  125. 6.4 测试生命周期
  126. 6.5 Service的生命周期
  127. 6.5.1 Service的基本概念和用途
  128. 6.5.2 Service的生命周期详解
  129. 6.5.3 Service与Activity通信
  130. 6.6 Android广播的生命周期
  131. 6.6.1 Android 的广播机制
  132. 6.6.2 编写广播程序
  133. 6.7 ART进程管理
  134. 第7章 IPC进程通信机制
  135. 7.1 Binder机制概述
  136. 7.2 Service Manager是Binder机制的上下文管理者
  137. 7.2.1 入口函数
  138. 7.2.2 打开Binder设备文件
  139. 7.2.3 创建设备文件
  140. 7.2.4 管理内存映射地址空间
  141. 7.2.5 发生通知
  142. 7.2.6 循环等待
  143. 7.3 内存映射
  144. 7.3.1 实现内存分配功能
  145. 7.3.2 分配物理内存
  146. 7.3.3 释放物理页面
  147. 7.3.4 分配内核缓冲区
  148. 7.3.5 释放内核缓冲区
  149. 7.3.6 查询内核缓冲区
  150. 第8章 init进程详解
  151. 8.1 init基础
  152. 8.2 分析入口函数
  153. 8.3 配置文件详解
  154. 8.3.1 init.rc简介
  155. 8.3.2 分析init.rc的过程
  156. 8.4 解析service
  157. 8.4.1 Zygote对应的service action
  158. 8.4.2 init组织service
  159. 8.4.3 函数parse_service和parse_line_service
  160. 8.5 字段on
  161. 8.5.1 Zygote对应的on action
  162. 8.5.2 init组织on
  163. 8.5.3 解析on用到的函数
  164. 8.6 在init控制service
  165. 8.6.1 启动Zygote
  166. 8.6.2 启动service
  167. 8.6.3 4种启动service的方式
  168. 8.7 控制属性服务
  169. 8.7.1 引入属性
  170. 8.7.2 初始化属性服务
  171. 8.7.3 启动属性服务
  172. 8.7.4 处理设置属性的请求
  173. 第9章 Dalvik VM的进程系统
  174. 9.1 Zygote(孕育)进程详解
  175. 9.1.1 Zygote基础
  176. 9.1.2 分析Zygote的启动过程
  177. 9.2 System进程详解
  178. 9.2.1 启动System进程前的准备工作
  179. 9.2.2 分析SystemServer
  180. 9.2.3 分析EntropyService
  181. 9.2.4 分析DropBoxManagerService
  182. 9.2.5 分析DiskStatsService
  183. 9.2.6 分析DeviceStorageManagerService
  184. 9.2.7 分析SamplingProfilerService
  185. 9.2.8 分析ClipboardService
  186. 9.3 应用程序进程详解
  187. 9.3.1 创建应用程序
  188. 9.3.2 启动线程池
  189. 9.3.3 创建信息循环
  190. 第10章 Dalvik VM运作流程详解
  191. 10.1 Dalvik VM相关的可执行程序
  192. 10.1.1 dalvikvm、dvz和app_process简介
  193. 10.1.2 对比app_process和dalvikvm的执行过程
  194. 10.2 初始化Dalvik虚拟机
  195. 10.2.1 开始虚拟机的准备工作
  196. 10.2.2 初始化跟踪显示系统
  197. 10.2.3 初始化垃圾回收器
  198. 10.2.4 初始化线程列表和主线程环境参数
  199. 10.2.5 分配内部操作方法的表格内存
  200. 10.2.6 初始化虚拟机的指令码相关的内容
  201. 10.2.7 分配指令寄存器状态的内存
  202. 10.2.8 分配指令寄存器状态的内存和最基本用的Java库
  203. 10.2.9 初始化使用的Java类库线程类
  204. 10.2.10 初始化虚拟机使用的异常Java类库
  205. 10.2.11 初始化其他对象
  206. 10.3 启动Zygote
  207. 10.3.1 在init.rc中配置Zygote启动参数
  208. 10.3.2 启动Socket服务端口
  209. 10.3.3 加载preload-classes
  210. 10.3.4 加载preload-resources
  211. 10.3.5 使用folk启动新进程
  212. 10.4 启动SystemServer进程
  213. 10.4.1 启动各种系统服务线程
  214. 10.4.2 启动第一个Activity
  215. 10.5 加载class类文件
  216. 10.5.1 DexFile在内存中的映射
  217. 10.5.2 ClassObject——Class在加载后的表现形式
  218. 10.5.3 加载Class并生成相应ClassObject的函数
  219. 10.5.4 加载基本类库文件
  220. 10.5.5 加载用户类文件
  221. 第11章 DEX文件详解
  222. 11.1 DEX文件介绍
  223. 11.2 DEX文件的格式
  224. 11.2.1 map_list
  225. 11.2.2 string_id_item
  226. 11.2.3 type_id_item
  227. 11.2.4 proto_id_item
  228. 11.2.5 ield_id_item
  229. 11.2.6 method_id_item
  230. 11.2.7 class_def_item
  231. 11.3 DEX文件结构
  232. 11.3.1 文件头(File Header)
  233. 11.3.2 魔数字段
  234. 11.3.3 检验码字段
  235. 11.3.4 SHA-1签名字段
  236. 11.3.5 map_off字段
  237. 11.3.6 string_ids_size和off字段
  238. 11.4 DEXFile接口详解
  239. 11.4.1 构造函数
  240. 11.4.2 公共方法
  241. 11.5 DEX和动态加载类机制
  242. 11.5.1 类加载机制
  243. 11.5.2 具体加载
  244. 11.5.3 代码加密
  245. 11.6 动态加载jar和DEX
  246. 第12章 Dvlik VM内存系统详解
  247. 12.1 如何分配内存
  248. 12.2 内存管理机制详解
  249. 12.3 优化Dalvik虚拟机的堆内存分配
  250. 第13章 Dalvik VM垃圾收集机制
  251. 13.1 引用计数算法
  252. 13.2 Mark Sweep算法
  253. 13.3 和垃圾收集算法有关的函数
  254. 13.4 垃圾回收的时机
  255. 13.5 调试信息
  256. 13.6 Dalvik VM和JVM垃圾收集机制的区别
  257. 第14章 Dalvik VM内存优化机制详解
  258. 14.1 sp和wp简介
  259. 14.1.1 sp基础
  260. 14.1.2 wp基础
  261. 14.2 智能指针详解
  262. 14.2.1 智能指针基础
  263. 14.2.2 轻量级指针
  264. 14.2.3 强指针
  265. 14.2.4 弱指针
  266. 第15章 分析Dalvik VM的启动过程
  267. 15.1 Dalvik VM启动流程概览
  268. 15.2 Dalvik VM启动过程详解
  269. 15.2.1 创建Dalvik VM实例
  270. 15.2.2 指定一系列控制选项
  271. 15.2.3 创建并初始化Dalvik VM实例
  272. 15.2.4 创建JNIEnvExt对象
  273. 15.2.5 设置当前进程和进程组ID
  274. 15.2.6 注册Android核心类的JNI方法
  275. 15.2.7 创建javaCreateThreadEtc钩子
  276. 第16章 注册Dalvik VM并创建线程
  277. 16.1 注册Dalvik VM的JNI方法
  278. 16.1.1 设置加载程序
  279. 16.1.2 加载so文件并验证
  280. 16.1.3 获取描述类
  281. 16.1.4 注册JNI方法
  282. 16.1.5 实现JNI操作
  283. 16.2 创建Dalvik VM进程
  284. 16.2.1 分析底层启动过程
  285. 16.2.2 创建Dalvik VM进程
  286. 16.2.3 初始化运行的Dalvik VM
  287. 16.3 创建Dalvik VM线程
  288. 16.3.1 检查状态值
  289. 16.3.2 创建线程
  290. 16.3.3 分析启动过程
  291. 16.3.4 清理线程
  292. 第17章 Dalvik VM异常处理详解
  293. 17.1 Java异常处理机制
  294. 17.1.1 方法调用栈
  295. 17.1.2 Java提供的异常处理类
  296. 17.2 Java VM异常处理机制详解
  297. 17.2.1 Java语言及虚拟机的异常处理机制
  298. 17.2.2 COSIX虚拟机异常处理的设计与实现
  299. 17.3 分析Dalvik虚拟机异常处理的源码
  300. 17.3.1 初始化虚拟机使用的异常Java类库
  301. 17.3.2 抛出一个线程异常
  302. 17.3.3 持续抛出进程
  303. 17.3.4 找出异常原因
  304. 17.3.5 找出异常原因
  305. 17.3.6 清除挂起的异常和等待初始化的异常
  306. 17.3.7 包装“现在等待”异常的不同例外
  307. 17.3.8 输出跟踪当前异常的错误信息
  308. 17.3.9 搜索和当前异常相匹配的方法
  309. 17.3.10 获取匹配的捕获块
  310. 17.3.11 进行堆栈跟踪
  311. 17.3.12 生成堆栈跟踪元素
  312. 17.3.13 将内容添加到堆栈跟踪日志中
  313. 17.3.14 将内容添加到堆栈跟踪日志中
  314. 17.4 常见异常的类型与原因
  315. 17.4.1 SQLException:操作数据库异常类
  316. 17.4.2 ClassCastException:数据类型转换异常
  317. 17.4.3 NumberFormatException:字符串转换为数字类型时抛出的异常
  318. 17.5 调用堆栈跟踪分析异常
  319. 17.5.1 解决段错误
  320. 17.5.2 跟踪Android Callback调用堆栈
  321. 第18章 JIT编译
  322. 18.1 JIT简介
  323. 18.1.1 JIT概述
  324. 18.1.2 Java虚拟机主要的优化技术
  325. 18.1.3 Dalvik中JIT的实现
  326. 18.2 Dalvik VM对JIT的支持
  327. 18.3 汇编代码和改动
  328. 18.3.1 汇编部分代码
  329. 18.3.2 对C文件的改动
  330. 18.4 Dalvik VM中的JIT源码
  331. 18.4.1 入口文件
  332. 18.4.2 核心函数
  333. 18.4.3 编译文件
  334. 18.4.4 BasicBlock处理
  335. 18.4.5 内存初始化
  336. 18.4.6 对JIT源码的总结
  337. 第19章 Dalvik VM内存优化
  338. 19.1 Android内存优化的作用
  339. 19.2 查看Android内存和CPU使用情况
  340. 19.2.1 利用Android API函数查看
  341. 19.2.2 直接对Android文件进行解析查询
  342. 19.2.3 通过Runtime类实现
  343. 19.2.4 使用DDMS工具获取
  344. 19.2.5 其他方法
  345. 19.3 Android的内存泄露
  346. 19.3.1 什么是内存泄漏
  347. 19.3.2 为什么会发生内存泄露
  348. 19.3.3 shallow size、retained size
  349. 19.3.4 查看Android内存泄露的工具——MAT
  350. 19.3.5 查看Android内存泄露的方法
  351. 19.3.6 Android(Java)中常见的容易引起内存泄漏的不良代码
  352. 19.4 常见的引起内存泄露的坏习惯
  353. 19.4.1 查询数据库时忘记关闭游标
  354. 19.4.2 构造Adapter时不习惯使用缓存的convertView
  355. 19.4.3 没有及时释放对象的引用
  356. 19.4.4 不在使用Bitmap对象时调用recycle()释放内存
  357. 19.5 解决内存泄露实践
  358. 19.5.1 使用MAT根据heap dump分析Java代码内存泄漏的根源
  359. 19.5.2 演练Android中内存泄露代码优化及检测
  360. 第20章 Dalvik VM性能优化
  361. 20.1 加载APK/DEX文件优化
  362. 20.1.1 APK文件介绍
  363. 20.1.2 DEX文件优化
  364. 20.1.3 使用类动态加载技术实现加密优化
  365. 20.2 SD卡优化
  366. 20.3 虚拟机优化详解
  367. 20.3.1 平台优化—ARM的流水线技术
  368. 20.3.2 Android对C库优化
  369. 20.3.3 优化创建的进程
  370. 20.3.4 渲染优化
  371. 第21章 分析ART的启动过程
  372. 21.1 运行环境的转换
  373. 21.2 运行 app_process 进程
  374. 21.3 准备启动
  375. 21.4 创建运行实例
  376. 21.5 注册本地JNI函数
  377. 21.6 启动守护进程
  378. 21.7 解析参数
  379. 21.8 初始化类、方法和域
  380. 第22章 执行ART主程序
  381. 22.1 进入main主函数
  382. 22.2 查找目标类
  383. 22.2.1 函数LookupClass()
  384. 22.2.2 函数DefineClass()
  385. 22.2.3 函数InsertClass()
  386. 22.2.4 函数LinkClass()
  387. 22.3 类操作
  388. 22.4 实现托管操作
  389. 第23章 安装APK应用程序
  390. 23.1 PackageManagerService概述
  391. 23.2 主函数main
  392. 23.3 调用初始化函数
  393. 23.4 创建PackageManagerService服务
  394. 23.5 扫描并解析
  395. 23.6 保存解析信息
  396. 第24章 ART环境安装APK应用程序
  397. 24.1 Android安装APK概述
  398. 24.2 启动时安装
  399. 24.3 ART安装
  400. 24.4 实现dex2oat转换
  401. 24.4.1 参数解析
  402. 24.4.2 创建 OAT 文件指针
  403. 24.4.3 dex2oat 准备工作
  404. 24.4.4 提取 classes.dex 文件
  405. 24.4.5 创建 OAT 文件
  406. 24.5 APK 文件的转换

常见问题

没有Android开发经验能读懂这本书吗?
书中讲解方法偏通俗,但内容涉及虚拟机、内存与进程等底层概念,完全零基础的读者容易在流程部分卡住。建议先具备基本的Android应用开发经验,了解Activity生命周期和Java基础,再阅读会更顺畅。
这本书能代替源码阅读吗?
不能。本书提供的是知识框架和流程讲解,帮助读者理解Dalvik虚拟机的整体结构与运作方式,但具体实现细节仍需回到源码确认。较合适的方式是以本书为导读,配合源码和调试环境交替阅读。
书中关于虚拟机优化的内容适合直接用于项目吗?
优化与异常处理部分能帮助读者理解机制和常见问题成因,但具体项目中的性能调优还需结合设备、系统版本和实际 profiling 数据判断。建议把书中内容当作分析思路的来源,而非可直接套用的方案清单。

读者评论

查询本书

本站为索引目录:「全网查询」由您发起、在您的浏览器中运行,所列入口均指向第三方站点,请自行判断可用性。

作者简介

钟世礼 作者

钟世礼,目前公开资料有限,其相关背景信息尚未见到系统披露。从库内收录情况看,钟世礼有作品《深入解析Android 虚拟机》一种,分类归入编程设计。该书围绕 Android 虚拟机展开深入解析,属于面向开发者的技术类读物,题材集中在移动操作系统底层机制与程序运行原理方面。就写作取向而言,这类作品通常强调原理剖析与实现细节的结合,服务于希望理解 Android 运行环境的技术读者。由于作者生平资料较少,暂无法补充其教育背景、从业经历或其它著作信息;读者可将其视为一位在 Android 技术领域进行专题写作的作者,通过该书了解相关底层知识。

同一作者

同类高分