产品特色
编辑推荐
本书从基础、架构、安全、性能优化、新技术、测试等角度,通过简单的代码示例详尽地展示了 Android 开发技巧
本书作者技术基础深厚扎实,是新技术的探索和追逐者,他对于技术发自内心地热爱, 是业界非常优秀的 Android 架构师
本书是作者在一线互联网企业工作多年的经验沉淀,从不同角度对 Android 新技术抛砖引玉,由浅入深,将实战中的案例抽象成原型,通俗易懂
本书对于技术的解读朴实风趣,深入浅出,是 Android 工程师的进阶宝典,腾讯、华为、阿里、百度、平安科技等一线移动开发工程师联袂推荐
内容简介
《Android高级进阶》是Android的进阶学习指南,主要为Android初中级开发者进阶所需的知识,高级开发者也可以从本书中发现很多共鸣点。《Android高级进阶》从8个方面对50个知识点进行分类讲解,包括基础篇、系统架构篇、经验总结篇、新技术篇、性能优化篇、移动安全篇、工具篇、测试篇。熟练掌握这些知识点后,应该就能够应付实际项目开发中的绝大部分问题了。
《Android高级进阶》的主要目的在于给读者一个完整的Android中高级开发者知识图谱。笔者希望通过《Android高级进阶》的系统讲解,能够帮助读者在面试和工作中收获自己满意的成绩。
作者简介
顾浩鑫,网络 ID:ASCE1885,平安金融科技移动研发工程师,目前主要从事 Android & React Native 相关研发工作,毕业于华中科技大学图像识别与人工智能研究所,曾先后就职于华为、百度、平安科技。
精彩书评
与本书作者在两家公司都是同事,也有多个Android项目合作的经历,作者基础非常扎实,经常探索并应用Android新技术、新框架,是业界非常优秀的Android架构师。本书是作者在一线互联网企业工作多年的经验沉淀,从不同角度对Android新技术抛砖引玉,将实战中的案例抽象成原型,全书内容通俗易懂,特别推荐给有志在移动端发展的工程师朋友们。
腾讯移动互联网事业部 何朝阳
书中涵盖了Android开发生命周期的各个方面,尤其注重高质量的开发实践。作者从基础、架构、安全、性能优化、新技术、测试等角度,通过简单的代码示例详尽地展示了Android开发技巧。作者对代码的优雅以及对卓越性能的完美追求,足以保证本书成为Android研发工程师不可或缺的参考书。
腾讯移动互联网事业部 揭宗昌
与笔者共事一年多,深刻体会到笔者扎实沉稳的气质,以及探索创新的锐气。长期从事一线软件开发工作使得笔者对“工欲善其事,必先利其器”有着深刻的理解,本书从Android开发涉及的各个方面,各个阶段阐述笔者的经验沉淀,也系统地介绍各类开源工具和开发利器,适合各层次的读者阅读。
华多网络娱乐部 欧阳绍聪
本书作者技术基础深厚、扎实,是新技术的探索和追逐者,与他共事期间,我深刻感受到他对于技术发自内心的热爱,他的Android应用开发技术达到炉火纯青的地步,在APP开发和优化上有丰富的实战经验,同时他还是开源社区的活跃分子和贡献者。作者经历了移动互联网的热潮,见证了 APP应用开发技术的萌芽、发展和成熟。现在移动互联网的开发者也逐步开始关注插件化技术、性能优化、行业新技术,系统架构等进阶技术。本书的上市弥补了Android进阶技术系统化解读的空缺,作者对于技术的解读朴实风趣,深入浅出,内容都是在大型互联网公司工作与探索积累下来的精华,是Android工程师的进阶宝典和面试宝典,推荐给广大从事移动开发的朋友们。
阿里移动事业部 顾大辉
目录
第1篇 基础篇
第1章 Android触摸事件传递机制
1.1 触摸事件的类型
1.2 事件传递的三个阶段
1.3 View的事件传递机制
1.4 ViewGroup的事件传递机制
第2章 Android View的绘制流程
2.1 绘制的整体流程
2.2 MeasureSpec
2.3 Measure
2.4 Layout
2.5 Draw
第3章 Android 动画机制
3.1 逐帧动画(Frame Animation)
3.1.1 XML 资源文件方式
3.1.2 代码方式
3.2 补间动画(Tween Animation)
3.2.1 插值器 Interpolator
3.2.2 AlphaAnimation
3.2.3 ScaleAnimation
3.2.4 TranslateAnimation
3.2.5 RotateAnimation
3.2.6 自定义补间动画
3.3 属性动画(Property Animation)
3.3.1 Evaluator
3.3.2 AnimatorSet
3.3.3 ValueAnimator
3.3.4 ObjectAnimator
3.4 过渡动画(Transition Animation)
第4章 Support Annotation Library 使用详解
4.1 Nullness 注解
4.2 资源类型注解
4.3 类型定义注解
4.4 线程注解
4.5 RGB 颜色值注解
4.6 值范围注解
4.7 权限注解
4.8 重写函数注解
4.9 返回值注解
4.10 @VisibleForTesting
4.11 @Keep
第5章 Percent Support Library使用详解
第6章 Design Support Library使用详解
6.1 Snackbar
6.2 TextInputLayout
6.3 TabLayout
6.4 NavigationView
6.4.1 导航菜单
6.4.2 导航头部
6.5 FloatingActionButton
6.5.1 使用浮动操作按钮
6.5.2 其他选项
6.5.3 点击事件
6.6 CoordinatorLayout
6.7 CollapsingToolbarLayout
6.8 BottomSheetBehavior
第7章 Android Studio中的NDK开发
7.1 ABI的基本概念
7.2 引入预编译的二进制 C/C++ 函数库
7.3 直接从 C/C++ 源码编译
7.3.1 配置 ndk.dir 变量
7.3.2 在 Gradle 中配置 NDK 模块
7.3.3 添加 C/C++ 文件到指定的目录
7.4 使用 .so 文件的注意事项
7.4.1 使用高平台版本编译的 .so 文件运行在低版本的设备上
7.4.2 混合使用不同的C++ 运行时编译的 .so 文件
7.4.3 没有为每个支持的 CPU 架构提供对应的 .so 文件
7.4.4 将 .so 文件放在错误的地方
7.4.5 只提供 armeabi 架构的 .so 文件而忽略其他 ABIs 的
第8章 Gradle 必知必会
8.1 共享变量的定义
8.2 通用配置
8.3 aar 函数库的引用
8.4 签名和混淆的配置
第9章 通过Gradle打包发布函数库到JCenter和Maven Central
9.1 Maven Central 和 JCenter
9.1.1 Maven Central
9.1.2 JCenter
9.2 Android Studio 获取函数库的原理
9.3 上传函数库到 JCenter
9.3.1 步骤一:在 Bintray 网站上注册一个账号
9.3.2 步骤二:创建一个 Sonatype 账号
9.3.3 步骤三:在 Bintray 网站使能自动签名
9.3.4 步骤四:生成 POM 相关的信息
9.3.5 步骤五:上传函数库到 Bintray
9.3.6 步骤六:发布 Bintray 用户仓库到 JCenter
9.3.7 步骤七:同步函数库到 Maven Central
第10章 Builder模式详解
10.1 经典的 Builder 模式
10.2 Builder 模式的变种
10.3 变种 Builder 模式的自动化生成
10.4 开源函数库的例子
第11章 注解在 Android 中的应用
11.1 注解的定义
11.2 标准注解
11.2.1 编译相关注解
11.2.2 资源相关注解
11.2.3 元注解
11.3 运行时注解
11.4 编译时注解
11.4.1 定义注解处理器
11.4.2 注册注解处理器
11.4.3 android-apt插件
第12章 ANR产生的原因及其定位分析
12.1 ANR 产生的原因
12.2 典型的 ANR 问题场景
12.3 ANR 的定位和分析
12.3.1 Logcat 日志信息
12.3.2 traces.txt 日志信息
12.4 ANR的避免和检测
12.4.1 StrictMode
12.4.2 BlockCanary
第13章 Android异步处理技术
13.1 Thread
13.2 HandlerThread
13.3 AsyncQueryHandler
13.4 IntentService
13.5 Executor Framework
13.6 AsyncTask
13.7 Loader
13.8 总结
第14章 Android数据序列化方案研究
14.1 Serializable
14.2 Parcelable
14.3 SQLiteDatabase
14.4 SharedPreferences
14.5 JSON
14.6 Protocol Buffers及Nano-Proto-Buffers
14.7 FlatBuffers
第15章 Android WebView Java 和 JavaScript 交互详解
15.1 Java 调用 JavaScript
15.2 JavaScript 调用 Java
第2篇 系统架构篇
第16章 MVP模式及其在Android中的实践
16.1 MVP 的基本概念
16.2 MVP 与 MVC 的区别
16.3 MVP 的开源实现
16.3.1 Android-Architecture
16.3.2 TODO-MVP
16.3.3 TODO-MVP-Loaders
16.3.4 TODO-MVP-Clean
16.3.5 TODO-Databinding
16.3.6 其他开源参考实现
16.4 MVP 的好处
16.5 MVP 存在的问题
第17章 MVVM模式及Android DataBinding实战
17.1 Data Binding 表达式
17.2 数据对象
17.3 数据绑定
17.4 事件绑定
第18章 观察者模式的拓展:事件总线
18.1 为何要使用
18.2 原理
18.3 开源实现
18.3.1 EventBus
18.3.2 otto
18.4 与观察者模式及 Android 广播的区别
第19章 书写简洁规范的代码
19.1 Java 编码规范
19.1.1 源代码文件的定义
19.1.2 源代码文件的结构
19.1.3 遵循的格式
19.1.4 命名约定
19.1.5 Javadoc
19.2 Android 命名规范
19.2.1 布局文件的命名
19.2.2 资源文件的命名
19.2.3 类的命名
19.3 CheckStyle 的使用
第20章 基于开源项目搭建属于自己的技术堆栈
20.1 APP 的整体架构
20.2 技术选型的考量点
20.3 日志记录能力
20.4 JSON 解析能力
20.4.1 gson
20.4.2 jackson
20.4.3 Fastjson
20.4.4 LoganSquare
20.5 数据库操作能力
20.5.1 ActiveAndroid
20.5.2 ormlite
20.5.3 greenDAO
20.5.4 Realm
20.6 网络通信能力
20.6.1 android-async-http
20.6.2 OkHttp
20.6.3 Volley
20.6.4 Retrofit
20.7 图片缓存和显示能力
20.7.1 BitmapFun
20.7.2 Picasso
20.7.3 Glide
20.7.4 Fresco
20.7.5 Android-Universal-Image-Loader
第3篇 经验总结篇
第21章 64K方法数限制原理与解决方案
21.1 64K 限制的原因
21.2 使用 MultiDex 解决 64K 限制的问题
21.2.1 Android 5.0 之前的版本
21.2.2 Android 5.0 及之后的版本
21.3 如何避免出现 64K 限制
21.4 配置 MultiDex
21.5 MultiDex Support Library 的局限性
21.6 在开发阶段优化 MultiDex 的构建
第22章 Android 插件框架机制研究与实践
22.1 基本概念
22.1.1 宿主和插件
22.1.2 ClassLoader 机制
22.2 开源框架
22.2.1 android-pluginmgr
22.2.2 dynamic-load-apk
22.2.3 DynamicAPK
22.2.4 DroidPlugin
22.2.5 Small
第23章 推送机制实现原理详解
23.1 推送的开源实现方案
23.1.1 基于 XMPP 协议
23.1.2 基于 MQTT 协议
23.2 推送的第三方平台
23.3 自己实现推送功能
23.3.1 长连接的建立(TCPConnectThread)
23.3.2 数据的发送(TCPSendThread)
23.3.3 数据的接收(TCPReceiveThread)
23.3.4 心跳包的实现(TCPHeartBeatThread)
第24章 APP 瘦身经验总结
24.1 APP 为什么变胖了
24.2 从 APK 文件的结构说起
24.3 优化图片资源占用的空间
24.3.1 无损压缩 [ImageOptim]
24.3.2 有损压缩 [ImageAlpha]
24.3.3 有损压缩 [TinyPNG]
24.3.4 PNG/JPEG 转换为 WebP
24.3.5 尽量使用 NinePatch 格式的 PNG 图
24.4 使用 Lint 删除无用资源
24.5 利用 Android Gradle 配置
24.5.1 minifyEnable
24.5.2 shrinkResources
24.5.3 resConfigs
24.5.4 ndk.abiFilters
24.6 重构和优化代码
24.7 资源混淆
24.8 插件化
第25章 Android Crash 日志收集原理与实践
25.1 Java 层 Crash 捕获机制
25.1.1 基本原理
25.1.2 线程信息
25.1.3 SharedPreference 信息
25.1.4 系统设置
21.1.5 Logcat 中的日志记录
25.1.6 自定义 Log 文件中的内容
25.1.7 MemInfo 信息
25.2 Native 层 Crash 捕获机制
25.3 Crash 的上报
第4篇 新技术篇
第26章 函数式编程思想及其在Android中的应用
26.1 代码的简化
26.2 Operators 简介
第27章 依赖注入及其在Android中的应用
27.1 基本概念
27.1.1 构造函数注入
27.1.2 Setter 函数注入
27.1.3 接口注入
27.2 为何需要框架
27.3 开源框架的选择
27.3.1 ButterKnife
27.3.2 RoboGuice
27.3.3 Dagger
27.3.4 Dagger2
27.3.5 框架的对比
第28章 Android世界的Swift:Kotlin在Android中的应用
28.1 选择 Kotlin 的原因
28.2 Kotlin 的安装和配置
28.3 Kotlin 语言的特性
28.3.1 可表达性
28.3.2 空类型安全
28.3.3 扩展函数
28.4 Kotlin 的 Gradle 配置
28.5 将 Java 类转换成 Kotlin 类
28.6 相关资料
第29章 React Native For Android入门指南
29.1 环境配置
29.1.1 Homebrew
29.1.2 nvm
29.1.3 Node.js
29.1.4 watchman
29.1.5 flow
29.2 Android 开发环境的要求
29.3 React Native 工程配置
29.3.1 安装react-native
29.3.2 生成工程
29.4 Android Studio 工程概览
29.5 React Native 依赖库修改为本地
29.5.1 下载 react-native.aar
29.5.2 react-native.aar 的文件内容
29.5.3 Gradle 本地依赖
29.5.4 将 node_modules 上传到 svn/git
29.6 React Native 学习建议
第30章 Android在线热修复方案研究
30.1 在线热修复的基本流程
30.2 Dexposed
30.2.1 如何集成
30.2.2 基本用法
30.2.3 在线热修复
30.2.4 平台的限制
30.3 AndFix
30.3.1 如何集成
30.3.2 补丁包生成工具
30.3.3 平台的限制
30.4 Nuwa
30.4.1 基本原理
30.4.2 如何集成
30.4.3 补丁生成工具
30.4.4 平台的限制
30.5 总结
第31章 面向切面编程及其在Android中的应用
31.1 AOP 的基本概念
31.2 代码织入的时机
31.3 基于 AspectJ 实现 Android 平台的 AOP
31.3.1 Hugo 的用法简介
31.3.2 Hugo 的实现原理
31.4 其他 AOP 开源框架
第32章 基于Facebook Buck改造Android构建系统
32.1 Buck环境配置
32.1.1 Homebrew 方式
32.1.2 手动构建方式
32.1.3 安装 Watchman
32.1.4 安装 Android SDK 和 Android NDK
32.2 快速创建基于 Buck 构建的 Android 工程
32.3 Buck 的基本概念
32.3.1 构建规则(Build Rule)
32.3.2 构建目标(Build Target)
32.3.3 构建文件(Build File)
32.3.4 构建目标模式(Build Target Pattern)
32.4 项目改造实战
32.4.1 步骤一:手动下载工程依赖的第三方 Jar包或者aar包
32.4.2 步骤二:将 R.* 常量修改为非 final 的
32.4.3 步骤三:创建 BUCK 文件
32.4.4 步骤四:编译 Buck 的 buck-android-support
32.4.5 步骤五:Exopackage 的使用
32.5 Buck 的自动化改造
第5篇 性能优化篇
第33章 代码优化
33.1 数据结构的选择
33.2 Handler 和内部类的正确用法
33.3 正确地使用 Context
33.3.1 Context 的种类
33.3.2 错误使用 Context 导致的内存泄漏
33.3.3 不同 Context 的对比
33.4 掌握 Java 的四种引用方式
33.5 其他代码微优化
33.5.1 避免创建非必要的对象
33.5.2 对常量使用 static final 修饰
33.5.3 避免内部的 Getters/Setters
33.5.4 代码的重构
第34章 图片优化
34.1 图片的格式
34.1.1 JPEG
34.1.2 PNG
34.1.3 GIF
34.1.4 WebP
34.2 图片的压缩
34.2.1 无损压缩 ImageOptim
34.2.2 有损压缩 ImageAlpha
34.2.3 有损压缩 TinyPNG
34.2.4 PNG/JPEG 转换为 WebP
34.2.5 尽量使用 NinePatch 格式的 PNG 图
34.3 图片的缓存
第35章 电量优化
35.1 BroadcastReceiver
35.2 数据传输
35.3 位置服务
35.4 AlarmManager
35.5 WakeLock
第36章 布局优化
36.1 include 标签共享布局
36.2 ViewStub 标签实现延迟加载
36.3 merge 标签减少布局层次
36.4 尽量使用 CompoundDrawable
36.5 使用 Lint
第37章 网络优化
37.1 避免 DNS 解析
37.2 合并网络请求
37.3 预先获取数据
37.4 避免轮询
37.5 优化重连机制
37.6 离线缓存
37.7 压缩数据大小
37.8 不同的网络环境使用不同的超时策略
37.9 CDN 的使用
第6篇 移动安全篇
第38章 Android混淆机制详解
38.1 Java 代码的混淆
38.1.1 Proguard 的特性
38.1.2 Proguard 的使能和配置
38.1.3 proguard-rules.pro 文件的编写
38.1.4 Proguard 生成的文件
38.1.5 Proguard 混淆规则汇总
38.2 Native(C/C++) 代码的混淆
38.3 资源文件的混淆
第39章 Android 反编译机制详解
39.1 资源文件的反编译
39.1.1 ApkTool 的安装
39.1.2 ApkTool 的使用
39.2 Java 代码的反编译
第40章 客户端敏感信息隐藏技术研究
40.1 敏感信息嵌套在 strings.xml 中
40.2 敏感信息隐藏在 Java 源代码中
40.3 敏感信息隐藏在 BuildConfig 中
40.4 使用 DexGuard
40.5 对敏感信息进行伪装或者加密
40.6 敏感信息隐藏在原生函数库中(.so文件)
40.7 对APK进行加固处理
第41章 Android 加固技术研究
41.1 爱加密的主要功能
41.1.1 漏洞分析
41.1.2 加密服务
41.1.3 渠道监测
41.2 常见 APP 漏洞及风险
41.2.1 静态破解
41.2.2 二次打包
41.2.3 本地储存数据窃取
41.2.4 界面截取
41.2.5 输入法攻击
41.2.6 协议抓取
41.3 Android 程序反破解技术
41.3.1 对抗反编译
41.3.2 对抗静态分析
41.3.3 对抗动态调试
41.3.4 防止重编译
41.4 加固技术研究知识储备
41.4.1 掌握常见的破解分析工具
41.4.2 掌握 Dalvik 指令集代码
41.4.3 掌握 Dex 和 Odex 文件格式
41.4.4 掌握 Smali 文件格式
41.4.5 掌握基于 Android 的 ARM 汇编语言基础
第42章 Android安全编码
42.1 WebView 远程代码执行
42.2 WebView 密码明文保存
42.3 Android 本地拒绝服务
42.3.1 非法序列化对象导致的 ClassNotFoundException
42.3.2 空 Action 导致的 NullPointerException
42.3.3 强制类型转换导致的 ClassCastException
42.3.4 数组越界导致的 IndexOutOfBoundsException
42.4 SharedPreference 全局任意读写
42.5 密钥硬编码
42.6 AES/DES/RSA 弱加密
42.7 随机函数使用错误
42.8 WebView 忽略 SSL 证书
42.9 HTTPS 证书弱校验
42.9.1 自定义 X509TrustManager 未实现安全校验
42.9.2 自定义 HostnameVerifier 默认接受所有域名
42.9.3 SSLSocketFactory 信任所有证书
42.10 PendingIntent 使用不当
第7篇 工具篇
第43章 Android调试工具Facebook Stetho
43.1 视图布局监视
43.2 数据库监视
43.3 网络监视
43.3.1 网络模块使用的是 HTTPUrlConnection
43.3.2 网络模块使用的是 OkHttp
43.4 dumpapp
43.4.1 插件的编写
43.4.2 插件的集成
43.4.3 插件的使用
43.5 Javascript 控制台
43.6 最佳实践
第44章 内存泄漏检测函数库 LeakCanary
44.1 基本概念
44.2 LeakCanary 的集成
44.3 LeakCanary 的原理
44.4 LeakCanary 的定制
44.4.1 RefWatcher 的自定义
44.4.2 通知页面样式的自定义
44.4.3 内存泄漏堆栈信息保存个数的自定义
44.4.4 Watcher 的延时
44.4.5 自定义内存泄漏堆栈信息和 heap dump 的处理方式
44.4.6 忽略特定的弱引用
44.4.7 不监视特定的 Activity 类
第45章 基于Facebook Redex实现Android APK的压缩和优化
45.1 转换的时机
45.2 管道的思想
45.3 减少字节码的意义
45.4 混淆和压缩
45.5 使用内联函数
45.6 无用代码的消除
45.7 Redex 的集成和使用
45.7.1 依赖的安装
45.7.2 下载,构建和安装
45.7.3 使用
第46章 Android Studio你所需要知道的功能
46.1 Annotate
46.2 .ignore 插件
46.3 Live Templates
46.4 集成 Bug 管理系统
第8篇 测试篇
第47章 Android单元测试框架简介
47.1 Java 单元测试框架 JUnit
47.2 Android 单元测试框架 Robolectric 3.0
47.3 Java 模拟测试框架 Mockito
47.3.1 行为的验证
47.3.2 Stub(桩函数)的使用
第48章 Android UI自动化测试框架简介
48.1 Monkey
48.2 MonkeyRunner
48.3 UIAutomator
48.4 Robotium
48.5 Espresso
48.6 Appium
第49章 Android静态代码分析实战
49.1 Java代码规范检查工具CheckStyle
49.1.1 Gradle方式
49.1.2 Android Studio插件方式
49.2 Java静态代码分析工具FindBugs
49.2.1 Gradle方式
49.2.2 Android Studio插件方式
49.3 Java静态代码分析工具PMD
49.3.1 Gradle方式
49.3.2 Android Studio插件方式
49.4 Android代码优化工具Lint
49.4.1 Gradle方式
49.4.2 Android Studio插件方式
第50章 基于Jenkins+Gradle搭建Android持续集成编译环境
50.1 Tomcat的下载和启动
50.2 Jenkins的下载和运行
50.3 Jenkins插件的安装
50.4 Jenkins全局配置
50.4.1 配置 JDK 环境
50.4.2 配置 Android SDK 环境
50.4.3 配置 Git 环境
50.4.4 配置 SVN 环境
50.4.5 配置 Gradle 环境
50.5 JOB相关的操作
50.5.1 JOB 的创建
50.5.2 JOB 的配置
50.5.3 Gradle 的配置
50.5.4 构建触发器的配置
50.5.5 参数化构建
50.6 Jenkins预定义的环境变量
精彩书摘
1.1触摸事件的类型
触摸事件对应的是MotionEvent类,事件的类型主要有如下三种。yyACTION_DOWN:用户手指的按下操作,一个按下操作标志着一次触摸事件的开始。yyACTION_MOVE:用户手指按压屏幕后,在松开之前,如果移动的距离超过一定的阈值,那么会被判定为ACTION_MOVE操作,一般情况下,手指的轻微移动都会触发一系列的移动事件。
yyACTION_UP:用户手指离开屏幕的操作,一次抬起操作标志着一次触摸事件的结束。在一次屏幕触摸操作中,ACTION_DOWN和ACTION_UP这两个事件是必需的,而ACTION_MOVE视情况而定,如果用户仅仅是点击了一下屏幕,那么可能只会监测到按下和抬起的动作。
1.2事件传递的三个阶段
在了解了触摸事件的三种主要类型之后,在讲解Activity、View、ViewGroup的事件传递的具体实现之前,我们需要来了解本章开头说的事件传递的三个阶段。y分发(Dispatch):事件的分发对应着dispatchTouchEvent方法,在Android系统中,所有的触摸事件都是通过这个方法来分发的,方法原型如下。ublicbooleandispatchTouchEvent(MotionEventev)在这个方法中,根据当前视图的具体实现逻辑,来决定是直接消费这个事件还是将事件继续分发给子视图处理,方法返回值为true表示事件被当前视图消费掉,不再继续分发事件;方法返回值为super.dispatchTouchEvent表示继续分发该事件。如果当前视图是ViewGroup及其子类,则会调用onInterceptTouchEvent方法判定是否拦截该事件。yy拦截(Intercept):事件的拦截对应着onInterceptTouchEvent方法,这个方法只在ViewGroup及其子类中才存在,在View和Activity中是不存在的。方法的原型如下。
publicbooleanonInterceptTouchEvent(MotionEventev)同理,这个方法也是通过返回的布尔值来决定是否拦截对应的事件,根据具体的实现逻辑,返回true表示拦截这个事件,不继续分发给子视图,同时交由自身的onTouchEvent方法进行消费;返回false或者super.onInterceptTouchEvent表示不对事件进行拦截,需要继续传递给子视图。
yy消费(Consume):事件的消费对应着onTouchEvent方法,方法原型如下。publicbooleanonTouchEvent(MotionEventevent)该方法返回值为true表示当前视图可以处理对应的事件,事件将不会向上传递给父视图;返回值为false表示当前视图不处理这个事件,事件会被传递给父视图的onTouchEvent方法进行处理。
在Android系统中,拥有事件传递处理能力的类有以下三种。yyActivity:拥有dispatchTouchEvent和onTouchEvent两个方法。
yyViewGroup:拥有dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三个方法。yyView:拥有dispatchTouchEvent和onTouchEvent两个方法。本章接下来将分别介绍View和ViewGroup的事件传递机制,Activity相关的内容穿插其中,将不再单独介绍。
1.3View的事件传递机制
虽然ViewGroup是View的子类,但是这里所说的View专指除ViewGroup外的View控件,例如TextView、Button、CheckBox等,View控件本身已经是最小的单位,不能再作为其他View的容器。View控件拥有dispatchTouchEvent和onTouchEvent两个方法。为了清楚地演示,我们首先来定义一个继承TextView的类MyTextView,如下所示。我们将每个事件的触发都打印了日志,以方便了解事件传递的流程。
同时定义一个MainActivity用来展示MyTextView,在这个Activity中,我们为MyTextView设置了点击(onClick)和触摸(onTouch)监听,方便跟踪了解事件传递的流程,代码如下。
运行上面的代码,点击MyTextView,在Logcat中将打印出如下日志。
从上面的代码和运行日志可以看出,dispatchTouchEvent、onTouchEvent这两个方法的返回值可能存在以下三种情况。
yy直接返回false。
yy直接返回true。
yy返回父类的同名方法,例如super.dispatchTouchEvent。不同的返回值会导致事件传递流程相差甚远,通过不断修改这些方法的返回值并查看日志记录,我们最终可以得到屏幕按下操作ACTION_DOWN事件的处理流程如图1-1所示,ACTION_UP的流程与图1-1类似,只不过事件类型不同而已,我们将不再一一列举。
从上面的流程图可以得出以下结论。
……
前言/序言
Android 应用开发发展到今天,已经成为一个非常成熟的技术方向,市面上涌现了大量关于Android 开发的图书,总的来说可以分为以下几类。
入门实战类:这类图书是市面上占比最多的,也是初中级开发者比较青睐的一类图书,基本上介绍的都是Android的基础知识,例如界面开发、数据存储、网络通信、数据库操作、传感器使用等,最后附上一两个简单实战项目的介绍。建议读者在入门的时候买一本评价还不错的这类图书学习一遍,然后结合实际项目进行知识巩固即可,之后这类书基本上扮演的是工具书的角色,就是在忘记某个知识点的时候到书中查一查重新温习一遍。
源码分析类:这类图书又可以分为Framework层源码分析类和Native层源码分析类两种,这类图书主要针对从事Android系统开发的读者。当然,从事应用开发的读者如果对Android Framework等底层的实现原理有所了解的话那也是大有裨益的,而且相对而言更有优势。
安全和逆向分析类:这类图书主要介绍的是Android平台的软件安全、逆向分析及加解密技术等,主要涉及Android软件的静态分析、动态调试、破解及反破解等技术。这个方向的知识既有Android应用开发者所需要的,也有Android系统开发者所需要的,市场上也有专门的Android系统安全相关的职位。
系统移植和驱动类:这类图书主要介绍的是Android内核、移植和驱动开发的整个底层嵌入式开发知识,这一类知识点其实并不能算作移动端开发,本质上属于传统的嵌入式开发领域,毕竟Android底层就是一个Linux系统。
以上便是目前笔者所看到的Android 图书市场所覆盖的内容,可以说是大而全。但事实上在笔者看来,还有一类图书是目前没有出现的,那就是体现一线互联网公司工程实践中涉及的重要知识点,笔者将之归类为第5 类:工程实践类。希望本书能够弥补这个空白,并期待能够看到更多此类图书的出现。
本书内容
本书从结构上分为8 篇,共50 个知识点。
基础篇:这是占比最大的一个篇章,虽然名为基础篇,但你应该理解为是高级进阶里面的基础知识,而不是Android开发入门的基础知识。本篇主要包含Android View、动画、Support Library、Gradle、NDK、ANR、异步技术、注解、数据序列化和Hybrid等知识点。
系统架构篇:本篇侧重介绍架构和项目整体的相关知识,主要包括UI架构、事件总线、编码规范和技术堆栈等知识点。
经验总结篇:本篇侧重介绍Android工程实践中得出的经验,主要包括64K方法数限制、插件框架、推送原理、APP瘦身、Crash统计等知识点。
新技术篇:本篇侧重介绍新近出现的技术点,当然可能本书出版时已经没那么新了,但并不妨碍其重要性,主要包括函数式编程思想简介、依赖注入、Kotlin、React Native、在线热修复、AOP和Facebook Buck等知识点。
性能优化篇:本篇侧重介绍目前Android平台常见的性能优化相关知识,主要包括代码优化、图片优化、电量优化、布局优化和网络优化等知识点。
移动安全篇:本篇侧重介绍很多应用中经常会忽略的安全知识,主要包括混淆、反编译、密钥隐藏、加固和如何编写安全的代码等知识点。
工具篇:本篇介绍了Android开发中会用到的几个工具,主要包括Android Studio、Stetho、LeakCanary和Redex等知识点。
测试篇:本篇介绍了测试相关的知识,这部分是很多开发人员经常容易忽略的内容,本质上属于测试领域,但开发人员需要有所了解,主要包括Android单元测试、UI自动化测试、静态代码分析和自动化构建等工具。
读者对象
本书的读者对象如下。
Android应用研发工程师
计算机相关专业的学生
致谢
感谢董英编辑找到我并建议我出一本关于Android 开发相关的图书,不然也不会有这本书的存在;感谢妻子恋恋对我的写作和生活的鼓励和陪伴;感谢父母和老师对我的培养;感谢我曾经就职的公司:华为、百度、平安科技,以及现在所在的平安金融科技;感谢华为PTN、华为推送、百度文库、百度导航、百度打车、Hyperion、任意门、银行一账通等项目的兄弟姐妹们,是过往的这些公司和团队磨砺了我。
勘误与互动
读者如果发现本书文字、代码和图片等信息存在错误或者纰漏,欢迎反馈给我。对书中内容或者Android 应用开发中有什么疑问,也可以与我互动,届时将在微信公众号定期发布本书的勘误信息,并解答大家的疑问。我的相关信息如下。
微信公众号:ASCE1885
微博:http://weibo.com/asce885?is_all=1
GitHub:https://github.com/ASCE1885
《Android性能优化实战指南》 深度剖析,攻坚克难:点燃你的Android应用性能无限潜能 在瞬息万变的移动应用开发领域,性能始终是用户体验的基石。一个卡顿、缓慢的应用,无论功能多么强大,都难以赢得用户的青睐。而对于追求极致的用户体验和行业领先地位的开发者而言,掌握Android性能优化的核心技术,已不再是锦上添花,而是必不可少的硬实力。《Android性能优化实战指南》正是一本为致力于提升Android应用性能、突破技术瓶颈的开发者量身打造的深度技术手册。本书摒弃了市面上泛泛而谈的理论讲解,直击Android性能优化的痛点与难点,以详实的代码示例、精辟的原理剖析,带领读者进行一场全面而深入的性能优化实践之旅。 本书内容涵盖了Android应用性能优化的方方面面,从内存管理、CPU调度,到UI渲染、网络通信,再到后台任务、进程管理,力求为读者提供一个系统、完整的性能优化知识体系。我们深知,真正的性能优化并非一蹴而就,而是需要对Android底层机制有着深刻的理解,并能将理论知识灵活应用于实际开发场景。《Android性能优化实战指南》正是基于这一理念,旨在帮助开发者构建坚实的性能优化思维,掌握一套行之有效的优化方法论,从而自信地应对各种性能挑战。 第一篇:内存优化——释放“洪荒之力”,告别内存告警 内存是移动设备最宝贵的资源之一,而内存泄漏和不合理的内存使用则是导致应用卡顿、ANR(Application Not Responding)甚至崩溃的罪魁祸首。本书将从最根本的内存管理机制入手,深入解析Android内存分配、垃圾回收(GC)的原理,帮助读者理解内存是如何被申请、使用和释放的。 内存泄漏的侦测与根治: 我们将详细介绍如何利用LeakCanary、Android Studio Profiler等强大工具,精准定位内存泄漏的源头,并针对不同类型的内存泄漏(如静态成员引用、非静态内部类、资源未及时释放等)提供切实可行的解决方案。本书将通过大量真实场景下的代码演示,教你如何避免“坑”,以及如何“填坑”。 对象生命周期与GC机制: 深入理解Java/Kotlin的GC算法,特别是Android Dalvik/ART虚拟机下的GC行为。我们将探讨强引用、软引用、弱引用、虚引用的应用场景,以及如何利用它们来优化内存使用,避免不必要的对象驻留。 位图(Bitmap)的优化: Bitmap作为Android开发中最常见的内存“大户”,其优化至关重要。本书将讲解Bitmap的加载、复用、缩放、缓存策略,以及如何通过Argb_8888、Rgb_565等像素格式的选择来节省内存。 内存复用与对象池: 学习如何设计和实现高效的对象池,用于复用View、Bitmap等昂贵对象,显著减少内存分配和GC的压力。 内存Profile工具深度使用: 详细指导如何使用Android Studio的Memory Profiler来分析内存分配、内存泄漏,并根据工具提供的线索进行精准优化。 第二篇:CPU优化——驯服“CPU怪兽”,提升响应速度 CPU的合理利用是保证应用流畅运行的关键。当CPU负载过高时,应用就会出现卡顿、响应迟缓等问题。本书将深入剖析CPU调度机制,帮助开发者理解CPU是如何分配给各个进程和线程的,并提供一系列CPU优化策略。 线程优化与多线程安全: 深入讲解线程池的设计与使用,避免频繁创建和销毁线程带来的开销。重点在于多线程并发场景下的数据访问安全,讲解synchronized、Lock、Atomic系列原子类等并发控制机制,以及如何避免死锁和竞态条件。 UI渲染优化——流畅的视觉体验: UI渲染是CPU消耗的重要环节。本书将从View的绘制(measure, layout, draw)流程入手,深入剖析View的层级结构、过度绘制(Overdraw)的危害,并提供优化方法,如使用ConstraintLayout、减少不必要的层级嵌套、合并视图、使用ViewStub按需加载等。 ANR的成因与解决: 详细分析ANR的典型场景,如主线程耗时操作、UI线程被阻塞等,并提供相应的解决方案,如异步处理、事件分发机制的优化等。 CPU Profiler的实战运用: 学习如何利用Android Studio的CPU Profiler,跟踪CPU使用率,识别耗时方法,找出性能瓶颈,并给出针对性的优化建议。 后台任务的优化: 讲解WorkManager、JobScheduler等后台任务调度机制,以及如何合理地安排后台任务,避免对前台应用造成不必要的CPU资源抢占。 第三篇:UI与渲染优化——告别卡顿,拥抱丝滑 流畅的UI是用户直接感受到的性能体现。本书将系统性地讲解Android UI渲染原理,帮助开发者打造响应迅速、视觉流畅的应用。 View的绘制与布局优化: 深入理解View的measure、layout、draw生命周期,掌握如何优化View的测量和布局过程,减少不必要的计算。 减少过度绘制(Overdraw): 详细讲解如何识别和消除过度绘制,例如使用GPU Overdraw工具,优化布局文件,减少不必要的背景绘制。 View的复用与回收: 在ListView、RecyclerView等列表组件中,View的复用至关重要。本书将深入解析RecyclerView的工作原理,讲解ViewHolder模式,以及如何高效地复用和回收View。 动画性能优化: 讲解属性动画、View动画的原理,以及如何优化动画的实现,避免动画过程中的卡顿和掉帧。 自定义View的性能考量: 针对开发者可能遇到的自定义View场景,提供性能优化方面的指导和注意事项。 第四篇:网络优化——高效通信,节省流量 网络通信是移动应用不可或缺的一部分,而低效的网络请求会严重影响用户体验,并消耗大量数据流量。本书将提供一套完整的网络优化解决方案。 HTTP协议与请求优化: 深入理解HTTP/2、HTTP/3等新协议的优势,掌握HTTP请求的优化技巧,如请求合并、缓存策略、数据压缩等。 网络库的选择与优化: 对比分析OkHttp、Retrofit等主流网络库的优缺点,并讲解如何根据实际需求选择合适的网络库,以及如何对其进行配置和优化。 数据传输格式的优化: 探讨JSON、Protocol Buffers、FlatBuffers等数据格式在网络传输中的性能差异,以及如何选择更高效的数据格式。 网络异常处理与重试机制: 构建健壮的网络请求,包括完善的错误处理、超时设置、断线重连和请求重试机制。 网络流量节省策略: 讲解图片加载的懒加载、缩略图使用、WebP等格式的应用,以及如何根据网络状态智能地调整请求策略。 第五篇:其他关键领域优化——系统性提升,全局掌控 除了上述核心领域,本书还将触及Android性能优化的其他重要方面,帮助读者构建更全面的性能优化思维。 文件I/O优化: 讲解高效的文件读写策略,避免阻塞主线程,并介绍使用NIO等高级API提升文件操作性能。 数据库优化: 深入探讨SQLite数据库的优化技巧,包括索引的使用、SQL语句的优化、事务管理等,以提升数据访问效率。 后台服务与进程管理: 讲解Foreground Service、WorkManager等后台任务的管理,以及如何避免不必要的进程启动和唤醒,节省系统资源。 资源加载与管理: 优化图片的加载、字符串的国际化、布局文件的解析等,减少资源访问的开销。 Android性能监控与分析工具: 整合介绍Android Studio Profiler、Lint、Traceview、Systrace等一系列强大的性能分析工具,并结合实际案例进行演示,帮助开发者熟练运用这些工具进行性能诊断和优化。 架构设计对性能的影响: 探讨MVP、MVVM、MVI等架构模式在性能优化方面的作用,以及如何通过良好的架构设计来避免性能问题。 本书特色: 理论与实践并重: 每一项优化技术都配有详细的原理讲解和可运行的代码示例,让读者学以致用。 实战导向: 聚焦Android开发中最常见、最棘手的性能问题,提供行之有效的解决方案。 工具赋能: 深入讲解各类性能分析工具的使用方法,帮助读者成为性能诊断专家。 深入底层: 刨析Android底层机制,让开发者真正理解性能优化的“为什么”和“怎么做”。 持续更新: 移动开发技术日新月异,本书将紧跟技术发展,持续更新内容,为读者提供最前沿的性能优化知识。 适合读者: 有一定Android开发经验,希望提升应用性能的开发者。 面临应用性能瓶颈,寻求解决方案的技术负责人或架构师。 对Android底层机制和性能优化感兴趣的学习者。 追求极致用户体验,渴望打造高性能应用的每一位Android开发者。 《Android性能优化实战指南》将是你征服Android性能挑战的得力助手,助你打造出流畅、高效、用户口碑爆棚的移动应用。翻开本书,开启你的性能优化进阶之旅,让你的应用在激烈的市场竞争中脱颖而出!