资源名称:App研发录:架构设计、Crash分析和竞品技术分析

内容简介:

本书是作者多年App开发的经验总结,从App架构的角度,重点总结了Android应用开发中常见的实用技巧和疑难问题解决方法,为打造高质量App提供有价值的实践指导,迅速提升应用开发能力和解决疑难问题的能力。本书涉及的问题有:Android基础建设、网络底层框架设计、缓存、网络流量优化、制定编程规范、模块化拆分、Crash异常的捕获与分析、持续集成、代码混淆、App竞品技术分析、项目管理和团队建设等。本书以“问题/解决方案”的形式给出疑难问题的解决方案,同时结合示例代码,深入剖析这些实用的编程技巧和模式,旨在帮助移动开发人员和管理人员提高编程效率,改进代码质量,打造高质量的App。

资源目录:

序一

序二

序三

前言

第一部分 高效App框架设计与重构

第1章 重构,夜未眠

1.1 重新规划Android项目结构

1.2 为Activity定义新的生命周期

1.3 统一事件编程模型

1.4 实体化编程

1.4.1 在网络请求中使用实体

1.4.2 实体生成器

1.4.3 在页面跳转中使用实体

1.5 Adapter模板

1.6 类型安全转换函数

1.7 本章小结

第2章 Android网络底层框架设计

2.1 网络低层封装

2.1.1 网络请求的格式

2.1.2 AsyncTask的使用和缺点

2.1.3 使用原生的ThreadPoolExecutor + Runnable + Handler

2.1.4 网络底层的一些优化工作

2.2 App数据缓存设计

2.2.1 数据缓存策略

2.2.2 强制更新

2.3 MockService

2.4 用户登录

2.4.1 登录成功后的各种场景

2.4.2 自动登录

2.4.3 Cookie过期的统一处理

2.4.4 防止黑客刷库

2.5 HTTP头中的奥妙

2.5.1 HTTP请求

2.5.2 时间校准

2.5.3 开启gzip压缩

2.6 本章小结

第3章 Android经典场景设计

3.1 App图片缓存设计

3.1.1 ImageLoader设计原理

3.1.2 ImageLoader的使用

3.1.3 ImageLoader优化

3.1.4 图片加载利器Fresco

3.2 对网络流量进行优化

3.2.1 通信层面的优化

3.2.2 图片策略优化

3.3 城市列表的设计

3.3.1 城市列表数据

3.3.2 城市列表数据的增量更新机制

3.4 App与HTML5的交互

3.4.1 App操作HTML5页面的方法

3.4.2 HTML5页面操作App页面的方法

3.4.3 App和HTML5之间定义跳转协议

3.4.4 在App中内置HTML5页面

3.4.5 灵活切换Native和HTML5页面的策略

3.4.6 页面分发器

3.5 消灭全局变量

3.5.1 问题的发现

3.5.2 把数据作为Intent的参数传递

3.5.3 把全局变量序列化到本地

3.5.4 序列化的缺点

3.5.5 如果Activity也被销毁了呢

3.5.6 如何看待SharedPreferences

3.5.7 User是第一例外的全局变量

3.6 本章小结

第4章 Android命名规范和编码规范

4.1 Android命名规范

4.2 Android编码规范

4.3 统一代码格式

4.4 本章小结

第二部分 App开发中的高级技巧

第5章 Crash异常收集与统计

5.1 异常收集

5.2 异常收集与统计

5.2.1 人工统计线上Crash数据

5.2.2 第一个线上Crash报表:Crash分类

5.2.3 第二个线上Crash报表:Crash去重

5.2.4 线上Crash的其他分析工作

5.3 本章小结

第6章 Crash异常分析

6.1 Java语法相关的异常

6.1.1 空指针

6.1.2 角标越界

6.1.3 试图调用一个空对象的方法

6.1.4 类型转换异常

6.1.5 数字转换错误

6.1.6 声明数组时长度为-1

6.1.7 遍历集合同时删除其中元素

6.1.8 比较器使用不当

6.1.9 当除数为0

6.1.10 不能随便使用的asList

6.1.11 又有类找不到了(一):ClassNotFoundException

6.1.12 又有类找不到了(二):NoClassDefFoundError

6.2 Activity相关的异常

6.2.1 找不到Activity

6.2.2 不能实例化Activity

6.2.3 找不到Service

6.2.4 不能启动BroadcastReceiver

6.2.5 startActivityForResult不能回传

6.2.6 猴急的Fragment

6.3 序列化相关的异常

6.3.1 实体对象不支持序列化

6.3.2 序列化时未指定ClassLoader

6.3.3 反序列化时发现类找不到:被ProGuard混淆导致的崩溃

6.3.4 反序列化时发现类找不到:传入畸形数据

6.3.5 反序列化时出错

6.4 列表相关的异常

6.4.1 Adapter数据源变化但是没通知ListView

6.4.2 ListView滚动时点击刷新按钮后崩溃

6.4.3 AbsListView的obtainView返回空指针

6.4.4 Adapter数据源变化但是没调用notifyDataSetChanged

6.5 窗体相关的异常

6.5.1 窗口句柄泄露

6.5.2 View not attached to window manager

6.5.3 窗体在不恰当的时候获取了焦点

6.5.4 token null is not for an application

6.5.5 permission denied for this window type

6.5.6 is your activity running

6.5.7 添加窗体失败

6.5.8 AlertDialog.resolveDialogTheme

6.5.9 The specif?ied child already has a parent

6.5.10 子线程不能修改UI

6.5.11 不能在子线程操作AlertDialog和Toast

6.6 资源相关的异常

6.6.1 Resources$NotFoundException

6.6.2 StackOverf?iowError

6.6.3 Unsatisf?iedLinkError

6.6.4 Inf?iateException之FileNotFoundException

6.6.5 Inf?iateException之缺少构造器

6.6.6 Inf?iateException之style与android:textStyle的区别

6.6.7 TransactionTooLargeException

6.7 系统碎片化相关的异常

6.7.1 NoSuchMethodError

6.7.2 RemoteViews

6.7.3 pointerIndex out of range

6.7.4 SecurityException之一:Intent中图片太大

6.7.5 SecurityException之二:动态加载其他apk的activity

6.7.6 SecurityException之三:No permission to modify thread

6.7.7 view的getDrawingCache()返回null

6.7.8 DeadObjectException

6.7.9 Android 2.1不支持SSL

6.7.10 ViewFlipper引发的血案

6.7.11 ActivityNotFoundException

6.7.12 Android 2.2不支持xlargeScreens

6.7.13 Package manager has died

6.7.14 SpannableString与富文本字符串

6.7.15 Can not perform this action after onSaveInstanceState

6.7.16 Service Intent must be explicit

6.8 SQLite相关的异常

6.8.1 No transaction is active

6.8.2 忘记关闭Cursor

6.8.3 数据库被锁定

6.8.4 试图再打开已经关闭的对象

6.8.5 文件加密了或无数据库

6.8.6 WebView中SQLLite缓存导致的崩溃

6.8.7 磁盘读写错误

6.8.8 android_metadata表不存在

6.8.9 android_metadata表中的locale字段

6.8.10 数据库或磁盘满了

6.9 不明觉厉的异常

6.9.1 内存溢出

6.9.2 Verify Failed

6.10 其他情况的异常

6.10.1 TimeoutException

6.10.2 JSON解析异常

6.10.3 JSONArray在初始化时为空

6.10.4 第三方SDK抛出的Crash

6.10.5 两个不同类型的View有相同的id

6.10.6 LayoutInf?iater.from().inf?iate()使用不当导致的崩溃

6.10.7 ViewGroup中的玄机

6.10.8 Monkey点击过快导致的崩溃

6.10.9 图片缩放很多倍

6.10.10 图片宽高为0

6.10.11 不能重复添加组件

6.11 本章小结

第7章 ProGuard技术详解

7.1 ProGuard简介

7.2 ProGuard工作原理

7.3 如何写一个ProGuard文件

7.3.1 基本混淆

7.3.2 针对App的量身定制

7.3.3 针对第三方jar包的解决方案

7.4 其他注意事项

7.5 本章小结

第8章 持续集成

8.1 版本管理策略

8.1.1 三种版本管理策略

8.1.2 特殊情况的版本管理策略

8.2 使用Ant脚本打包

8.2.1 Android打包流程

8.2.2 打包时的注意事项

8.3 Monkey包的生成

8.4 自动打包

8.4.1 安装和配置各种软件

8.4.2 准备Ant打包脚本

8.4.3 配置CCNET

8.4.4 搭建IIS站点下载apk包

8.4.5 自动打包流程小结

8.5 批量打渠道包

8.5.1 基于apk包批量生成渠道包

8.5.2 基于代码批量生成渠道包

8.6 Android发版流程

8.7 分类打渠道包

8.7.1 分门别类生成渠道包

8.7.2 批量上传apk的两种方式

8.8 灵活切换服务器

8.9 单元测试

8.10 本章小结

第9章 App竞品技术分析

9.1 竞品分析概述

9.1.1 App竞品定义

9.1.2 竞品分析要研究的几个方向

9.1.3 竞品分析与拿来主义

9.2 App安装包的结构

9.2.1 Android安装包的结构

9.2.2 iOS安装包的结构

9.3 竞品技术一瞥:开机速度

9.4 竞品技术二瞥:HTML5页面的打开速度

9.4.1 把HTML5页面嵌入到Zip包中

9.4.2 Zip包的增量更新机制

9.4.3 制作Zip增量包

9.4.4 使用WebView预先加载HTML5并缓存到本地

9.5 竞品技术三瞥:安装包的大小

9.5.1 从几件小事说起

9.5.2 安装包为什么那么大

9.5.3 png和jpg的区别及使用场景

9.5.4 Splash、引导图和背景图

9.5.5 iOS的1倍图、2倍图和3倍图

9.5.6 在iOS中进行图片拉伸和旋转

9.5.7 使用XML配置动画

9.5.8 iOS使用storyboard还是xib

9.5.9 字体文件的学问

9.5.10 表情图片打包下载

9.5.11 清除未使用图片

9.5.12 Proguard不只是用来混淆的

9.5.13 在iOS中使用pdf格式的图片

9.5.14 iOS的包永远比Android包体积大吗

9.5.15 从代码层面减少iOS包的体积

9.6 竞品技术四瞥:性能优化

9.6.1 App自动选取第一服务器的策略

9.6.2 使用TCP+Protobuf

9.7 竞品技术五瞥:数据采集工具

9.7.1 页面跳转器

9.7.2 打点统计

9.7.3 ABTest

9.8 竞品技术六瞥:热修补

9.8.1 Native页面和HTML5页面的相互切换

9.8.2 在iOS中使用脚本编程

9.9 竞品技术七瞥:曲径通幽

9.9.1 一切皆可配置

9.9.2 App后门

9.9.3 Android包中META-INF目录的妙用

9.9.4 classes.dex的拆与合

9.10 竞品技术八瞥:模块化拆分

9.10.1 iOS资源拆分与模块化

9.10.2 Android模块化拆分

9.11 竞品技术九瞥:第三方SDK

9.11.1 HTML5篇

9.11.2 iOS篇

9.11.3 Android篇

9.11.4 其他

9.12 竞品技术十瞥:版本策略与App彩蛋

9.12.1 版本策略

9.12.2 App彩蛋

9.13 本章小结

第三部分 项目管理和团队建设

第10章 项目管理决定了开发速度

10.1 项目管理中的三驾马车

10.1.1 为什么不能没有测试团队

10.1.2 产品经理应做的事

10.1.3 开发人员的喜怒哀乐

10.1.4 项目经理的职责

10.2 优化团队结构,让敏捷流程跑得更快

10.2.1 平行模式还是垂直模式

10.2.2 让HTML5站点和MobileAPI的进度提前一个迭代

10.2.3 如何进行模块化分工

10.3 App敏捷开发流程

10.3.1 四周时间的开发流程

10.3.2 两周时间的开发流程

10.3.3 一周时间的开发流程

10.3.4 即时更新策略

10.4 项目经理的百宝箱

10.4.1 项目经理的任务评估表

10.4.2 贴小纸条的艺术

10.4.3 敏捷迭代中的会议纪要

10.4.4 开站例会的技巧

10.4.5 如何确保项目不延期

10.4.6 迭代风险管理

10.5 迭代中的测试工作

10.5.1 冒烟测试

10.5.2 探索性测试

10.5.3 Monkey测试

10.6 高层对敏捷流程的干预

10.6.1 重构与产品需求的平衡

10.6.2 提高效率,拒绝6×12

10.6.3 无线部门的座位安排

10.6.4 静时

10.7 本章小结

第11章 日常工作中的问题解决

11.1 使用二分法排查问题

11.2 找到能稳定重现问题的人

11.3 小流量包

11.4 建立全国范围的测试群

11.5 如何与用户沟通

11.6 日志与App性能

11.7 从新人入职作业入手

11.8 本章小结

第12章 无线团队的组建和管理

12.1 从面试谈起

12.1.1 如今是卖方市场

12.1.2 名校论不适用无线开发

12.1.3 如何搞到更多的简历

12.1.4 面试时需要考察的几个点

12.2 无线团队必备的10份文档

12.2.1 新员工入职文档

12.2.2 加强版新员工入职文档

12.2.3 测试机清单

12.2.4 模块分工表

12.2.5 页面逻辑流程文档

12.2.6 MobileAPI接口分布图

12.2.7 版本管理策略文档

12.2.8 框架设计文档

12.2.9 发版流程文档

12.2.10 App启动流程图

12.3 一对一沟通

12.4 每周技术分享

12.5 代码评审

12.6 对Android团队Leader的定位

12.7 Android应用开发所需技能自我评测

12.8 App开发人员的学习路线

12.9 本章小结

资源截图:

App研发录:架构设计、Crash分析和竞品技术分析