ASM 全埋點開發實戰
王灼洲 張偉
中文年末書展|繁簡參展書2書75折 詳見活動內容 »
-
75折
為你寫的 Vue Components:從原子到系統,一步步用設計思維打造面面俱到的元件實戰力 (iThome 鐵人賽系列書)$780$585 -
75折
BDD in Action, 2/e (中文版)$960$720 -
75折
看不見的戰場:社群、AI 與企業資安危機$750$563 -
79折
AI 精準提問 × 高效應用:DeepSeek、ChatGPT、Claude、Gemini、Copilot 一本搞定$390$308 -
7折
超實用!Word.Excel.PowerPoint 辦公室 Office 365 省時高手必備 50招, 4/e (暢銷回饋版)$420$294 -
75折
裂縫碎光:資安數位生存戰$550$412 -
85折
日本當代最強插畫 2025 : 150位當代最強畫師豪華作品集$640$544 -
79折
Google BI 解決方案:Looker Studio × AI 數據驅動行銷實作,完美整合 Google Analytics 4、Google Ads、ChatGPT、Gemini$630$498 -
79折
超有料 Plus!職場第一實用的 AI 工作術 - 用對 AI 工具、自動化 Agent, 讓生產力全面進化!$599$473 -
75折
從零開始學 Visual C# 2022 程式設計, 4/e (暢銷回饋版)$690$518 -
75折
Windows 11 制霸攻略:圖解 AI 與 Copilot 應用,輕鬆搞懂新手必學的 Windows 技巧$640$480 -
75折
精準駕馭 Word!論文寫作絕非難事 (好評回饋版)$480$360 -
Sam Yang 的插畫藝術:用 Procreate / PS 畫出最強男友視角 x 女孩美好日常$699$629 -
79折
AI 加持!Google Sheets 超級工作流$599$473 -
78折
想要 SSR? 快使用 Nuxt 吧!:Nuxt 讓 Vue.js 更好處理 SEO 搜尋引擎最佳化(iThome鐵人賽系列書)$780$608 -
75折
超實用!業務.總管.人資的辦公室 WORD 365 省時高手必備 50招 (第二版)$500$375 -
7折
Node-RED + YOLO + ESP32-CAM:AIoT 智慧物聯網與邊緣 AI 專題實戰$680$476 -
79折
「生成式⇄AI」:52 個零程式互動體驗,打造新世代人工智慧素養$599$473 -
7折
Windows APT Warfare:惡意程式前線戰術指南, 3/e$720$504 -
75折
我輩程式人:回顧從 Ada 到 AI 這條程式路,程式人如何改變世界的歷史與未來展望 (We, Programmers: A Chronicle of Coders from Ada to AI)$850$637 -
75折
不用自己寫!用 GitHub Copilot 搞定 LLM 應用開發$600$450 -
79折
Tensorflow 接班王者:Google JAX 深度學習又快又強大 (好評回饋版)$780$616 -
79折
GPT4 會你也會 - 共融機器人的多模態互動式情感分析 (好評回饋版)$700$553 -
79折
技術士技能檢定 電腦軟體應用丙級術科解題教本|Office 2021$460$363 -
75折
Notion 與 Notion AI 全能實戰手冊:生活、學習與職場的智慧策略 (暢銷回饋版)$560$420
相關主題
商品描述
本書由業內專業團隊神策數據的專業人士編寫,結合實戰案例,深入淺出地介紹了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
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


