《App研發錄:架構設計、Crash分析和競品技術分析》— Android書籍

^phoenix發表於2020-11-25


出版年: 2015-10-21

簡介:
本書是作者多年App開發的經驗總結,從App架構的角度,重點總結了Android應用開發中常見的實用技巧和疑難問題解決方法,為打造高質量App提供有價值的實踐指導,迅速提升應用開發能力和解決疑難問題的能力。本書涉及的問題有:Android基礎建設、網路底層框架設計、快取、網路流量優化、制定程式設計規範、模組化拆分、Crash異常的捕獲與分析、持續整合、程式碼混淆、App競品技術分析、專案管理和團隊建設等。本書以“問題/解決方案”的形式給出疑難問題的解決方案,同時結合示例程式碼,深入剖析這些實用的程式設計技巧和模式,旨在幫助移動開發人員和管理人員提高程式設計效率,改進程式碼質量,打造高質量的App。

豆瓣

第一部分 高效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

相關文章