搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
深入理解Android.Java虚拟机ART.ART JVM
0.00    
图书来源: 浙江图书馆(由图书馆配书)
  • 配送范围:
    全国(除港澳台地区)
  • ISBN:
    9787111621225
  • 作      者:
    邓凡平著
  • 出 版 社 :
    机械工业出版社
  • 出版日期:
    2019
收藏
编辑推荐

(1)作者是资深Android技术专家,从2011年开始研究和分析Android源代码,是国内Android源码分析领域的奠基人物

(2)作者策划和主笔的“深入理解Android”系列图书,已经出版7部,累计销售超过10万册,是Android源码分析领域的标杆,系统性和深度兼顾

(3)本书从源码角度深度剖析Android Java虚拟机ART架构、设计和实现原理,深刻揭示JVM工作流程与机制


展开
作者简介

邓凡平  

资深Android技术专家,国内早期从事Android技术研究和开发的工程师之一。从底层的虚拟机,到中间的系统层和框架层,再到上层的各种应用,它对整个Android系统的源代码有非常深入的研究和理解。策划并撰写了“深入理解Android”系列图书(目前已出版8本),累计销量超过10万册,是广大Android工程师系统、深入了解Android系统源代码。

目前就职于民生银行总行科技部创新技术研究院,钻研和探索物联网等新技术在金融领域中的应用。曾就职于索尼移动,担任资深软件架构师。

他本人已出版著作:

《深入理解Android:卷I》(2011年)

《深入理解Android:卷II》(2012年)

《深入理解Android:Wi-Fi、NFC和GPS卷》(2014年)


展开
内容介绍

这是一部从源代码角度分析和讲解Android虚拟机ART的鸿篇巨著,核心内容和价值体现在3个方面:

首先,细致、深入地分析了ART虚拟机的架构、设计与实现原理,能让读者对ART虚拟机有透彻了解;

第二,能让Andriod系统工程师和应用工程师从底层了解整个Android系统的运行机理,从而写出更高质量的应用;

第三,Java虚拟机是一个“庞然大物”,学习和理解的门槛较高,ART是迄今应用广泛的JVM实现,本书为读者学习JVM提供了独特的视角和更为容易的路径。

全书共14章:

第1章介绍了在学习ART虚拟机前需要准备的工具和环境,以及本书的内容结构和阅读注意事项,建议仔细读和反复读;

第2~4章详细讲解了Class文件、dex文件和ELF文件的格式和内容,理解Class文件是学习JVM的一步,dex和ELF者是学习Dalvik虚拟机和ART虚拟机的的前提和基础;

第5章详细讲解了ART虚拟机的实现语言C++11,是阅读ART源代码必备的知识;

第6~8章详细讲解了ART虚拟机中与编译和Runtime相关的大量知识,这是虚拟机的核心和难点;

第9章详细讲解了dex字节码转机器码的核心进程dex2oat以及.oat和.art的文件格式;

第10~11章详细讲解了虚拟机的解释执行、JIT部分以及异常的投递和处理的过程,以及JNI在ART虚拟机中的实现。

第12~14章详细讲解了虚拟机中Java线程的执行、内存分配和释放、垃圾回收的原理与实现。

本书是经典丛书“深入理解Android”系列的第8本,继承了该系列图书严谨、细致、深入、编排考究的优点,相信所有Android工程师和Java工程师都能从中受益。


展开
精彩书评

随着Android设备的大规模普及,ART虚拟机已经成为当今世上使用广泛的JVM之一。对ART虚拟机的研究有着非同寻常的意义,而本书则在一定程度上填补了这方面的空白。它对ART虚拟机的架构设计和实现原理进行了细致入微的分析,不仅对Android工程师学习ART虚拟机有帮助,也对Java工程师学习JVM有极大的价值。

—— 毛斌 民生银行总行信息科技部副总经理

 

从2011年至今,凡平对整个Android系统的源代码进行了反复阅读和剖析,代码多达百万行,在此基础上出版专著4本,对Android领域的贡献巨大。这次,他向Android Java虚拟机ART发起挑战,历时近3年,完成了这部近1000页的巨著,一如既往地保持了过去的高水准!

—— 周志明 远光软件研究院院长、《深入理解Java虚拟机》《智慧的疆界》作者

 

我在研发Android热修复框架时遇到方法调用地址错乱、类型转换错误、补丁不生效等很多疑难杂症,解决这些难题需要对底层虚拟机有深入了解,但苦于相关资料匮乏,一直有很多困惑没有解开。本书对Android ART虚拟机源码进行分析,对混合编译器dex2oat、解释器、JIT、多线程管理以及垃圾回收等虚拟机核心技术进行了深入讲解,读完后令我豁然开朗,知其所以然。

—— 赵旭阳 滴滴出行资深研发工程师/滴滴Android热修复负责人/本书审稿专家

 

性能监控方面的数据采集、分析需要了解底层原理,比如oat的文件结构、Java方法的执行、JIT的原理和触发时机、线程如何切换状态、异常信号处理、堆和栈产生OOM的原理、GC触发时机和几种GC模式的执行原理、内存的分配和管理、异常的投递等,这些都是我们在做性能优化的过程中持续关注的地方。之前只关注了Java虚拟机的局部内容,本书做了一个完整的解析,可以帮助我们掌握JVM的执行原理,了解问题的本质。

—— 孙鹏飞 滴滴出行资深研发工程师/本书审稿专家

 

本书通过源码深入和系统地分析了Android Java虚拟机ART的Class文件、dex文件、 dex2oat、JIT、多线程同步、内存分配和回收等关键组件的实现原理。内容翔实、重点突出,大幅降低了学习ART的难度。我在工作中遇到的ART的疑难问题都能在本书中找到答案。应用开发工程师深入理解后,可以开发出更加高质量、高性能和高稳定性的应用;系统工程师阅读后,可以优化ART虚拟机并且解决它的稳定性修复等疑难问题。

—— 钟长庚 高通无线半导体技术有限公司资深工程师/本书审稿专家

 

 


展开
目录

推荐序

前言

第1章 本书必读1

1.1 概述1

1.2 准备环境和工具2

1.2.1 准备源代码2

1.2.2 准备Source Insight2

1.2.3 准备模拟器和自制系统镜像5

1.2.4 小结8

1.3 本书的内容9

1.4 本书资源下载说明12

第2章 深入理解Class文件格式13

2.1 Class文件格式总览13

2.2 常量池及相关内容14

2.2.1 常量项的类型和关系14

2.2.2 信息描述规则18

2.2.3 常量池实例剖析19

2.3 field_info和method_info19

2.4 access_flags介绍21

2.5 属性介绍22

2.5.1 属性概貌22

2.5.2 Code属性23

2.5.3 LineNumberTable属性25

2.5.4 LocalVariableTable属性26

2.6 Java指令码介绍27

2.6.1 指令码和助记符27

2.6.2 如何阅读规范28

2.7 学习路线推荐30

2.8 参考资料30

第3章 深入理解Dex文件格式31

3.1 Dex文件格式总览31

3.1.1 Dex和Class文件格式的区别31

3.1.2 Dex文件格式的概貌35

3.2 认识Dex文件36

3.2.1 header_item36

3.2.2 string_id_item等37

3.2.3 class_def38

3.2.4 code_item40

3.3 Dex指令码介绍41

3.3.1 insns的组织形式41

3.3.2 指令码描述规则42

3.4 学习路线推荐44

3.5 参考资料45

第4章 深入理解ELF文件格式46

4.1 概述46

4.2 ELF文件格式介绍46

4.2.1 ELF文件头结构介绍47

4.2.2 Linking View下的ELF52

4.2.3 Execution View下的ELF61

4.2.4 实例分析:调用动态库中的函数65

4.2.5 ELF总结72

4.3 学习路线推荐73

4.4 参考资料73

第5章 认识C++1174

5.1 数据类型76

5.1.1 基本内置数据类型介绍76

5.1.2 指针、引用和void类型77

5.1.3 字符和字符串81

5.1.4 数组82

5.2 C++源码构成及编译83

5.2.1 头文件示例83

5.2.2 源文件示例85

5.2.3 编译86

5.3 Class介绍88

5.3.1 构造、赋值和析构函数89

5.3.2 类的派生和继承97

5.3.3 友元和类的前向声明103

5.3.4 explicit构造函数105

5.3.5 C++中的struct106

5.4 操作符重载106

5.4.1 操作符重载的实现方式107

5.4.2 输出和输入操作符重载108

5.4.3 ->和*操作符重载110

5.4.4 new和delete操作符重载111

5.4.5 函数调用运算符重载117

5.5 函数模板与类模板118

5.5.1 函数模板119

5.5.2 类模板122

5.6 lambda表达式125

5.7 STL介绍127

5.7.1 string类128

5.7.2 容器类129

5.7.3 算法和函数对象介绍134

5.7.4 智能指针类138

5.7.5 探讨STL的学习140

5.8 其他常用知识141

5.8.1 initializer_list141

5.8.2 带作用域的enum141

5.8.3 constexpr142

5.8.4 static_assert143

5.9 参考资料143

第6章 编译dex字节码为机器码145

6.1 编译器全貌介绍147

6.2 编译器前端介绍150

6.2.1 词法分析和lex151

6.2.2 语法分析和yacc160

6.2.3 语义分析和IR生成介绍171

6.3 优化器介绍175

6.3.1 构造CFG176

6.3.2 分析和处理CFG181

6.3.3 数据流分析与SSA191

6.3.4 IR优化204

6.4 ART中的IR—HInstruction222

6.4.1 ART中的IR222

6.4.2 IR之间的关系225

6.4.3 ART IR对象的初始化231

6.5 寄存器分配233

6.5.1 LSRA介绍235

6.5.2 LSRA相关代码介绍247

6.6 机器码生成相关代码介绍271

6.6.1 GenerateFrameEntry272

6.6.2 VisitAdd和VisitInstance-FieldGet273

6.6.3 GenerateSlowPaths275

6.7 总结277

6.8 参考资料280

第7章 虚拟机的创建283

7.1 概述284

7.1.1 JniInvocation Init函数介绍286

7.1.2 AndroidRuntime startVm函数介绍287

7.2 Runtime Create介绍288

7.2.1 Create函数介绍288

7.2.2 Init函数介绍290

7.3 MemMap与OatFileManager293

7.3.1 MemMap介绍293

7.3.2 OatFileManager介绍298

7.4 FaultManager介绍302

7.4.1 信号处理和SignalAction介绍302

7.4.2 FaultManager介绍307

7.5 Thread介绍311

7.5.1 Startup函数介绍311

7.5.2 Attach函数介绍312

7.6 Heap学习之一325

7.6.1 初识Heap中的关键类326

7.6.2 Heap构造函数第一部分337

7.7 JavaVMExt和JNIEnvExt340

7.7.1 JavaVMExt341

7.7.2 JNIEnvExt343

7.7.3 总结344

7.8 ClassLinker345

7.8.1 关键类介绍345

7.8.2 ClassLinker构造函数352

7.8.3 InitFromBootImage353

7.8.4 ClassLinker总结360

7.9 总结和阅读指导362

第8章 虚拟机的启动363

8.1 Runtime Start364

8.2 初识JNI365

8.2.1 JNI中的数据类型365

8.2.2 ScopedObjectAccess等辅助类367

8.2.3 常用JNI函数介绍369

8.3 Jit LoadCompilerLibrary373

8.4 Runtime InitNativeMethods374

8.4.1 JniConstants Init374

8.4.2 RegisterRuntimeNative Methods375

8.4.3 WellKnownClasses Init和LastInit376

8.5 Thread相关376

8.5.1 Runtime InitThreadGroups377

8.5.2 Thread FinishSetup377

8.5.3 Runtime StartDaemonThreads380

8.6 Runtime CreateSystemClassLoader381

8.7 类的加载、链接和初始化383

8.7.1 关键类介绍383

8.7.2 SetupClass392

8.7.3 LoadClass相关函数393

8.7.4 LinkClass相关函数398

8.7.5 DefineClass414

8.7.6 Verify相关函数416

8.7.7 Initialize相关函数424

8.7.8 ClassLinker中其他常用函数426

8.7.9 ClassLoader介绍437

8.8 虚拟机创建和启动关键内容梳理445

第9章 深入理解dex2oat447

9.1 概述448

9.2 ParseArgs介绍452

9.2.1 CompilerOptions类介绍453

9.2.2 ProcessOptions函数介绍454

9.2.3 InsertCompileOptions函数介绍455

9.3 OpenFile介绍456

9.4 Setup介绍458

9.4.1 Setup代码分析之一458

9.4.2 Setup代码分析之二464

9.4.3 Setup代码分析之三474

9.4.4 Setup代码分析之四484

9.5 CompileImage484

9.5.1 Compile485

9.5.2 ArtCompileDEX496

9.5.3 OptimizingCompiler JniCompile499

9.5.4 OptimizingCompiler Compile527

9.6 OAT和ART文件格式介绍544

9.6.1 OAT文件格式544

9.6.2 ART文件格式550

9.6.3 oatdump介绍554

9.7 总结561

第10章 解释执行和JIT562

10.1 基础知识564

10.1.1 LinkCode564

10.1.2 Runtime ArtMethod566

10.1.3 栈和参数传递572

10.2 解释执行580

10.2.1 art_quick_to_interpreter_bridge580

10.2.2 artQuickToInterpreter-Bridge582

10.2.3 EnterInterpreterFromEntry-Point584

10.2.4 调用栈的管理和遍历593

10.3 ART中的JIT599

10.3.1 Jit、JitCodeCache等600

10.3.2 JIT阈值控制与处理609

10.3.3 OSR的处理612

10.4 HDeoptimize的处理615

10.4.1 VisitDeoptimize相关616

10.4.2 QuickExceptionHandler相关618

10.4.3 解释执行中关于Deoptimize的处理621

10.5 Instrumentation介绍623

10.5.1 MethodEnterEvent和MethodExitEvent624

10.5.2 DexPcMovedEvent625

10.6 异常投递和处理625

10.6.1 抛异常626

10.6.2 异常处理629

10.7 总结635

第11章 ART中的JNI636

11.1 JavaVM和JNIEnv637

11.1.1 JavaVMExt相关介绍638

11.1.2 JNIEnvExt介绍642

11.2 Java native方法的调用644

11.2.1 art_jni_dlsym_lookup_stub644

11.2.2 art_quick_generic_jni_trampoline646

11.3 CallStaticVoidMethod651

11.4 JNI中引用型对象的管理653

11.4.1 关键类介绍653

11.4.2 JniMethodStart和JniMethod-End657

11.4.3 IndirectReferenceTable相关函数658

11.4.4 NewObject和jobject的含义660

11.4.5 JNI中引用对象相关662

11.4.6 PushLocalFrame和PopLocalFrame663

11.4.7 回收引用对象664

11.5 总结666

第12章 CheckPoints、线程同步及信号处理668

12.1 CheckPoints介绍669

12.1.1 设置Check Point标志位670

12.1.2 Check Points的设置672

12.1.3 执行检查点处的任务676

12.2 ThreadList和ThreadState681

12.2.1 线程ID683

12.2.2 RunCheckpoint和Dump684

12.2.3 SuspendAll和ResumeAll687

12.2.4 Thread状态切换690

12.3 线程同步相关知识691

12.3.1 关键类介绍692

12.3.2 synchronized的处理697

12.3.3 Object wait、notifyAll等705

12.4 volatile成员的读写707

12.4.1 基础知识707

12.4.2 解释执行模式下的处理711

12.4.3 机器码执行模式的处理712

12.5 信号处理714

12.5.1 zygote进程的处理714

12.5.2 非zygote进程的处理716

12.6 总结719

第13章 内存分配与释放720

13.1 Space等关键类介绍722

13.2 ZygoteSpace723

13.3 BumpPointerSpace和RegionSpace725

13.3.1 BumpPointerSpace726

13.3.2 RegionSpace733

13.4 DlMallocSpace和RosAlloc-Space740

13.4.1 DlMallocSpace741

13.4.2 RosAllocSpace745

13.4.3 rosalloc介绍748

13.5 LargeObjectMapSpace760

13.6 new-instance/array指令的处理762

13.6.1 设置内存分配器762

13.6.2 解释执行模式下的处理767

13.6.3 机器码执行模式下的处理770

13.6.4 Heap AllocObjectWith-Allocator773

13.7 细观Space779

13.7.1 Space类779

13.7.2 ContinuousSpace和Discon-tinuousSpace类781

13.7.3 MemMapSpace和Continuous MemMapAllocSpace类782

13.7.4 MallocSpace类783

13.8 Heap学习之二784

13.8.1 Heap构造函数784

13.8.2 关键类介绍792

13.8.3 ObjectVisitReferences806

13.9 总结812

第14章 ART中的GC813

14.1 GC基础知识814

14.1.1 Mark-Sweep Collection原理介绍815

14.1.2 Copying Collection原理介绍817

14.1.3 Mark-Compact Collection原理介绍818

14.1.4 其他概念819

14.2 Runtime VisitRoots819

14.2.1 关键数据结构821

14.2.2 Thread VisitRoots824

14.3 ART GC概览827

14.3.1 关键数据结构827

14.3.2 ART GC选项830

14.3.3 创建回收器和设置回收策略832

14.4 MarkSweep835

14.4.1 Heap相关成员变量取值情况835

14.4.2 MarkSweep概貌837

14.4.3 MarkingPhase840

14.4.4 PausePhase848

14.4.5 ReclaimPhase851

14.4.6 FinishPhase857

14.4.7 PartialMarkSweep857

14.4.8 StickyMarkSweep858

14.4.9 Concurrent MarkSweep864

14.4.10 Parallel GC868

14.4.11 MarkSweep小结869

14.5 ConcurrentCopying870

14.5.1 InitalizePhase871

14.5.2 FlipThreadRoots873

14.5.3 MarkingPhase881

14.5.4 ReclaimPhase883

14.5.5ConcurrentCopying小结885

14.6 MarkCompact885

14.6.1 MarkingPhase886

14.6.2 ReclaimPhase889

14.6.3 MarkCompact小结891

14.7 SemiSpace892

14.7.1 InitializePhase893

14.7.2 MarkingPhase894

14.7.3 SemiSpace小结898

14.8 Java Reference对象的处理899

14.8.1 基础知识899

14.8.2 MarkSweep中Reference对象的处理903

14.8.3ReferenceProcessor904

14.8.4 PhantomReference的处理912

14.8.5 finalize函数的调用913

14.8.6 Reference处理小结917

14.9 Heap学习之三917

14.9.1 Heap Trim917

14.9.2 CollectGarbageInternal919

14.9.3 PreZygoteFork924

14.9.4 内存碎片的解决926

14.10 总结927

14.11 参考资料928


展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证