Android进阶指北
  • 推荐0
  • 收藏1
  • 浏览78

Android进阶指北

刘望舒 (作者)  付睿 (责任编辑)

  • 书  号:978-7-121-39375-4
  • 出版日期:2019-09-01
  • 页  数:484
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 维护人:付睿
本书是一本Android进阶图书,结合《Android进阶之光》和《Android进阶解密》两本书介绍的知识,一同建立起Android应用开发进阶知识体系。全书共分13章,主要从3个方面来组织内容:(1)Android应用开发所需要掌握的系统源码知识,包括系统源码的下载、编译、调试,包管理机制,输入系统,Native Binder,Java Binder;(2)应用开发必需的知识点,包括Groovy基础、Gradle核心思想、Gradle的Android插件、Android Jetpack架构组件;(3)与跨平台开发相关的知识点,包括跨平台技术演进、Dart基础、Flutter基础。
本书是Android进阶三部曲第三部,畅销书《Android进阶之光》《Android进阶解密》 作者又一力作!Android进阶三部曲是专门为应用开发进阶和面试打造的系列图书,共同构建Android进阶三部曲知识体系。
刘望舒,Android技术专家,Android进阶三部曲《Android进阶之光》 《Android进阶解密》 《Android进阶指北》作者,电子工业出版社博文视点2017、2018、2019年度优秀作者。CSDN知名博主,荣获CSDN 2018年度博客之星称号。GDG Devfest、Droidcon、安卓巴士开发者大会、全球移动开发者大会的特邀演讲嘉宾或出品人。曾在多个知名大厂任职,目前就职于某大型互联网公司,担任技术负责人,负责管理和架构相关工作。
前言


为什么写这本书
Android进阶三部曲包括《Android进阶之光》、《Android进阶解密》和《Android进阶指北》,写这本书的原因和前两本书有些关联,主要有以下几点:
(1)我一直想建立一个知识体系,但是《Android进阶之光》和《Android进阶解密》不能形成具有一定规模的知识体系,而本书的出版将会打破这一点,三本书初步形成了知识体系,即Android进阶三部曲知识体系。
(2)目前市面上的关于Android系统源码分析的书大多不是专门为应用开发编写的,而本书中的系统源码分析是专门为应用开发编写的。
(3)目前市面上的关于Android应用综合类进阶的图书很少,2017年有《Android进阶之光》,2019年有《Android进阶解密》,2020年我仍要贡献出自己的力量。
(4)目前市面上的关于Android源码分析类的图书大多基于Android 6.0之前的版本,需要有一本书来对更新版本的系统源码进行分析。
(5)《Android进阶之光》和《Android进阶解密》覆盖的知识点还远远不够,我希望这本书能覆盖更多的知识点,让更多的人受益。
本书内容
本书共分13章,各章内容简介如下。
第1章介绍系统源码的下载、编译、调试,带领读者走进Android系统源码的世界。
第2章介绍包管理机制和PMS,PMS是Android应用进阶所需要了解的三大MS(Manage Service,管理服务)之一,三大MS分别为AMS、WMS和PMS。
第3章介绍输入系统和IMS,IMS是除三大MS之外,应用开发人员所需要掌握的知识。
第4章介绍IPC机制,为讲解Binder原理进行铺垫。
第5章介绍Native Binder原理,掌握这一章的内容可以深入理解Java Binder原理。
第6章介绍Java Binder原理,包括Binder类的注册、JavaBBinder原理、Java Binder架构。
第7章介绍Groovy基础,为讲解Gradle进行铺垫。
第8章介绍Gradle核心思想,为讲解Gradle的Android插件进行铺垫。
第9章结合第7章和第8章的内容,讲解Gradle的Android插件。
第10章介绍Android Jetpack架构组件,包括Lifecycle、LiveData、ViewModel的使用方法和原理。
第11章介绍跨平台技术演进。
第12章介绍Dart基础,为讲解Flutter基础进行铺垫。
第13章介绍Flutter基础。
本书特色
(1)Android进阶三部曲是目前市面上少有的成知识体系的源码分析类图书。
(2)本书的知识点自成体系并且环环相扣,但每一章节都或多或少与本书或者系列图书的其他章节有所关联。
(3)本书中的Android系统源码分析都是针对应用开发来编写的。
(4)本书是目前市面上少有的介绍Android新技术的图书。
读者对象
作为Android进阶三部曲的第三部,本书的深度要深于《Android进阶之光》,本书适合以下读者阅读。
有一定基础的Android应用开发工程师。
对Android系统源码感兴趣的读者。
致谢
感谢本书的责任编辑付睿,她在CSDN博客上发现了我,并积极推动本书的出版进度,使得本书能够及时出版。感谢所有关注我的朋友们,你们的鼓励和认可为我写书及写博客带来了动力。
勘误与互动
本人虽已竭尽全力,但书中难免存在不足之处,欢迎大家向我反馈,我也会在独立博客和CSDN博客中定期发布本书的勘误信息。

目录

目录


Android进阶三部曲知识体系 1
第1章 系统源码的下载、编译、调试 5
1.1 使用VirtualBox安装Ubuntu 5
1.1.1 安装Ubuntu的步骤 6
1.1.2 安装增强工具 12
1.2 AOSP源码下载 14
1.2.1 AOSP简介 14
1.2.2 下载repo 15
1.2.3 下载源码 15
1.3 内核源码下载 16
1.4 系统源码的整编和单编 18
1.4.1 编译系统概述 18
1.4.2 编译源码的方式 20
1.4.3 准备编译环境 20
1.4.4 源码整编 21
1.4.5 源码单编 24
1.5 Source Insight导入系统源码 25
1.5.1 新建源码项目 25
1.5.2 定位文件 27
1.5.3 全局搜索 28
1.6 Android Studio导入系统源码 29
1.7 Android Studio调试系统源码 33
1.7.1 AOSP源码项目调试 34
1.7.2 导入部分源码调试 38
1.7.3 新建Android项目调试 39
1.8 本章小结 40
第2章 理解包管理机制和PMS 41
2.1 PackageInstaller的初始化 41
2.1.1 PackageManager简介 42
2.1.2 APK的文件结构和安装方式 42
2.1.3 寻找PackageInstaller入口 43
2.1.4 PackageInstallerActivity解析 47
2.1.5 PackageInstaller初始化的过程 51
2.2 PackageInstaller安装APK过程 52
2.2.1 PackageInstaller中的处理 52
2.2.2 Java框架层的处理 57
2.2.3 PackageInstaller安装APK的过程 59
2.3 PMS处理APK的安装过程 59
2.3.1 PackageHandler处理安装消息 60
2.3.2 复制APK的处理 66
2.3.3 PMS处理APK安装 70
2.3.4 PMS处理APK安装的步骤 76
2.4 PMS的创建过程 77
2.4.1 SystemServer处理部分 77
2.4.2 PMS构造方法 80
2.5 APK解析过程 91
2.5.1 引入PackageParser 91
2.5.2 PackageParser解析APK 92
2.5.3 Package的数据结构 99
2.6 本章小结 100
第3章 理解输入系统和IMS 102
3.1 输入事件传递流程的组成部分 103
3.2 IMS的诞生 105
3.2.1 SystemServer处理部分 105
3.2.2 InputManagerService构造方法 107
3.3 IMS的启动过程 110
3.4 InputDispatcher的启动过程 112
3.5 InputReader处理事件的过程 113
3.6 输入事件的处理总结 119
3.7 InputReader的加工类型 120
3.8 InputDispatcher的分发过程 123
3.8.1 唤醒InputDispatcherThread 123
3.8.2 InputDispatcher进行分发 124
3.9 事件分发到目标窗口的过程 128
3.9.1 为事件寻找合适的分发目标 128
3.9.2 处理点击形式的事件 132
3.9.3 向目标窗口发送事件 135
3.9.4 Motion事件分发过程总结 136
3.10 本章小结 138
第4章 IPC机制 139
4.1 Linux和Android的IPC机制 139
4.1.1 Linux中的IPC机制 139
4.1.2 Android中的IPC机制 141
4.2 开启多进程 142
4.2.1 开启多进程举例 142
4.2.2 开启多进程引出的问题 144
4.3 用Messenger进行进程间通信 146
4.4 使用AIDL实现跨进程方法调用 150
4.4.1 创建AIDL文件 150
4.4.2 创建服务端 152
4.4.3 客户端调用 153
4.5 用ContentProvider进行进程间通信 155
4.5.1 建立数据库,方便ContentProvider使用 155
4.5.2 使用ContentProvider对数据库进行操作 156
4.5.3 在Activity中调用另一个进程的GameProvider方法 158
4.6 用Socket实现跨进程聊天程序 160
4.7 本章小结 167
第5章 Native Binder原理 168
5.1 学习Binder的前置知识点 168
5.1.1 Linux和Binder的IPC通信原理 169
5.1.2 使用Binder的原因 173
5.1.3 学习Binder的原因 174
5.2 ServiceManager中的Binder机制 175
5.2.1 基于Binder通信的C/S架构 175
5.2.2 MediaServer的main函数 176
5.2.3 每个进程唯一的ProcessState实例 177
5.2.4 解析ServiceManager中的Binder机制 180
5.2.5 小结 187
5.3 系统服务的注册过程 187
5.3.1 从调用链角度说明MediaPlayerService的注册过程 187
5.3.2 从进程角度说明MediaPlayerService的注册过程 195
5.3.3 小结 196
5.4 ServiceManager的启动过程 196
5.4.1 打开binder设备 198
5.4.2 注册成为Binder机制的上下文管理者 201
5.4.3 循环等待和处理客户端发来的请求 203
5.5 系统服务的获取过程 206
5.5.1 客户端MediaPlayerService请求获取服务 206
5.5.2 服务端ServiceManager处理请求 212
5.6 本章小结 218
第6章 Java Binder原理 219
6.1 Java Binder的JNI注册 219
6.1.1 Binder类的注册 223
6.1.2 BinderInternal类的注册 224
6.2 Java Binder中系统服务的注册过程 225
6.2.1 将AMS注册到ServiceManager 226
6.2.2 引出JavaBBinder 230
6.2.3 解析JavaBBinder 232
6.2.4 Java Binder架构 234
6.3 本章小结 235
第7章 Groovy基础 236
7.1 Groovy概述 236
7.2 Groovy编写和调试 237
7.3 变量 237
7.4 方法 237
7.5 类 238
7.6 语句 239
7.6.1 断言 239
7.6.2 for循环 239
7.6.3 switch语句 240
7.7 数据类型 241
7.7.1 字符串 241
7.7.2 List 242
7.7.3 Map 242
7.7.4 闭包(Closure) 243
7.8 I/O操作 244
7.8.1 文件读取 244
7.8.2 文件写入 244
7.9 其他 245
7.9.1 asType 245
7.9.2 判断是否为真 245
7.9.3 安全取值 245
7.9.4 with操作符 246
7.10 本章小结 246
第8章 Gradle核心思想 247
8.1 Gradle概述 247
8.1.1 项目自动化 248
8.1.2 构建工具 248
8.1.3 Gradle的特性 253
8.2 Gradle基础知识 255
8.2.1 配置Gradle环境 255
8.2.2 实现Hello World 257
8.2.3 Gradle的任务 258
8.2.4 Gradle日志级别 260
8.2.5 Gradle 命令行 261
8.3 被忽视的Gradle Wrapper 263
8.3.1 为什么需要Gradle Wrapper 263
8.3.2 构建Gradle Wrapper 264
8.3.3 配置Gradle Wrapper 265
8.3.4 使用Gradle Wrapper 266
8.3.5 升级Gradle Wrapper 267
8.3.6 自定义Gradle Wrapper 268
8.4 Gradle插件基础 268
8.4.1 Gradle插件概述 268
8.4.2 应用Gradle插件 270
8.4.3 插件DSL 272
8.4.4 自定义对象插件 273
8.4.5 Gradle插件的作用和优点 274
8.5 自定义Gradle插件 274
8.5.1 在build.gradle中编写 275
8.5.2 在buildSrc工程项目中编写 277
8.5.3 在独立项目中编写 278
8.6 本章小结 281
第9章 Gradle的Android插件 282
9.1 什么是Gradle的Android插件 282
9.2 Android Studio的模块类型和项目视图 283
9.3 项目build.gradle 284
9.4 模块build.gradle 285
9.4.1 Gradle的Android插件类型 286
9.4.2 Android块 286
9.4.3 dependencies块 291
9.5 Android签名文件配置 292
9.5.1 自定义签名信息文件 292
9.5.2 本地添加签名信息文件 293
9.6 Gradle的库依赖 294
9.7 Gradle的库依赖管理 295
9.7.1 Gradle的依赖传递 296
9.7.2 Gradle的依赖检查 296
9.7.3 Gradle的依赖冲突 299
9.8 本章小结 301
第10章 Android Jetpack架构组件 302
10.1 Android Jetpack简介 303
10.2 Android Jetpack分类 303
10.2.1 Architecture 304
10.2.2 Foundationy 305
10.2.3 Behavior 306
10.2.4 UI 307
10.3 在应用中引入Jetpack相关组件 307
10.4 使用Lifecycle 307
10.4.1 为什么需要Lifecycle 307
10.4.2 如何使用Lifecycle 309
10.4.3 Lifecycle应用举例 312
10.4.4 自定义LifecycleOwner 315
10.5 Lifecycle的原理 316
10.5.1 Lifecycle的生命周期状态事件和状态 316
10.5.2 Lifecycle如何观察Activity和Fragment的生命周期 317
10.5.3 Lifecycle关联类 327
10.6 使用LiveData 328
10.6.1 什么是LiveData 328
10.6.2 LiveData的基本用法 329
10.6.3 更改LiveData中的数据 330
10.6.4 合并多个LiveData数据源 332
10.6.5 拓展LiveData对象 333
10.7 LiveData的原理 335
10.7.1 LiveData如何观察组件生命周期变化 335
10.7.2 LiveData的observe方法回调 336
10.7.3 postValue/setValue方法分析 339
10.7.4 Transformations.map方法分析 341
10.7.5 LiveData关联类 343
10.8 使用ViewModel 344
10.8.1 什么是ViewModel 345
10.8.2 ViewModel的基本使用方法 345
10.8.3 ViewModel的生命周期 347
10.9 ViewModel的原理 348
10.10 本章小结 351
第11章 跨平台技术演进 352
11.1 Web App 353
11.2 Hybrid App 353
11.2.1 Cordova 354
11.2.2 Ionic 355
11.2.3 VasSonic 355
11.2.4 微信小程序 356
11.3 语言编译转换 357
11.4 原生渲染 358
11.4.1 React Native 358
11.4.2 Weex 358
11.4.3 快应用 359
11.5 自绘UI 360
11.5.1 Qt 360
11.5.2 Flutter 361
11.6 本章小结 362
第12章 Dart基础 363
12.1 Dart开发环境搭建 363
12.2 Dart概述 364
12.3 Dart的特性和重要概念 365
12.4 Dart关键字 366
12.5 变量 367
12.6 基本数据类型 367
12.6.1 Number 367
12.6.2 String 368
12.6.3 Boolean 368
12.6.4 List 368
12.6.5 Set 369
12.6.6 Map 369
12.7 函数 369
12.7.1 可选参数 370
12.7.2 默认参数值 370
12.7.3 main函数 371
12.7.4 匿名函数 371
12.8 流程控制语句 371
12.8.1 for循环 372
12.8.2 switch和case 372
12.9 捕获异常 373
12.10 为类添加新的功能 373
12.11 库的使用方法 374
12.12 异步支持 375
12.13 使类可调用 376
12.14 创建实例 376
12.15 本章小结 376
第13章 Flutter基础 377
13.1 Flutter开发环境搭建和Hello World 377
13.1.1 Flutter概述 378
13.1.2 Flutter开发环境搭建 378
13.1.3 运行一个Flutter Demo 383
13.1.4 Hello World 385
13.2 Widget基础 386
13.2.1 Widget概述 387
13.2.2 Widget的分类 387
13.2.3 Widget的状态分类 388
13.2.4 根Widget的种类 388
13.3 Basic Widget 389
13.3.1 代码模板和主题 389
13.3.2 文本 390
13.3.3 图片 391
13.3.4 凸起按钮 394
13.3.5 其他Widget 395
13.4 Material组件 397
13.4.1 MaterialApp 398
13.4.2 Scaffold 401
13.4.3 AppBar 403
13.4.4 BottomNavigationBar 405
13.4.5 TabBar 407
13.4.6 Drawer 411
13.5 Scrolling Widget 413
13.5.1 ListView 413
13.5.2 GridView 418
13.5.3 PageView 419
13.6 手势相关Widget 421
13.6.1 指针事件 421
13.6.2 手势 422
13.6.3 使用GestureDetector 423
13.6.4 使用Dismissible 424
13.7 资源和图片 426
13.7.1 指定asset 426
13.7.2 加载文本 427
13.7.3 加载图片 430
13.8 布局Widget 433
13.8.1 线性布局Widget 433
13.8.2 流式布局Widget 434
13.8.3 层式布局Widget 436
13.8.4 弹性布局Widget 438
13.9 网络请求库Dio 440
13.9.1 Dio的使用入门 440
13.9.2 Dio访问网络 441
13.10 JSON数据解析 443
13.10.1 使用json.decode方法 443
13.10.2 手动编写实体类 444
13.10.3 自动生成实体类 445
13.11 路由与数据传递 447
13.11.1 新建路由 447
13.11.2 使用注册路由 450
13.11.3 路由间数据传递 451
13.12 Flutter与Android的相互通信 456
13.12.1 PlatformChannel概述 456
13.12.2 Flutter调用Android 458
13.12.3 Android调用Flutter 461
13.13 本章小结 465

读者评论