ASM 全埋點開發實戰

王灼洲 張偉

  • 出版商: 人民郵電
  • 出版日期: 2023-07-01
  • 定價: $599
  • 售價: 7.5$449
  • 語言: 簡體中文
  • 頁數: 388
  • ISBN: 7115612617
  • ISBN-13: 9787115612618
  • 相關分類: Android
  • 立即出貨 (庫存 < 3)

  • ASM 全埋點開發實戰-preview-1
  • ASM 全埋點開發實戰-preview-2
ASM 全埋點開發實戰-preview-1

商品描述

本書由業內專業團隊神策數據的專業人士編寫,結合實戰案例,深入淺出地介紹了ASM技術和Android全埋點技術。

作者從神策數據服務超過2000家客戶的經歷中,發現了行業用戶對全埋點技術的迫切需求。本書針對這一點,詳細、客觀地闡述了ASM在Android全埋點中的應用,涵蓋各種真實商業場景,並清晰地講解其技術原理和實現步驟,以幫助用戶利用好全埋點技術的特長和優勢。

本書作為一本技術參考書,特別適合非專業開發工程師在日常工作中使用。

作者簡介

王灼洲是《Android 全埋点解决方案》《iOS 全埋点解决方案》作者,担任数据治理研发部负责,有超过十年的Android & iOS 相关开发经验,是国内早期从事 Android 研发工作的工程师。

 

张伟,从事移动研发工作超过十年,在神策主要负责埋点技术研究工作。编写过Flutter全埋点解决方案。

目錄大綱

1 Gradle插件介紹

1.1 什麽是Gradle插件 /002

1.2 Gradle基礎知識 /002

1.2.1 學習前提 /002

1.2.2 Gradle項目結構 /002

1.2.3 生命周期 /004

1.2.4 Project API介紹 /005

1.2.5 Gradle任務介紹 /007

1.2.6 生命周期回調 /013

1.2.7 Gradle執行流程 /018

1.2.8 獲取屬性的幾種常見方式 /018

1.2.9 任務執行後的幾種狀態 /018

1.2.10 增量構建 /019

1.3 插件類型 /022

1.3.1 腳本插件 /022

1.3.2 buildSrc插件 /024

1.3.3 單獨項目插件 /025

1.3.4 單獨項目插件優化 /028

1.3.5 插件使用方式 /032

1.3.6 小結 /034

1.4 Gradle擴展 /035

1.4.1 什麽是擴展 /035

1.4.2 ExtensionContainer API介紹 /035

1.4.3 創建擴展 /038

1.4.4 添加和查找擴展 /040

1.4.5 擴展嵌套 /042

1.4.6 NamedDomainObjectContainer /043

1.5 綜合示例 /050

1.5.1 概述 /050

1.5.2 集成步驟 /051

1.6 插件發布 /055

1.6.1 Gradle Plugin Portal /055

1.6.2 Maven Central簡介 /059

1.6.3 上傳到Maven Central /060

1.7 插件調試 /067

1.7.1 輸出日誌 /067

1.7.2 斷點調試 /068

1.8 小結 /070

 

2 Transform介紹

2.1 Android應用的構建 /072

2.1.1 什麽是APK文件 /072

2.1.2 什麽是DEX文件 /073

2.1.3 Android應用的構建流程 /073

2.2 Transform簡介 /076

2.3 Transform的簡單應用 /076

2.4 Transform API詳細介紹 /079

2.4.1 getName() /080

2.4.2 getInputTypes() /081

2.4.3 getScopes() /082

2.4.4 transform() /085

2.4.5 getReferencedScopes() /090

2.4.6 isIncremental() /091

2.4.7 isCacheable() /092

2.4.8 getSecondaryFiles() /092

2.5 Transform模板 /094

2.6 並發編譯 /101

2.7 Transform原理介紹 /102

2.8 小結 /106

 

3 字節碼基礎

3.1 Java虛擬機 /108

3.2 javap工具介紹 /108

3.3 特定名稱介紹 /113

3.3.1 字段描述符、方法描述符 /113

3.3.2 全限定名 /114

3.3.3  /116

3.4 .class文件結構 /117

3.4.1 初識 .class文件 /117

3.4.2 .class文件的組成 /118

3.5 小結 /151

 

4 字節碼指令

4.1 Java虛擬機棧 /154

4.2 棧幀 /155

4.3 局部變量表 /156

4.4 操作數棧 /158

4.5 字節碼指令介紹 /159

4.5.1 加載和存儲指令 /160

4.5.2 算術指令 /163

4.5.3 類型轉換指令 /166

4.5.4 對象的創建和操作指令 /167

4.5.5 操作數棧管理指令 /171

4.5.6 控制轉移指令 /175

4.5.7 方法調用和返回指令 /179

4.5.8 異常拋出指令 /180

4.5.9 同步指令 /180

4.6 方法調用 /181

4.6.1 invokevirtual指令 /181

4.6.2 invokestatic指令 /182

4.6.3 invokespecial指令 /183

4.6.4 invokeinterface指令 /185

4.6.5 方法調用指令的區別和方法分派 /185

4.6.6 invokedynamic指令 /191

4.7 案例分析 /195

4.7.1 System.out.println /195

4.7.2 switch-case與String /195

4.7.3 for循環原理 /198

4.7.4 try-catch-finally原理 /198

4.8 加載、鏈接、初始化 /203

4.8.1 加載時機 /204

4.8.2 加載過程 /205

4.8.3 字節碼剖析 /207

4.9 字節碼指令偏移 /211

4.10 Java虛擬機中的數據類型 /212

4.10.1 基本數據類型 /213

4.10.2 引用數據類型 /214

4.11 小結 /214

 

5 ASM基礎

5.1 ASM簡介 /216

5.2 ASM組成 /216

5.3 ClassReader API介紹 /217

5.3.1 構造方法 /217

5.3.2 accept()方法 /219

5.4 ClassVisitor API介紹 /221

5.4.1 ClassVisitor()構造方法 /222

5.4.2 visit() /223

5.4.3 visitSource() /223

5.4.4 visitModule() /223

5.4.5 visitNestHost() /224

5.4.6 visitNestMember() /227

5.4.7 visitInnerClass() /228

5.4.8 visitOuterClass() /228

5.4.9 visitField() /228

5.4.10 visitMethod() /229

5.4.11 visitAnnotation() /230

5.4.12 visitTypeAnnotation() /230

5.4.13 visitPermittedSubclass() /232

5.4.14 visitRecordComponent() /232

5.4.15 visitEnd() /233

5.5 ClassWriter API介紹 /233

5.5.1 構造方法 /233

5.5.2 toByteArray() /233

5.6 類的轉換和修改 /235

5.6.1 轉換類的方式 /235

5.6.2 刪除Class成員 /239

5.6.3 增加Class成員 /240

5.6.4 修改Class成員 /242

5.7 MethodVisitor API介紹 /245

5.7.1 visitParameter() /248

5.7.2 visitAnnotationDefault() /249

5.7.3 visitAnnotation() /249

5.7.4 visitTypeAnnotation() /250

5.7.5 visitAnnotableParameterCount()和visitParameterAnnotation() /251

5.7.6 visitAttribute() /252

5.7.7 visitCode() /252

5.7.8 visitInsn() /252

5.7.9 visitIntInsc() /253

5.7.10 visitVarInsn() /253

5.7.11 visitTypeInsn() /253

5.7.12 visitFieldInsn() /254

5.7.13 visitMethodInsn() /254

5.7.14 visitInvokeDynamicInsn() /254

5.7.15 visitLabel() /256

5.7.16 visitJumpInsn() /256

5.7.17 visitLdcInsn() /257

5.7.18 visitIincInsn() /258

5.7.19 visitTableSwitchInsn() /258

5.7.20 visitLookupSwitchInsn() /259

5.7.21 visitTryCatchBlock() /261

5.7.22 visitLocalVariable和visitLineNumber() /261

5.7.23 visitFrame() /261

5.7.24 visitMaxs() /263

5.7.25 visitEnd() /264

5.8 方法的轉換和修改 /264

5.8.1 方法生成 /264

5.8.2 刪除方法和方法體內容 /266

5.8.3 優化方法中的指令 /267

5.9 ASM工具包介紹 /269

5.9.1 Type /269

5.9.2 TraceClassVisitor /270

5.9.3 CheckClassAdapter /271

5.9.4 ASMifier /274

5.9.5 TraceMethodVisitor /278

5.9.6 CheckMethodAdapter /278

5.9.7 LocalVariableSorter /278

5.9.8 GeneratorAdapter /282

5.9.9 AdviceAdapter /283

5.10 其他實例 /284

5.10.1 方法替換 /284

5.10.2 方法參數復用 /286

5.11 小結 /288

 

6 ASM基礎之Tree API

6.1 Tree API簡介 /290

6.2 ClassNode API介紹 /290

6.2.1 類的生成 /293

6.2.2 類的轉換和修改 /294

6.3 ClassNode與Core API相互轉換 /295

6.3.1 ClassNode的特性 /296

6.3.2 與Core API相互轉換 /296

6.4 MethodNode API介紹 /299

6.4.1 方法的生成 /303

6.4.2 方法的轉換和修改 /304

6.5 MethodNode與Core API相互轉換 /305

6.5.1 MethodNode的特性 /305

6.5.2 與Core API相互轉換 /305

6.6 Core API和Tree API如何選擇 /307

6.7 其他 /307

6.7.1 方法分析 /307

6.7.2 兼容性探討 /311

6.7.3 Attribute /314

6.7.4 ASM框架分析 /315

6.8 小結 /322

 

7 ASM實現全埋點——基礎部分

7.1 目標 /324

7.2 實現步驟 /324

7.2.1 創建Demo工程和SDK模塊 /324

7.2.2 創建插件框架 /328

7.2.3 編寫插件邏輯 /332

7.2.4 驗證 /335

7.2.5 發布 /336

7.3 小結 /336

 

8 ASM實現全埋點——進階部分

8.1 黑名單 /338

8.2 防止多次插入 /341

8.3 方法前插還是後插 /344

8.4 支持Lambda和方法引用 /346

8.4.1 原因分析 /346

8.4.2 Lambda表達式的實現原理 /347

8.4.3 Lambda設計參考 /360

8.4.4 Hook Lambda和方法引用 /365

8.5 小結 /376

 

9 ASM實踐分享和未來展望

9.1 是否可以註冊多個Transform /378

9.2 插入代碼是否會改變行號 /378

9.3 是否支持Kotlin /380

9.4 ASM如何處理繼承關系 /381

9.4.1 ClassLoader方式 /382

9.4.2 類圖方式 /384

9.5 慎用static變量 /384

9.6 AGP 7的變化 /385

9.7 小結 /388