Contents?目 錄
序一
序二
序三
前言
第一部分 高效App框架設計與重構
第1章 重構,夜未眠 3
1.1 重新規劃Android項目結構 3
1.2 為Activity定義新的生命周期 5
1.3 統一事件編程模型 7
1.4 實體化編程 9
1.4.1 在網絡請求中使用實體 9
1.4.2 實體生成器 11
1.4.3 在頁麵跳轉中使用實體 12
1.5 Adapter模闆 14
1.6 類型安全轉換函數 16
1.7 本章小結 17
第2章 Android網絡底層框架設計 19
2.1 網絡低層封裝 19
2.1.1 網絡請求的格式 19
2.1.2 AsyncTask的使用和缺點 21
2.1.3 使用原生的ThreadPoolExecutor + Runnable + Handler 24
2.1.4 網絡底層的一些優化工作 28
2.2 App數據緩存設計 32
2.2.1 數據緩存策略 32
2.2.2 強製更新 35
2.3 MockService 36
2.4 用戶登錄 38
2.4.1 登錄成功後的各種場景 39
2.4.2 自動登錄 41
2.4.3 Cookie過期的統一處理 44
2.4.4 防止黑客刷庫 45
2.5 HTTP頭中的奧妙 46
2.5.1 HTTP請求 46
2.5.2 時間校準 48
2.5.3 開啓gzip壓縮 51
2.6 本章小結 52
第3章 Android經典場景設計 53
3.1 App圖片緩存設計 53
3.1.1 ImageLoader設計原理 53
3.1.2 ImageLoader的使用 54
3.1.3 ImageLoader優化 55
3.1.4 圖片加載利器Fresco 56
3.2 對網絡流量進行優化 58
3.2.1 通信層麵的優化 58
3.2.2 圖片策略優化 59
3.3 城市列錶的設計 61
3.3.1 城市列錶數據 61
3.3.2 城市列錶數據的增量更新機製 63
3.4 App與HTML5的交互 64
3.4.1 App操作HTML5頁麵的方法 64
3.4.2 HTML5頁麵操作App頁麵的方法 65
3.4.3 App和HTML5之間定義跳轉協議 66
3.4.4 在App中內置HTML5頁麵 67
3.4.5 靈活切換Native和HTML5頁麵的策略 68
3.4.6 頁麵分發器 68
3.5 消滅全局變量 70
3.5.1 問題的發現 70
3.5.2 把數據作為Intent的參數傳遞 71
3.5.3 把全局變量序列化到本地 71
3.5.4 序列化的缺點 75
3.5.5 如果Activity也被銷毀瞭呢 79
3.5.6 如何看待SharedPreferences 80
3.5.7 User是唯一例外的全局變量 80
3.6 本章小結 81
第4章 Android命名規範和編碼規範 83
4.1 Android命名規範 83
4.2 Android編碼規範 86
4.3 統一代碼格式 89
4.4 本章小結 90
第二部分 App開發中的高級技巧
第5章 Crash異常收集與統計 93
5.1 異常收集 93
5.2 異常收集與統計 96
5.2.1 人工統計綫上Crash數據 96
5.2.2 第一個綫上Crash報錶:Crash分類 97
5.2.3 第二個綫上Crash報錶:Crash去重 99
5.2.4 綫上Crash的其他分析工作 104
5.3 本章小結 105
第6章 Crash異常分析 107
6.1 Java語法相關的異常 108
6.1.1 空指針 108
6.1.2 角標越界 109
6.1.3 試圖調用一個空對象的方法 110
6.1.4 類型轉換異常 110
6.1.5 數字轉換錯誤 111
6.1.6 聲明數組時長度為-1 111
6.1.7 遍曆集閤同時刪除其中元素 112
6.1.8 比較器使用不當 114
6.1.9 當除數為0 115
6.1.10 不能隨便使用的asList 116
6.1.11 又有類找不到瞭(一):ClassNotFoundException 116
6.1.12 又有類找不到瞭(二):NoClassDefFoundError 117
6.2 Activity相關的異常 117
6.2.1 找不到Activity 117
6.2.2 不能實例化Activity 118
6.2.3 找不到Service 118
6.2.4 不能啓動BroadcastReceiver 119
6.2.5 startActivityForResult不能迴傳 119
6.2.6 猴急的Fragment 120
6.3 序列化相關的異常 120
6.3.1 實體對象不支持序列化 121
6.3.2 序列化時未指定ClassLoader 121
6.3.3 反序列化時發現類找不到:被ProGuard混淆導緻的崩潰 122
6.3.4 反序列化時發現類找不到:傳入畸形數據 123
6.3.5 反序列化時齣錯 123
6.4 列錶相關的異常 123
6.4.1 Adapter數據源變化但是沒通知ListView 124
6.4.2 ListView滾動時點擊刷新按鈕後崩潰 125
6.4.3 AbsListView的obtainView返迴空指針 125
6.4.4 Adapter數據源變化但是沒調用notifyDataSetChanged 126
6.5 窗體相關的異常 126
6.5.1 窗口句柄泄露 126
6.5.2 View not attached to window manager 128
6.5.3 窗體在不恰當的時候獲取瞭焦點 129
6.5.4 token null is not for an application 130
6.5.5 permission denied for this window type 131
6.5.6 is your activity running 131
6.5.7 添加窗體失敗 133
6.5.8 AlertDialog.resolveDialogTheme 134
6.5.9 The specif?ied child already has a parent 136
6.5.10 子綫程不能修改UI 137
6.5.11 不能在子綫程操作AlertDialog和Toast 141
6.6 資源相關的異常 143
6.6.1 Resources$NotFoundException 143
6.6.2 StackOverf?iowError 144
6.6.3 Unsatisf?iedLinkError 144
6.6.4 Inf?iateException之FileNotFoundException 145
6.6.5 Inf?iateException之缺少構造器 145
6.6.6 Inf?iateException之style與android:textStyle的區彆 146
6.6.7 TransactionTooLargeException 147
6.7 係統碎片化相關的異常 147
6.7.1 NoSuchMethodError 147
6.7.2 RemoteViews 148
6.7.3 pointerIndex out of range 149
6.7.4 SecurityException之一:Intent中圖片太大 150
6.7.5 SecurityException之二:動態加載其他apk的activity 151
6.7.6 SecurityException之三:No permission to modify thread 151
6.7.7 view的getDrawingCache()返迴null 152
6.7.8 DeadObjectException 153
6.7.9 Android 2.1不支持SSL 153
6.7.10 ViewFlipper引發的血案 153
6.7.11 ActivityNotFoundException 154
6.7.12 Android 2.2不支持xlargeScreens 154
6.7.13 Package manager has died 155
6.7.14 SpannableString與富文本字符串 155
6.7.15 Can not perform this action after onSaveInstanceState 156
6.7.16 Service Intent must be explicit 157
6.8 SQLite相關的異常 157
6.8.1 No transaction is active 158
6.8.2 忘記關閉Cursor 158
6.8.3 數據庫被鎖定 159
6.8.4 試圖再打開已經關閉的對象 159
6.8.5 文件加密瞭或無數據庫 159
6.8.6 WebView中SQLLite緩存導緻的崩潰 160
6.8.7 磁盤讀寫錯誤 161
6.8.8 android_metadata錶不存在 161
6.8.9 android_metadata錶中的locale字段 162
6.8.10 數據庫或磁盤滿瞭 162
6.9 不明覺厲的異常 162
6.9.1 內存溢齣 163
6.9.2 Verify Failed 163
6.10 其他情況的異常 163
6.10.1 TimeoutException 164
6.10.2 JSON解析異常 164
6.10.3 JSONArray在初始化時為空 164
6.10.4 第三方SDK拋齣的Crash 165
6.10.5 兩個不同類型的View有相同的id 165
6.10.6 LayoutInf?iater.from().inf?iate()使用不當導緻的崩潰 166
6.10.7 ViewGroup中的玄機 166
6.10.8 Monkey點擊過快導緻的崩潰 167
6.10.9 圖片縮放很多倍 168
6.10.10 圖片寬高為0 168
6.10.11 不能重復添加組件 168
6.11 本章小結 169
第7章 ProGuard技術詳解 171
7.1 ProGuard簡介 171
7.2 ProGuard工作原理 172
7.3 如何寫一個ProGuard文件 172
7.3.1 基本混淆 172
7.3.2 針對App的量身定製 175
7.3.3 針對第三方jar包的解決方案 177
7.4 其他注意事項 178
7.5 本章小結 179
第8章 持續集成 181
8.1 版本管理策略 181
8.1.1 三種版本管理策略 181
8.1.2 特殊情況的版本管理策略 183
8.2 使用Ant腳本打包 184
8.2.1 Android打包流程 184
8.2.2 打包時的注意事項 189
8.3 Monkey包的生成 190
8.4 自動打包 191
8.4.1 安裝和配置各種軟件 192
8.4.2 準備Ant打包腳本 193
8.4.3 配置CCNET 193
8.4.4 搭建IIS站點下載apk包 193
8.4.5 自動打包流程小結 193
8.5 批量打渠道包 194
8.5.1 基於apk包批量生成渠道包 194
8.5.2 基於代碼批量生成渠道包 195
8.6 Android發版流程 197
8.7 分類打渠道包 198
8.7.1 分門彆類生成渠道包 198
8.7.2 批量上傳apk的兩種方式 199
8.8 靈活切換服務器 199
8.9 單元測試 201
8.10 本章小結 203
第9章 App競品技術分析 205
9.1 競品分析概述 205
9.1.1 App競品定義 205
9.1.2 競品分析要研究的幾個方嚮 206
9.1.3 競品分析與拿來主義 206
9.2 App安裝包的結構 207
9.2.1 Android安裝包的結構 207
9.2.2 iOS安裝包的結構 208
9.3 競品技術一瞥:開機速度 208
9.4 競品技術二瞥:HTML5頁麵的打開速度 209
9.4.1 把HTML5頁麵嵌入到Zip包中 209
9.4.2 Zip包的增量更新機製 209
9.4.3 製作Zip增量包 210
9.4.4 使用WebView預先加載HTML5並緩存到本地 211
9.5 競品技術三瞥:安裝包的大小 211
9.5.1 從幾件小事說起 211
9.5.2 安裝包為什麼那麼大 212
9.5.3 png和jpg的區彆及使用場景 212
9.5.4 Splash、引導圖和背景圖 213
9.5.5 iOS的1倍圖、2倍圖和3倍圖 213
9.5.6 在iOS中進行圖片拉伸和鏇轉 214
9.5.7 使用XML配置動畫 214
9.5.8 iOS使用storyboard還是xib 215
9.5.9 字體文件的學問 215
9.5.10 錶情圖片打包下載 217
9.5.11 清除未使用圖片 218
9.5.12 Proguard不隻是用來混淆的 218
9.5.13 在iOS中使用pdf格式的圖片 218
9.5.14 iOS的包永遠比Android包體積大嗎 219
9.5.15 從代碼層麵減少iOS包的體積 220
9.6 競品技術四瞥:性能優化 220
9.6.1 App自動選取最佳服務器的策略 220
9.6.2 使用TCP+Protobuf 222
9.7 競品技術五瞥:數據采集工具 223
9.7.1 頁麵跳轉器 223
9.7.2 打點統計 226
9.7.3 ABTest 230
9.8 競品技術六瞥:熱修補 232
9.8.1 Native頁麵和HTML5頁麵的相互切換 232
9.8.2 在iOS中使用腳本編程 233
9.9 競品技術七瞥:麯徑通幽 237
9.9.1 一切皆可配置 237
9.9.2 App後門 238
9.9.3 Android包中META-INF目錄的妙用 239
9.9.4 classes.dex的拆與閤 241
9.10 競品技術八瞥:模塊化拆分 242
9.10.1 iOS資源拆分與模塊化 242
9.10.2 Android模塊化拆分 243
9.11 競品技術九瞥:第三方SDK 244
9.11.1 HTML5篇 244
9.11.2 iOS篇 245
9.11.3 Android篇 245
9.11.4 其他 246
9.12 競品技術十瞥:版本策略與App彩蛋 246
9.12.1 版本策略 246
9.12.2 App彩蛋 246
9.13 本章小結 247
第三部分 項目管理和團隊建設
第10章 項目管理決定瞭開發速度 251
10.1 項目管理中的三駕馬車 251
10.1.1 為什麼不能沒有測試團隊 252
10.1.2 産品經理應做的事 253
10.1.3 開發人員的喜怒哀樂 254
10.1.4 項目經理的職責 254
10.2 優化團隊結構,讓敏捷流程跑得更快 255
10.2.1 平行模式還是垂直模式 255
10.2.2 讓HTML5站點和MobileAPI的進度提前一個迭代 256
10.2.3 如何進行模塊化分工 256
10.3 App敏捷開發流程 257
10.3.1 四周時間的開發流程 257
10.3.2 兩周時間的開發流程 261
10.3.3 一周時間的開發流程 262
10.3.4 即時更新策略 263
10.4 項目經理的百寶箱 263
10.4.1 項目經理的任務評估錶 263
10.4.2 貼小紙條的藝術 264
10.4.3 敏捷迭代中的會議紀要 265
10.4.4 開站例會的技巧 266
10.4.5 如何確保項目不延期 268
10.4.6 迭代風險管理 268
10.5 迭代中的測試工作 269
10.5.1 冒煙測試 269
10.5.2 探索性測試 271
10.5.3 Monkey測試 271
10.6 高層對敏捷流程的乾預 272
10.6.1 重構與産品需求的平衡 272
10.6.2 提高效率,拒絕6×12 273
10.6.3 無綫部門的座位安排 274
10.6.4 靜時 276
10.7 本章小結 277
第11章 日常工作中的問題解決 279
11.1 使用二分法排查問題 279
11.2 找到能穩定重現問題的人 281
11.3 小流量包 282
11.4 建立全國範圍的測試群 283
11.5 如何與用戶溝通 284
11.6 日誌與App性能 286
11.7 從新人入職作業入手 286
11.8 本章小結 287
第12章 無綫團隊的組建和管理 289
12.1 從麵試談起 289
12.1.1 如今是賣方市場 289
12.1.2 名校論不適用無綫開發 290
12.1.3 如何搞到更多的簡曆 290
12.1.4 麵試時需要考察的幾個點 291
12.2 無綫團隊必備的10份文檔 292
12.2.1 新員工入職文檔 292
12.2.2 加強版新員工入職文檔 292
12.2.3 測試機清單 293
12.2.4 模塊分工錶 293
12.2.5 頁麵邏輯流程文檔 293
12.2.6 MobileAPI接口分布圖 295
12.2.7 版本管理策略文檔 295
12.2.8 框架設計文檔 295
12.2.9 發版流程文檔 296
12.2.10 App啓動流程圖 296
12.3 一對一溝通 297
12.4 每周技術分享 298
12.5 代碼評審 299
12.6 對Android團隊Leader的定位 300
12.7 Android應用開發所需技能自我評測 301
12.8 App開發人員的學習路綫 302
12.9 本章小結 303
· · · · · · (
收起)