欢迎光临澳大利亚新华书店网 [登录 | 免费注册]

    • ASM全埋点开发实战
      • 作者:王灼洲//张伟|责编:张天怡
      • 出版社:人民邮电
      • ISBN:9787115612618
      • 出版日期:2023/07/01
      • 页数:388
    • 售价:39.92
  • 内容大纲

        本书由业内专业团队神策数据的专业人士编写,结合实战案例,深入浅出地介绍了ASM技术和Android全埋点技术。
        作者从神策数据服务超过2000家客户的经历中,发现了行业用户对全埋点技术的迫切需求。本书针对这一点,详细、客观地阐述了ASM在Android全埋点中的应用,涵盖各种真实商业场景,并清晰地讲解其技术原理和实现步骤,以帮助用户利用好全埋点技术的特长和优势。
        本书作为一本技术参考书,特别适合非专业开发工程师在日常工作中使用。
  • 作者介绍

  • 目录

    1 Gradle插件介绍
      1.1 什么是Gradle插件
      1.2 Gradle基础知识
        1.2.1 学习前提
        1.2.2 Gradle项目结构
        1.2.3 生命周期
        1.2.4 Project API介绍
        1.2.5 Gradle任务介绍
        1.2.6 生命周期回调
        1.2.7 Gradle执行流程
        1.2.8 获取属性的几种常见方式
        1.2.9 任务执行后的几种状态
        1.2.10 增量构建
      1.3 插件类型
        1.3.1 脚本插件
        1.3.2 buildSrc插件
        1.3.3 单独项目插件
        1.3.4 单独项目插件优化
        1.3.5 插件使用方式
        1.3.6 小结
      1.4 Gradle扩展
        1.4.1 什么是扩展
        1.4.2 ExtensionContainer API介绍
        1.4.3 创建扩展
        1.4.4 添加和查找扩展
        1.4.5 扩展嵌套
        1.4.6 NamedDomainObjectContainer
      1.5 综合示例
        1.5.1 概述
        1.5.2 集成步骤
      1.6 插件发布
        1.6.1 Gradle Plugin Portal
        1.6.2 Maven Central简介
        1.6.3 上传到Maven Central
      1.7 插件调试
        1.7.1 输出日志
        1.7.2 断点调试
      1.8 小结
    2 Transform介绍
      2.1 Android应用的构建
        2.1.1 什么是APK文件
        2.1.2 什么是DEX文件
        2.1.3 Android应用的构建流程
      2.2 Transform简介
      2.3 Transform的简单应用
      2.4 Transform API详细介绍
        2.4.1 getName()
        2.4.2 getInputTypes()
        2.4.3 getScopes()
        2.4.4 transform()

        2.4.5 getReferencedScopes()
        2.4.6 isIncremental()
        2.4.7 isCacheable()
        2.4.8 getSecondaryFiles()
      2.5 Transform模板
      2.6 并发编译
      2.7 Transform原理介绍
      2.8 小结
    3 字节码基础
      3.1 Java虚拟机
      3.2 javap工具介绍
      3.3 特定名称介绍
        3.3.1 字段描述符、方法描述符
        3.3.2 全限定名
        3.3.3
      3.4 .class文件结构
        3.4.1 初识 .class文件
        3.4.2 .class文件的组成
      3.5 小结
    4 字节码指令
      4.1 Java虚拟机栈
      4.2 栈帧
      4.3 局部变量表
      4.4 操作数栈
      4.5 字节码指令介绍
        4.5.1 加载和存储指令
        4.5.2 算术指令
        4.5.3 类型转换指令
        4.5.4 对象的创建和操作指令
        4.5.5 操作数栈管理指令
        4.5.6 控制转移指令
        4.5.7 方法调用和返回指令
        4.5.8 异常抛出指令
        4.5.9 同步指令
      4.6 方法调用
        4.6.1 invokevirtual指令
        4.6.2 invokestatic指令
        4.6.3 invokespecial指令
        4.6.4 invokeinterface指令
        4.6.5 方法调用指令的区别和方法分派
        4.6.6 invokedynamic指令
      4.7 案例分析
        4.7.1 System.out.println
        4.7.2 switch-case与String
        4.7.3 for循环原理
        4.7.4 try-catch-finally原理
      4.8 加载、链接、初始化
        4.8.1 加载时机
        4.8.2 加载过程
        4.8.3 字节码剖析

      4.9 字节码指令偏移
      4.10 Java虚拟机中的数据类型
        4.10.1 基本数据类型
        4.10.2 引用数据类型
      4.11 小结
    5 ASM基础
      5.1 ASM简介
      5.2 ASM组成
      5.3 ClassReader API介绍
        5.3.1 构造方法
        5.3.2 accept()方法
      5.4 ClassVisitor API介绍
        5.4.1 ClassVisitor()构造方法
        5.4.2 visit()
        5.4.3 visitSource()
        5.4.4 visitModule()
        5.4.5 visitNestHost()
        5.4.6 visitNestMember()
        5.4.7 visitInnerClass()
        5.4.8 visitOuterClass()
        5.4.9 visitField()
        5.4.10 visitMethod()
        5.4.11 visitAnnotation()
        5.4.12 visitTypeAnnotation()
        5.4.13 visitPermittedSubclass()
        5.4.14 visitRecordComponent()
        5.4.15 visitEnd()
      5.5 ClassWriter API介绍
        5.5.1 构造方法
        5.5.2 toByteArray()
      5.6 类的转换和修改
        5.6.1 转换类的方式
        5.6.2 删除Class成员
        5.6.3 增加Class成员
        5.6.4 修改Class成员
      5.7 MethodVisitor API介绍
        5.7.1 visitParameter()
        5.7.2 visitAnnotationDefault()
        5.7.3 visitAnnotation()
        5.7.4 visitTypeAnnotation()
        5.7.5 visitAnnotableParameterCount()和visitParameterAnnotation()
        5.7.6 visitAttribute()
        5.7.7 visitCode()
        5.7.8 visitInsn()
        5.7.9 visitIntInsc()
        5.7.10 visitVarInsn()
        5.7.11 visitTypeInsn()
        5.7.12 visitFieldInsn()
        5.7.13 visitMethodInsn()
        5.7.14 visitInvokeDynamicInsn()

        5.7.15 visitLabel()
        5.7.16 visitJumpInsn()
        5.7.17 visitLdcInsn()
        5.7.18 visitIincInsn()
        5.7.19 visitTableSwitchInsn()
        5.7.20 visitLookupSwitchInsn()
        5.7.21 visitTryCatchBlock()
        5.7.22 visitLocalVariable和visitLineNumber()
        5.7.23 visitFrame()
        5.7.24 visitMaxs()
        5.7.25 visitEnd()
      5.8 方法的转换和修改
        5.8.1 方法生成
        5.8.2 删除方法和方法体内容
        5.8.3 优化方法中的指令
      5.9 ASM工具包介绍
        5.9.1 Type
        5.9.2 TraceClassVisitor
        5.9.3 CheckClassAdapter
        5.9.4 ASMifier
        5.9.5 TraceMethodVisitor
        5.9.6 CheckMethodAdapter
        5.9.7 LocalVariableSorter
        5.9.8 GeneratorAdapter
        5.9.9 AdviceAdapter
      5.10 其他实例
        5.10.1 方法替换
        5.10.2 方法参数复用
      5.11 小结
    6 ASM基础之Tree API
      6.1 Tree API简介
      6.2 ClassNode API介绍
        6.2.1 类的生成
        6.2.2 类的转换和修改
      6.3 ClassNode与Core API相互转换
        6.3.1 ClassNode的特性
        6.3.2 与Core API相互转换
      6.4 MethodNode API介绍
        6.4.1 方法的生成
        6.4.2 方法的转换和修改
      6.5 MethodNode与Core API相互转换
        6.5.1 MethodNode的特性
        6.5.2 与Core API相互转换
      6.6 Core API和Tree API如何选择
      6.7 其他
        6.7.1 方法分析
        6.7.2 兼容性探讨
        6.7.3 Attribute
        6.7.4 ASM框架分析
      6.8 小结

    7 ASM实现全埋点——基础部分
      7.1 目标
      7.2 实现步骤
        7.2.1 创建Demo工程和SDK模块
        7.2.2 创建插件框架
        7.2.3 编写插件逻辑
        7.2.4 验证
        7.2.5 发布
      7.3 小结
    8 ASM实现全埋点——进阶部分
      8.1 黑名单
      8.2 防止多次插入
      8.3 方法前插还是后插
      8.4 支持Lambda和方法引用
        8.4.1 原因分析
        8.4.2 Lambda表达式的实现原理
        8.4.3 Lambda设计参考
        8.4.4 Hook Lambda和方法引用
      8.5 小结
    9 ASM实践分享和未来展望
      9.1 是否可以注册多个Transform
      9.2 插入代码是否会改变行号
      9.3 是否支持Kotlin
      9.4 ASM如何处理继承关系
        9.4.1 ClassLoader方式
        9.4.2 类图方式
      9.5 慎用static变量
      9.6 AGP 7的变化
      9.7 小结