內(nèi)容介紹
這是一部從源代碼角度分析和講解Android虛擬機ART的鴻篇巨著,核心內(nèi)容和價值體現(xiàn)在3個方面:
第一,細致、深入地分析了ART虛擬機的架構(gòu)、設(shè)計與實現(xiàn)原理,能讓讀者對ART虛擬機有透徹了解;
第二,能讓Andriod系統(tǒng)工程師和應(yīng)用工程師從底層了解整個Android系統(tǒng)的運行機理,從而寫出更高質(zhì)量的應(yīng)用;
第三,Java虛擬機是一個“龐然大物”,學(xué)習(xí)和理解的門檻較高,ART是迄今應(yīng)用*為廣泛的JVM實現(xiàn),本書為讀者學(xué)習(xí)JVM提供了獨特的視角和更為容易的路徑。
全書共14章:
第1章介紹了在學(xué)習(xí)ART虛擬機前需要準(zhǔn)備的工具和環(huán)境,以及本書的內(nèi)容結(jié)構(gòu)和閱讀注意事項,建議仔細讀和反復(fù)讀;
第2~4章詳細講解了Class文件、dex文件和ELF文件的格式和內(nèi)容,理解Class文件是學(xué)習(xí)JVM的第一步,dex和ELF者是學(xué)習(xí)Dalvik虛擬機和ART虛擬機的的前提和基礎(chǔ);
第5章詳細講解了ART虛擬機的實現(xiàn)語言C++11,是閱讀ART源代碼必備的知識;
第6~8章詳細講解了ART虛擬機中與編譯和Runtime相關(guān)的大量知識,這是虛擬機的核心和難點;
第9章詳細講解了dex字節(jié)碼轉(zhuǎn)機器碼的核心進程dex2oat以及.oat和.art的文件格式;
第10~11章詳細講解了虛擬機的解釋執(zhí)行、JIT部分以及異常的投遞和處理的過程,以及JNI在ART虛擬機中的實現(xiàn)。
第12~14章詳細講解了虛擬機中Java線程的執(zhí)行、內(nèi)存分配和釋放、垃圾回收的原理與實現(xiàn)。
本書是經(jīng)典叢書“深入理解Android”系列的第8本,繼承了該系列圖書嚴謹、細致、深入、編排考究的優(yōu)點,相信所有Android工程師和Java工程師都能從中受益。
推薦序
前言
第1章 本書必讀1
1.1 概述1
1.2 準(zhǔn)備環(huán)境和工具2
1.2.1 準(zhǔn)備源代碼2
1.2.2 準(zhǔn)備Source Insight2
1.2.3 準(zhǔn)備模擬器和自制系統(tǒng)鏡像5
1.2.4 小結(jié)8
1.3 本書的內(nèi)容9
1.4 本書資源下載說明12
第2章 深入理解Class文件格式13
2.1 Class文件格式總覽13
2.2 常量池及相關(guān)內(nèi)容14
2.2.1 常量項的類型和關(guān)系14
2.2.2 信息描述規(guī)則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 如何閱讀規(guī)范28
2.7 學(xué)習(xí)路線推薦30
2.8 參考資料30
第3章 深入理解Dex文件格式31
3.1 Dex文件格式總覽31
3.1.1 Dex和Class文件格式的區(qū)別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 指令碼描述規(guī)則42
3.4 學(xué)習(xí)路線推薦44
3.5 參考資料45
第4章 深入理解ELF文件格式46
4.1 概述46
4.2 ELF文件格式介紹46
4.2.1 ELF文件頭結(jié)構(gòu)介紹47
4.2.2 Linking View下的ELF52
4.2.3 Execution View下的ELF61
4.2.4 實例分析:調(diào)用動態(tài)庫中的函數(shù)65
4.2.5 ELF總結(jié)72
4.3 學(xué)習(xí)路線推薦73
4.4 參考資料73
第5章 認識C++1174
5.1 數(shù)據(jù)類型76
5.1.1 基本內(nèi)置數(shù)據(jù)類型介紹76
5.1.2 指針、引用和void類型77
5.1.3 字符和字符串81
5.1.4 數(shù)組82
5.2 C++源碼構(gòu)成及編譯83
5.2.1 頭文件示例83
5.2.2 源文件示例85
5.2.3 編譯86
5.3 Class介紹88
5.3.1 構(gòu)造、賦值和析構(gòu)函數(shù)89
5.3.2 類的派生和繼承97
5.3.3 友元和類的前向聲明103
5.3.4 explicit構(gòu)造函數(shù)105
5.3.5 C++中的struct106
5.4 操作符重載106
5.4.1 操作符重載的實現(xiàn)方式107
5.4.2 輸出和輸入操作符重載108
5.4.3 ->和*操作符重載110
5.4.4 new和delete操作符重載111
5.4.5 函數(shù)調(diào)用運算符重載117
5.5 函數(shù)模板與類模板118
5.5.1 函數(shù)模板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 算法和函數(shù)對象介紹134
5.7.4 智能指針類138
5.7.5 探討STL的學(xué)習(xí)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字節(jié)碼為機器碼145
6.1 編譯器全貌介紹147
6.2 編譯器前端介紹150
6.2.1 詞法分析和lex151
6.2.2 語法分析和yacc160
6.2.3 語義分析和IR生成介紹171
6.3 優(yōu)化器介紹175
6.3.1 構(gòu)造CFG176
6.3.2 分析和處理CFG181
6.3.3 數(shù)據(jù)流分析與SSA191
6.3.4 IR優(yōu)化204
6.4 ART中的IR—HInstruction222
6.4.1 ART中的IR222
6.4.2 IR之間的關(guān)系225
6.4.3 ART IR對象的初始化231
6.5 寄存器分配233
6.5.1 LSRA介紹235
6.5.2 LSRA相關(guān)代碼介紹247
6.6 機器碼生成相關(guān)代碼介紹271
6.6.1 GenerateFrameEntry272
6.6.2 VisitAdd和VisitInstance-FieldGet273
6.6.3 GenerateSlowPaths275
6.7 總結(jié)277
6.8 參考資料280
第7章 虛擬機的創(chuàng)建283
7.1 概述284
7.1.1 JniInvocation Init函數(shù)介紹286
7.1.2 AndroidRuntime startVm函數(shù)介紹287
7.2 Runtime Create介紹288
7.2.1 Create函數(shù)介紹288
7.2.2 Init函數(shù)介紹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函數(shù)介紹311
7.5.2 Attach函數(shù)介紹312
7.6 Heap學(xué)習(xí)之一325
7.6.1 初識Heap中的關(guān)鍵類326
7.6.2 Heap構(gòu)造函數(shù)第一部分337
7.7 JavaVMExt和JNIEnvExt340
7.7.1 JavaVMExt341
7.7.2 JNIEnvExt343
7.7.3 總結(jié)344
7.8 ClassLinker345
7.8.1 關(guān)鍵類介紹345
7.8.2 ClassLinker構(gòu)造函數(shù)352
7.8.3 InitFromBootImage353
7.8.4 ClassLinker總結(jié)360
7.9 總結(jié)和閱讀指導(dǎo)362
第8章 虛擬機的啟動363
8.1 Runtime Start364
8.2 初識JNI365
8.2.1 JNI中的數(shù)據(jù)類型365
8.2.2 ScopedObjectAccess等輔助類367
8.2.3 常用JNI函數(shù)介紹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相關(guān)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 關(guān)鍵類介紹383
8.7.2 SetupClass392
8.7.3 LoadClass相關(guān)函數(shù)393
8.7.4 LinkClass相關(guān)函數(shù)398
8.7.5 DefineClass414
8.7.6 Verify相關(guān)函數(shù)416
8.7.7 Initialize相關(guān)函數(shù)424
8.7.8 ClassLinker中其他常用函數(shù)426
8.7.9 ClassLoader介紹437
8.8 虛擬機創(chuàng)建和啟動關(guān)鍵內(nèi)容梳理445
第9章 深入理解dex2oat447
9.1 概述448
9.2 ParseArgs介紹452
9.2.1 CompilerOptions類介紹453
9.2.2 ProcessOptions函數(shù)介紹454
9.2.3 InsertCompileOptions函數(shù)介紹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 總結(jié)561
第10章 解釋執(zhí)行和JIT562
10.1 基礎(chǔ)知識564
10.1.1 LinkCode564
10.1.2 Runtime ArtMethod566
10.1.3 棧和參數(shù)傳遞572
10.2 解釋執(zhí)行580
10.2.1 art_quick_to_interpreter_bridge580
10.2.2 artQuickToInterpreter-Bridge582
10.2.3 EnterInterpreterFromEntry-Point584
10.2.4 調(diào)用棧的管理和遍歷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相關(guān)616
10.4.2 QuickExceptionHandler相關(guān)618
10.4.3 解釋執(zhí)行中關(guān)于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 總結(jié)635
第11章 ART中的JNI636
11.1 JavaVM和JNIEnv637
11.1.1 JavaVMExt相關(guān)介紹638
11.1.2 JNIEnvExt介紹642
11.2 Java native方法的調(diào)用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 關(guān)鍵類介紹653
11.4.2 JniMethodStart和JniMethod-End657
11.4.3 IndirectReferenceTable相關(guān)函數(shù)658
11.4.4 NewObject和jobject的含義660
11.4.5 JNI中引用對象相關(guān)662
11.4.6 PushLocalFrame和PopLocalFrame663
11.4.7 回收引用對象664
11.5 總結(jié)666
第12章 CheckPoints、線程同步及信號處理668
12.1 CheckPoints介紹669
12.1.1 設(shè)置Check Point標(biāo)志位670
12.1.2 Check Points的設(shè)置672
12.1.3 執(zhí)行檢查點處的任務(wù)676
12.2 ThreadList和ThreadState681
12.2.1 線程ID683
12.2.2 RunCheckpoint和Dump684
12.2.3 SuspendAll和ResumeAll687
12.2.4 Thread狀態(tài)切換690
12.3 線程同步相關(guān)知識691
12.3.1 關(guān)鍵類介紹692
12.3.2 synchronized的處理697
12.3.3 Object wait、notifyAll等705
12.4 volatile成員的讀寫707
12.4.1 基礎(chǔ)知識707
12.4.2 解釋執(zhí)行模式下的處理711
12.4.3 機器碼執(zhí)行模式的處理712
12.5 信號處理714
12.5.1 zygote進程的處理714
12.5.2 非zygote進程的處理716
12.6 總結(jié)719
第13章 內(nèi)存分配與釋放720
13.1 Space等關(guān)鍵類介紹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 設(shè)置內(nèi)存分配器762
13.6.2 解釋執(zhí)行模式下的處理767
13.6.3 機器碼執(zhí)行模式下的處理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學(xué)習(xí)之二784
13.8.1 Heap構(gòu)造函數(shù)784
13.8.2 關(guān)鍵類介紹792
13.8.3 ObjectVisitReferences806
13.9 總結(jié)812
第14章 ART中的GC813
14.1 GC基礎(chǔ)知識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 關(guān)鍵數(shù)據(jù)結(jié)構(gòu)821
14.2.2 Thread VisitRoots824
14.3 ART GC概覽827
14.3.1 關(guān)鍵數(shù)據(jù)結(jié)構(gòu)827
14.3.2 ART GC選項830
14.3.3 創(chuàng)建回收器和設(shè)置回收策略832
14.4 MarkSweep835
14.4.1 Heap相關(guān)成員變量取值情況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小結(jié)869
14.5 ConcurrentCopying870
14.5.1 InitalizePhase871
14.5.2 FlipThreadRoots873
14.5.3 MarkingPhase881
14.5.4 ReclaimPhase883
14.5.5ConcurrentCopying小結(jié)885
14.6 MarkCompact885
14.6.1 MarkingPhase886
14.6.2 ReclaimPhase889
14.6.3 MarkCompact小結(jié)891
14.7 SemiSpace892
14.7.1 InitializePhase893
14.7.2 MarkingPhase894
14.7.3 SemiSpace小結(jié)898
14.8 Java Reference對象的處理899
14.8.1 基礎(chǔ)知識899
14.8.2 MarkSweep中Reference對象的處理903
14.8.3ReferenceProcessor904
14.8.4 PhantomReference的處理912
14.8.5 finalize函數(shù)的調(diào)用913
14.8.6 Reference處理小結(jié)917
14.9 Heap學(xué)習(xí)之三917
14.9.1 Heap Trim917
14.9.2 CollectGarbageInternal919
14.9.3 PreZygoteFork924
14.9.4 內(nèi)存碎片的解決926
14.10 總結(jié)927
14.11 參考資料928