标签
内容简介
Android系统从诞生到现在的短短几年时间里,凭借其易用性和开发的简洁性,赢得了广大开发 者的支持。在整个Android系统中,Dalvik VM一直是贯穿从底层内核到高层应用开发的核心。本书循序渐进地讲解了Android虚拟机系统的基本知识,并剖析了其整个内存系统的进程和运作流程,并对虚拟机系统优化和异常处理的知识进行了详细讲解。本书几乎涵盖了Dalvik VM系统的所有主要内容,并且讲解方法通俗易懂,特别有利于读者学习并消化。 本书适合Android初学者、Android底层开发人员、源代码分析人员和虚拟机开发人员学习,也可以作为大专院校相关专业师生的学习用书和培训学校的教材。
编辑推荐
本书围绕Android系统中贯穿内核与上层应用的Dalvik虚拟机展开,从基本知识入手,逐步讲清内存系统的进程与运作流程,并延伸到虚拟机优化和异常处理。对于想理解Android应用为何这样运行、内存如何分配回收的读者,它提供了一条从概念到内部机制的路径。叙述风格偏通俗,注意降低底层知识的进入门槛,适合作为系统学习的参考而非零散查阅的手册。阅读时建议结合源码或调试环境对照理解,把抽象流程落到具体调用上,效果会更扎实。
适合谁读
适合
- Android应用开发初学者,想补齐虚拟机与内存机制基础
- Android底层开发人员,需要系统梳理Dalvik运行流程
- 源代码分析人员,希望获得虚拟机层面的导读框架
- 大专院校相关专业师生,可用作课程学习或培训教材
不适合
- 完全没有编程基础、首次接触移动开发的读者
- 只想快速查阅API用法、不关心底层机制的应用开发者
- 期待覆盖最新Android运行时全部细节的资深系统工程师
阅读建议
- 先通读基本知识与内存系统章节,建立整体流程图,再进入优化与异常处理部分。
- 阅读进程与内存运作流程时,打开对应源码或调试工具同步对照,避免只记结论。
- 每章结束后用自己的话复述关键流程,并整理一份虚拟机术语与调用关系笔记。
出版社简介
人民邮电出版社
中国 · 成立于 1953 年
人民邮电出版社以科技、计算机与信息通信类图书见长,并由此延伸至摄影、艺术、软件学习与励志成长等门类,形成较为多元的出版方向。库内图书既涵盖《重构与模式(修订版)》《华为交换机学习指南(第二版)》等计算机与通信技术读物,也收录《小王子(中英法彩绘典藏纪念版)》《了不起的盖茨比》《假如给我三天光明》等双语典藏类作品;《北京十年:1980-1990》与《鬼刀 WLOP个人插画作品集》则体现其在摄影与艺术领域的布局。作者资源包括安东尼·圣埃克苏佩里、海伦·凯勒、Joshua Kerievsky、王达、张兆增与WLOP等。
目录
- 版权信息
- 内容提要
- 前言
- 第1章 获取并编译Android源码
- 1.1 获取Android源码
- 1.1.1 在Linux系统获取Android源码
- 1.1.2 在Windows平台获取Android源码
- 1.1.3 Windows获取Android L源码
- 1.2 分析Android源码结构
- 1.3 编译Android源码
- 1.3.1 搭建编译环境
- 1.3.2 开始编译
- 1.3.3 在模拟器中运行
- 1.3.4 常见的错误分析
- 1.3.5 实践演练——演示两种编译Android程序的方法
- 1.4 编译Android Kernel
- 1.4.1 获取Goldfish内核代码
- 1.4.2 获取MSM内核代码
- 1.4.3 获取OMAP内核代码
- 1.4.4 编译Android的Linux内核
- 第2章 Java虚拟机基础
- 2.1 虚拟机的作用
- 2.2 Java虚拟机概述
- 2.2.1 JVM的数据类型
- 2.2.2 Java虚拟机体系结构
- 2.2.3 JVM的生命周期
- 2.3 JVM的安全性
- 2.3.1 JVM的安全模型
- 2.3.2 沙箱模型的4种组件
- 2.3.3 分析Java的策略机制
- 2.4 网络移动性
- 2.4.1 现实需要网络移动性
- 2.4.2 网络移动性
- 2.5 内存异常和垃圾处理
- 2.5.1 内存分配中的栈和堆
- 2.5.2 运行时的数据区域
- 2.5.3 对象访问
- 2.5.4 内存泄露
- 2.5.5 JVM的垃圾收集策略
- 2.5.6 垃圾收集器
- 2.6 Java内存模型
- 2.6.1 Java内存模型概述
- 2.6.2 主内存与工作内存
- 2.6.3 内存间交互操作
- 第3章 Dalvik和ART基础
- 3.1 Dalvik VM和JVM的差异
- 3.2 Dalvik虚拟机的主要特征
- 3.3 Dalvik VM架构
- 3.3.1 Dalvik虚拟机的代码结构
- 3.3.2 dx工具
- 3.3.3 Dalvik VM的进程管理
- 3.3.4 Android的初始化流程
- 3.4 Dalvik VM控制VM命令详解
- 3.4.1 基本命令
- 3.4.2 扩展的JNI检测
- 3.4.3 断言
- 3.4.4 字节码校验和优化
- 3.4.5 Dalvik VM的运行模式
- 3.4.6 死锁预测
- 3.4.7 dump堆栈追踪
- 3.4.8 dex文件和校验
- 3.4.9 产生标志位
- 3.5 ART机制基础
- 3.5.1 什么是ART模式
- 3.5.2 ART优化机制基础
- 第4章 分析JNI
- 4.1 JNI的本质
- 4.2 分析Java层
- 4.2.1 加载JNI库
- 4.2.2 实现扫描工作
- 4.2.3 读取并保存信息
- 4.2.4 删除SD卡外的信息
- 4.2.5 直接转向JNI
- 4.2.6 扫描函数scanFile
- 4.2.7 JNI中的异常处理
- 4.3 分析JNI层
- 4.3.1 将Native对象的指针保存到Java对象
- 4.3.2 创建Native层的MediaScanner对象
- 4.4 Native(本地)层
- 4.4.1 注册JNI函数
- 4.4.2 完成注册工作
- 4.4.3 动态注册
- 4.4.4 处理路径参数
- 4.4.5 扫描文件
- 4.4.6 添加TAG信息
- 4.4.7 总结函数JNI_OnLoad()与函数JNI_OnUnload()的用途
- 4.4.8 Java与JNI基本数据类型转换
- 4.4.9 JNIEnv接口
- 4.4.10 JNI中的环境变量
- 第5章 分析内存系统
- 5.1 分析Android的进程通信机制
- 5.1.1 Android的进程间通信(IPC)机制Binder
- 5.1.2 Service Manager是Binder机制的上下文管理者
- 5.1.3 Service Manager服务
- 5.2 匿名共享内存子系统详解
- 5.2.1 基础数据结构
- 5.2.2 初始化处理
- 5.2.3 打开匿名共享内存设备文件
- 5.2.4 内存映射
- 5.2.5 读写操作
- 5.2.6 锁定和解锁
- 5.2.7 回收内存块
- 5.3 C++访问接口层详解
- 5.3.1 接口MemoryBase
- 5.3.2 接口MemoryBase
- 5.4 Java访问接口层详解
- 第6章 Android程序的生命周期管理
- 6.1 Android程序的生命周期
- 6.1.1 进程和线程
- 6.1.2 进程的类型
- 6.2 Activity的生命周期
- 6.2.1 Activity的几种状态
- 6.2.2 分解剖析Activity
- 6.2.3 几个典型的场景
- 6.2.4 管理Activity的生命周期
- 6.2.5 Activity的实例化与启动
- 6.2.6 Activity的暂停与继续
- 6.2.7 Activity的关闭/销毁与重新运行
- 6.2.8 Activity的启动模式
- 6.3 进程与线程
- 6.3.1 进程
- 6.3.2 线程
- 6.3.3 线程安全的方法
- 6.3.4 Android的线程模型
- 6.4 测试生命周期
- 6.5 Service的生命周期
- 6.5.1 Service的基本概念和用途
- 6.5.2 Service的生命周期详解
- 6.5.3 Service与Activity通信
- 6.6 Android广播的生命周期
- 6.6.1 Android 的广播机制
- 6.6.2 编写广播程序
- 6.7 ART进程管理
- 第7章 IPC进程通信机制
- 7.1 Binder机制概述
- 7.2 Service Manager是Binder机制的上下文管理者
- 7.2.1 入口函数
- 7.2.2 打开Binder设备文件
- 7.2.3 创建设备文件
- 7.2.4 管理内存映射地址空间
- 7.2.5 发生通知
- 7.2.6 循环等待
- 7.3 内存映射
- 7.3.1 实现内存分配功能
- 7.3.2 分配物理内存
- 7.3.3 释放物理页面
- 7.3.4 分配内核缓冲区
- 7.3.5 释放内核缓冲区
- 7.3.6 查询内核缓冲区
- 第8章 init进程详解
- 8.1 init基础
- 8.2 分析入口函数
- 8.3 配置文件详解
- 8.3.1 init.rc简介
- 8.3.2 分析init.rc的过程
- 8.4 解析service
- 8.4.1 Zygote对应的service action
- 8.4.2 init组织service
- 8.4.3 函数parse_service和parse_line_service
- 8.5 字段on
- 8.5.1 Zygote对应的on action
- 8.5.2 init组织on
- 8.5.3 解析on用到的函数
- 8.6 在init控制service
- 8.6.1 启动Zygote
- 8.6.2 启动service
- 8.6.3 4种启动service的方式
- 8.7 控制属性服务
- 8.7.1 引入属性
- 8.7.2 初始化属性服务
- 8.7.3 启动属性服务
- 8.7.4 处理设置属性的请求
- 第9章 Dalvik VM的进程系统
- 9.1 Zygote(孕育)进程详解
- 9.1.1 Zygote基础
- 9.1.2 分析Zygote的启动过程
- 9.2 System进程详解
- 9.2.1 启动System进程前的准备工作
- 9.2.2 分析SystemServer
- 9.2.3 分析EntropyService
- 9.2.4 分析DropBoxManagerService
- 9.2.5 分析DiskStatsService
- 9.2.6 分析DeviceStorageManagerService
- 9.2.7 分析SamplingProfilerService
- 9.2.8 分析ClipboardService
- 9.3 应用程序进程详解
- 9.3.1 创建应用程序
- 9.3.2 启动线程池
- 9.3.3 创建信息循环
- 第10章 Dalvik VM运作流程详解
- 10.1 Dalvik VM相关的可执行程序
- 10.1.1 dalvikvm、dvz和app_process简介
- 10.1.2 对比app_process和dalvikvm的执行过程
- 10.2 初始化Dalvik虚拟机
- 10.2.1 开始虚拟机的准备工作
- 10.2.2 初始化跟踪显示系统
- 10.2.3 初始化垃圾回收器
- 10.2.4 初始化线程列表和主线程环境参数
- 10.2.5 分配内部操作方法的表格内存
- 10.2.6 初始化虚拟机的指令码相关的内容
- 10.2.7 分配指令寄存器状态的内存
- 10.2.8 分配指令寄存器状态的内存和最基本用的Java库
- 10.2.9 初始化使用的Java类库线程类
- 10.2.10 初始化虚拟机使用的异常Java类库
- 10.2.11 初始化其他对象
- 10.3 启动Zygote
- 10.3.1 在init.rc中配置Zygote启动参数
- 10.3.2 启动Socket服务端口
- 10.3.3 加载preload-classes
- 10.3.4 加载preload-resources
- 10.3.5 使用folk启动新进程
- 10.4 启动SystemServer进程
- 10.4.1 启动各种系统服务线程
- 10.4.2 启动第一个Activity
- 10.5 加载class类文件
- 10.5.1 DexFile在内存中的映射
- 10.5.2 ClassObject——Class在加载后的表现形式
- 10.5.3 加载Class并生成相应ClassObject的函数
- 10.5.4 加载基本类库文件
- 10.5.5 加载用户类文件
- 第11章 DEX文件详解
- 11.1 DEX文件介绍
- 11.2 DEX文件的格式
- 11.2.1 map_list
- 11.2.2 string_id_item
- 11.2.3 type_id_item
- 11.2.4 proto_id_item
- 11.2.5 ield_id_item
- 11.2.6 method_id_item
- 11.2.7 class_def_item
- 11.3 DEX文件结构
- 11.3.1 文件头(File Header)
- 11.3.2 魔数字段
- 11.3.3 检验码字段
- 11.3.4 SHA-1签名字段
- 11.3.5 map_off字段
- 11.3.6 string_ids_size和off字段
- 11.4 DEXFile接口详解
- 11.4.1 构造函数
- 11.4.2 公共方法
- 11.5 DEX和动态加载类机制
- 11.5.1 类加载机制
- 11.5.2 具体加载
- 11.5.3 代码加密
- 11.6 动态加载jar和DEX
- 第12章 Dvlik VM内存系统详解
- 12.1 如何分配内存
- 12.2 内存管理机制详解
- 12.3 优化Dalvik虚拟机的堆内存分配
- 第13章 Dalvik VM垃圾收集机制
- 13.1 引用计数算法
- 13.2 Mark Sweep算法
- 13.3 和垃圾收集算法有关的函数
- 13.4 垃圾回收的时机
- 13.5 调试信息
- 13.6 Dalvik VM和JVM垃圾收集机制的区别
- 第14章 Dalvik VM内存优化机制详解
- 14.1 sp和wp简介
- 14.1.1 sp基础
- 14.1.2 wp基础
- 14.2 智能指针详解
- 14.2.1 智能指针基础
- 14.2.2 轻量级指针
- 14.2.3 强指针
- 14.2.4 弱指针
- 第15章 分析Dalvik VM的启动过程
- 15.1 Dalvik VM启动流程概览
- 15.2 Dalvik VM启动过程详解
- 15.2.1 创建Dalvik VM实例
- 15.2.2 指定一系列控制选项
- 15.2.3 创建并初始化Dalvik VM实例
- 15.2.4 创建JNIEnvExt对象
- 15.2.5 设置当前进程和进程组ID
- 15.2.6 注册Android核心类的JNI方法
- 15.2.7 创建javaCreateThreadEtc钩子
- 第16章 注册Dalvik VM并创建线程
- 16.1 注册Dalvik VM的JNI方法
- 16.1.1 设置加载程序
- 16.1.2 加载so文件并验证
- 16.1.3 获取描述类
- 16.1.4 注册JNI方法
- 16.1.5 实现JNI操作
- 16.2 创建Dalvik VM进程
- 16.2.1 分析底层启动过程
- 16.2.2 创建Dalvik VM进程
- 16.2.3 初始化运行的Dalvik VM
- 16.3 创建Dalvik VM线程
- 16.3.1 检查状态值
- 16.3.2 创建线程
- 16.3.3 分析启动过程
- 16.3.4 清理线程
- 第17章 Dalvik VM异常处理详解
- 17.1 Java异常处理机制
- 17.1.1 方法调用栈
- 17.1.2 Java提供的异常处理类
- 17.2 Java VM异常处理机制详解
- 17.2.1 Java语言及虚拟机的异常处理机制
- 17.2.2 COSIX虚拟机异常处理的设计与实现
- 17.3 分析Dalvik虚拟机异常处理的源码
- 17.3.1 初始化虚拟机使用的异常Java类库
- 17.3.2 抛出一个线程异常
- 17.3.3 持续抛出进程
- 17.3.4 找出异常原因
- 17.3.5 找出异常原因
- 17.3.6 清除挂起的异常和等待初始化的异常
- 17.3.7 包装“现在等待”异常的不同例外
- 17.3.8 输出跟踪当前异常的错误信息
- 17.3.9 搜索和当前异常相匹配的方法
- 17.3.10 获取匹配的捕获块
- 17.3.11 进行堆栈跟踪
- 17.3.12 生成堆栈跟踪元素
- 17.3.13 将内容添加到堆栈跟踪日志中
- 17.3.14 将内容添加到堆栈跟踪日志中
- 17.4 常见异常的类型与原因
- 17.4.1 SQLException:操作数据库异常类
- 17.4.2 ClassCastException:数据类型转换异常
- 17.4.3 NumberFormatException:字符串转换为数字类型时抛出的异常
- 17.5 调用堆栈跟踪分析异常
- 17.5.1 解决段错误
- 17.5.2 跟踪Android Callback调用堆栈
- 第18章 JIT编译
- 18.1 JIT简介
- 18.1.1 JIT概述
- 18.1.2 Java虚拟机主要的优化技术
- 18.1.3 Dalvik中JIT的实现
- 18.2 Dalvik VM对JIT的支持
- 18.3 汇编代码和改动
- 18.3.1 汇编部分代码
- 18.3.2 对C文件的改动
- 18.4 Dalvik VM中的JIT源码
- 18.4.1 入口文件
- 18.4.2 核心函数
- 18.4.3 编译文件
- 18.4.4 BasicBlock处理
- 18.4.5 内存初始化
- 18.4.6 对JIT源码的总结
- 第19章 Dalvik VM内存优化
- 19.1 Android内存优化的作用
- 19.2 查看Android内存和CPU使用情况
- 19.2.1 利用Android API函数查看
- 19.2.2 直接对Android文件进行解析查询
- 19.2.3 通过Runtime类实现
- 19.2.4 使用DDMS工具获取
- 19.2.5 其他方法
- 19.3 Android的内存泄露
- 19.3.1 什么是内存泄漏
- 19.3.2 为什么会发生内存泄露
- 19.3.3 shallow size、retained size
- 19.3.4 查看Android内存泄露的工具——MAT
- 19.3.5 查看Android内存泄露的方法
- 19.3.6 Android(Java)中常见的容易引起内存泄漏的不良代码
- 19.4 常见的引起内存泄露的坏习惯
- 19.4.1 查询数据库时忘记关闭游标
- 19.4.2 构造Adapter时不习惯使用缓存的convertView
- 19.4.3 没有及时释放对象的引用
- 19.4.4 不在使用Bitmap对象时调用recycle()释放内存
- 19.5 解决内存泄露实践
- 19.5.1 使用MAT根据heap dump分析Java代码内存泄漏的根源
- 19.5.2 演练Android中内存泄露代码优化及检测
- 第20章 Dalvik VM性能优化
- 20.1 加载APK/DEX文件优化
- 20.1.1 APK文件介绍
- 20.1.2 DEX文件优化
- 20.1.3 使用类动态加载技术实现加密优化
- 20.2 SD卡优化
- 20.3 虚拟机优化详解
- 20.3.1 平台优化—ARM的流水线技术
- 20.3.2 Android对C库优化
- 20.3.3 优化创建的进程
- 20.3.4 渲染优化
- 第21章 分析ART的启动过程
- 21.1 运行环境的转换
- 21.2 运行 app_process 进程
- 21.3 准备启动
- 21.4 创建运行实例
- 21.5 注册本地JNI函数
- 21.6 启动守护进程
- 21.7 解析参数
- 21.8 初始化类、方法和域
- 第22章 执行ART主程序
- 22.1 进入main主函数
- 22.2 查找目标类
- 22.2.1 函数LookupClass()
- 22.2.2 函数DefineClass()
- 22.2.3 函数InsertClass()
- 22.2.4 函数LinkClass()
- 22.3 类操作
- 22.4 实现托管操作
- 第23章 安装APK应用程序
- 23.1 PackageManagerService概述
- 23.2 主函数main
- 23.3 调用初始化函数
- 23.4 创建PackageManagerService服务
- 23.5 扫描并解析
- 23.6 保存解析信息
- 第24章 ART环境安装APK应用程序
- 24.1 Android安装APK概述
- 24.2 启动时安装
- 24.3 ART安装
- 24.4 实现dex2oat转换
- 24.4.1 参数解析
- 24.4.2 创建 OAT 文件指针
- 24.4.3 dex2oat 准备工作
- 24.4.4 提取 classes.dex 文件
- 24.4.5 创建 OAT 文件
- 24.5 APK 文件的转换
常见问题
没有Android开发经验能读懂这本书吗?
书中讲解方法偏通俗,但内容涉及虚拟机、内存与进程等底层概念,完全零基础的读者容易在流程部分卡住。建议先具备基本的Android应用开发经验,了解Activity生命周期和Java基础,再阅读会更顺畅。
这本书能代替源码阅读吗?
不能。本书提供的是知识框架和流程讲解,帮助读者理解Dalvik虚拟机的整体结构与运作方式,但具体实现细节仍需回到源码确认。较合适的方式是以本书为导读,配合源码和调试环境交替阅读。
书中关于虚拟机优化的内容适合直接用于项目吗?
优化与异常处理部分能帮助读者理解机制和常见问题成因,但具体项目中的性能调优还需结合设备、系统版本和实际 profiling 数据判断。建议把书中内容当作分析思路的来源,而非可直接套用的方案清单。
读者评论
查询本书
本站为索引目录:「全网查询」由您发起、在您的浏览器中运行,所列入口均指向第三方站点,请自行判断可用性。
作者简介
钟世礼
作者
钟世礼,目前公开资料有限,其相关背景信息尚未见到系统披露。从库内收录情况看,钟世礼有作品《深入解析Android 虚拟机》一种,分类归入编程设计。该书围绕 Android 虚拟机展开深入解析,属于面向开发者的技术类读物,题材集中在移动操作系统底层机制与程序运行原理方面。就写作取向而言,这类作品通常强调原理剖析与实现细节的结合,服务于希望理解 Android 运行环境的技术读者。由于作者生平资料较少,暂无法补充其教育背景、从业经历或其它著作信息;读者可将其视为一位在 Android 技术领域进行专题写作的作者,通过该书了解相关底层知识。