第1篇 基礎篇
第1章 Android觸摸事件傳遞機製 2
1.1 觸摸事件的類型 2
1.2 事件傳遞的三個階段 3
1.3 View的事件傳遞機製 4
1.4 ViewGroup的事件傳遞機製 10
第2章 Android View的繪製流程 16
2.1 繪製的整體流程 17
2.2 MeasureSpec 17
2.3 Measure 19
2.4 Layout 22
2.5 Draw 22
第3章 Android 動畫機製 25
3.1 逐幀動畫(Frame Animation) 25
3.1.1 XML 資源文件方式 25
3.1.2 代碼方式 26
3.2 補間動畫(Tween Animation) 27
3.2.1 插值器 Interpolator 27
3.2.2 AlphaAnimation 29
3.2.3 ScaleAnimation 30
3.2.4 TranslateAnimation 31
3.2.5 RotateAnimation 32
3.2.6 自定義補間動畫 34
3.3 屬性動畫(Property Animation) 34
3.3.1 Evaluator 35
3.3.2 AnimatorSet 36
3.3.3 ValueAnimator 36
3.3.4 ObjectAnimator 38
3.4 過渡動畫(Transition Animation) 40
第4章 Support Annotation Library 使用詳解 46
4.1 Nullness 注解 47
4.2 資源類型注解 48
4.3 類型定義注解 50
4.4 綫程注解 52
4.5 RGB 顔色值注解 52
4.6 值範圍注解 53
4.7 權限注解 53
4.8 重寫函數注解 54
4.9 返迴值注解 55
4.10 @VisibleForTesting 55
4.11 @Keep 55
第5章 Percent Support Library使用詳解 57
第6章 Design Support Library使用詳解 62
6.1 Snackbar 62
6.2 TextInputLayout 63
6.3 TabLayout 64
6.4 NavigationView 65
6.4.1 導航菜單 66
6.4.2 導航頭部 67
6.5 FloatingActionButton 70
6.5.1 使用浮動操作按鈕 70
6.5.2 其他選項 71
6.5.3 點擊事件 71
6.6 CoordinatorLayout 72
6.7 CollapsingToolbarLayout 73
6.8 BottomSheetBehavior 75
第7章 Android Studio中的NDK開發 77
7.1 ABI的基本概念 77
7.2 引入預編譯的二進製 C/C++ 函數庫 79
7.3 直接從 C/C++ 源碼編譯 79
7.3.1 配置 ndk.dir 變量 79
7.3.2 在 Gradle 中配置 NDK 模塊 79
7.3.3 添加 C/C++ 文件到指定的目錄 81
7.4 使用 .so 文件的注意事項 81
7.4.1 使用高平颱版本編譯的 .so 文件運行在低版本的設備上 81
7.4.2 混閤使用不同的C++ 運行時編譯的 .so 文件 82
7.4.3 沒有為每個支持的 CPU 架構提供對應的 .so 文件 82
7.4.4 將 .so 文件放在錯誤的地方 82
7.4.5 隻提供 armeabi 架構的 .so 文件而忽略其他 ABIs 的 83
第8章 Gradle 必知必會 85
8.1 共享變量的定義 85
8.2 通用配置 87
8.3 aar 函數庫的引用 88
8.4 簽名和混淆的配置 90
第9章 通過Gradle打包發布函數庫到JCenter和Maven Central 92
9.1 Maven Central 和 JCenter 92
9.1.1 Maven Central 93
9.1.2 JCenter 93
9.2 Android Studio 獲取函數庫的原理 94
9.3 上傳函數庫到 JCenter 96
9.3.1 步驟一:在 Bintray 網站上注冊一個賬號 96
9.3.2 步驟二:創建一個 Sonatype 賬號 96
9.3.3 步驟三:在 Bintray 網站使能自動簽名 97
9.3.4 步驟四:生成 POM 相關的信息 100
9.3.5 步驟五:上傳函數庫到 Bintray 104
9.3.6 步驟六:發布 Bintray 用戶倉庫到 JCenter 107
9.3.7 步驟七:同步函數庫到 Maven Central 109
第10章 Builder模式詳解 110
10.1 經典的 Builder 模式 110
10.2 Builder 模式的變種 113
10.3 變種 Builder 模式的自動化生成 119
10.4 開源函數庫的例子 122
第11章 注解在 Android 中的應用 124
11.1 注解的定義 124
11.2 標準注解 125
11.2.1 編譯相關注解 125
11.2.2 資源相關注解 125
11.2.3 元注解 125
11.3 運行時注解 127
11.4 編譯時注解 127
11.4.1 定義注解處理器 127
11.4.2 注冊注解處理器 131
11.4.3 android-apt插件 132
第12章 ANR産生的原因及其定位分析 134
12.1 ANR 産生的原因 135
12.2 典型的 ANR 問題場景 135
12.3 ANR 的定位和分析 136
12.3.1 Logcat 日誌信息 136
12.3.2 traces.txt 日誌信息 138
12.4 ANR的避免和檢測 141
12.4.1 StrictMode 141
12.4.2 BlockCanary 142
第13章 Android異步處理技術 144
13.1 Thread 144
13.2 HandlerThread 146
13.3 AsyncQueryHandler 149
13.4 IntentService 150
13.5 Executor Framework 153
13.6 AsyncTask 155
13.7 Loader 156
13.8 總結 159
第14章 Android數據序列化方案研究 160
14.1 Serializable 160
14.2 Parcelable 166
14.3 SQLiteDatabase 169
14.4 SharedPreferences 170
14.5 JSON 171
14.6 Protocol Buffers及Nano-Proto-Buffers 171
14.7 FlatBuffers 171
第15章 Android WebView Java 和 JavaScript 交互詳解 173
15.1 Java 調用 JavaScript 173
15.2 JavaScript 調用 Java 174
第2篇 係統架構篇
第16章 MVP模式及其在Android中的實踐 180
16.1 MVP 的基本概念 180
16.2 MVP 與 MVC 的區彆 181
16.3 MVP 的開源實現 182
16.3.1 Android-Architecture 182
16.3.2 TODO-MVP 182
16.3.3 TODO-MVP-Loaders 183
16.3.4 TODO-MVP-Clean 183
16.3.5 TODO-Databinding 184
16.3.6 其他開源參考實現 184
16.4 MVP 的好處 185
16.5 MVP 存在的問題 185
第17章 MVVM模式及Android DataBinding實戰 186
17.1 Data Binding 錶達式 187
17.2 數據對象 188
17.3 數據綁定 188
17.4 事件綁定 189
第18章 觀察者模式的拓展:事件總綫 191
18.1 為何要使用 191
18.2 原理 192
18.3 開源實現 193
18.3.1 EventBus 193
18.3.2 otto 194
18.4 與觀察者模式及 Android 廣播的區彆 196
第19章 書寫簡潔規範的代碼 197
19.1 Java 編碼規範 197
19.1.1 源代碼文件的定義 197
19.1.2 源代碼文件的結構 197
19.1.3 遵循的格式 198
19.1.4 命名約定 200
19.1.5 Javadoc 200
19.2 Android 命名規範 200
19.2.1 布局文件的命名 200
19.2.2 資源文件的命名 201
19.2.3 類的命名 201
19.3 CheckStyle 的使用 202
第20章 基於開源項目搭建屬於自己的技術堆棧 203
20.1 APP 的整體架構 203
20.2 技術選型的考量點 205
20.3 日誌記錄能力 205
20.4 JSON 解析能力 207
20.4.1 gson 207
20.4.2 jackson 207
20.4.3 Fastjson 208
20.4.4 LoganSquare 208
20.5 數據庫操作能力 210
20.5.1 ActiveAndroid 210
20.5.2 ormlite 211
20.5.3 greenDAO 211
20.5.4 Realm 212
20.6 網絡通信能力 213
20.6.1 android-async-http 213
20.6.2 OkHttp 215
20.6.3 Volley 216
20.6.4 Retrofit 217
20.7 圖片緩存和顯示能力 217
20.7.1 BitmapFun 218
20.7.2 Picasso 218
20.7.3 Glide 218
20.7.4 Fresco 219
20.7.5 Android-Universal-Image-Loader 219
第3篇 經驗總結篇
第21章 64K方法數限製原理與解決方案 222
21.1 64K 限製的原因 222
21.2 使用 MultiDex 解決 64K 限製的問題 223
21.2.1 Android 5.0 之前的版本 223
21.2.2 Android 5.0 及之後的版本 223
21.3 如何避免齣現 64K 限製 223
21.4 配置 MultiDex 224
21.5 MultiDex Support Library 的局限性 226
21.6 在開發階段優化 MultiDex 的構建 227
第22章 Android 插件框架機製研究與實踐 230
22.1 基本概念 231
22.1.1 宿主和插件 231
22.1.2 ClassLoader 機製 231
22.2 開源框架 231
22.2.1 android-pluginmgr 232
22.2.2 dynamic-load-apk 232
22.2.3 DynamicAPK 232
22.2.4 DroidPlugin 233
22.2.5 Small 234
第23章 推送機製實現原理詳解 235
23.1 推送的開源實現方案 236
23.1.1 基於 XMPP 協議 236
23.1.2 基於 MQTT 協議 236
23.2 推送的第三方平颱 236
23.3 自己實現推送功能 237
23.3.1 長連接的建立(TCPConnectThread) 237
23.3.2 數據的發送(TCPSendThread) 237
23.3.3 數據的接收(TCPReceiveThread) 238
23.3.4 心跳包的實現(TCPHeartBeatThread) 240
第24章 APP 瘦身經驗總結 241
24.1 APP 為什麼變胖瞭 241
24.2 從 APK 文件的結構說起 242
24.3 優化圖片資源占用的空間 245
24.3.1 無損壓縮 [ImageOptim] 246
24.3.2 有損壓縮 [ImageAlpha] 246
24.3.3 有損壓縮 [TinyPNG] 246
24.3.4 PNG/JPEG 轉換為 WebP 246
24.3.5 盡量使用 NinePatch 格式的 PNG 圖 247
24.4 使用 Lint 刪除無用資源 248
24.5 利用 Android Gradle 配置 248
24.5.1 minifyEnable 248
24.5.2 shrinkResources 249
24.5.3 resConfigs 249
24.5.4 ndk.abiFilters 250
24.6 重構和優化代碼 250
24.7 資源混淆 251
24.8 插件化 251
第25章 Android Crash 日誌收集原理與實踐 252
25.1 Java 層 Crash 捕獲機製 253
25.1.1 基本原理 253
25.1.2 綫程信息 254
25.1.3 SharedPreference 信息 255
25.1.4 係統設置 257
21.1.5 Logcat 中的日誌記錄 261
25.1.6 自定義 Log 文件中的內容 264
25.1.7 MemInfo 信息 266
25.2 Native 層 Crash 捕獲機製 267
25.3 Crash 的上報 269
第4篇 新技術篇
第26章 函數式編程思想及其在Android中的應用 272
26.1 代碼的簡化 274
26.2 Operators 簡介 275
第27章 依賴注入及其在Android中的應用 277
27.1 基本概念 277
27.1.1 構造函數注入 278
27.1.2 Setter 函數注入 279
27.1.3 接口注入 279
27.2 為何需要框架 280
27.3 開源框架的選擇 280
27.3.1 ButterKnife 280
27.3.2 RoboGuice 282
27.3.3 Dagger 285
27.3.4 Dagger2 288
27.3.5 框架的對比 289
第28章 Android世界的Swift:Kotlin在Android中的應用 290
28.1 選擇 Kotlin 的原因 290
28.2 Kotlin 的安裝和配置 291
28.3 Kotlin 語言的特性 292
28.3.1 可錶達性 292
28.3.2 空類型安全 294
28.3.3 擴展函數 295
28.4 Kotlin 的 Gradle 配置 296
28.5 將 Java 類轉換成 Kotlin 類 299
28.6 相關資料 302
第29章 React Native For Android入門指南 304
29.1 環境配置 304
29.1.1 Homebrew 304
29.1.2 nvm 305
29.1.3 Node.js 305
29.1.4 watchman 306
29.1.5 flow 306
29.2 Android 開發環境的要求 306
29.3 React Native 工程配置 307
29.3.1 安裝react-native 307
29.3.2 生成工程 307
29.4 Android Studio 工程概覽 308
29.5 React Native 依賴庫修改為本地 314
29.5.1 下載 react-native.aar 314
29.5.2 react-native.aar 的文件內容 315
29.5.3 Gradle 本地依賴 316
29.5.4 將 node_modules 上傳到 svn/git 318
29.6 React Native 學習建議 319
第30章 Android在綫熱修復方案研究 320
30.1 在綫熱修復的基本流程 320
30.2 Dexposed 321
30.2.1 如何集成 322
30.2.2 基本用法 323
30.2.3 在綫熱修復 325
30.2.4 平颱的限製 328
30.3 AndFix 329
30.3.1 如何集成 329
30.3.2 補丁包生成工具 331
30.3.3 平颱的限製 332
30.4 Nuwa 332
30.4.1 基本原理 332
30.4.2 如何集成 333
30.4.3 補丁生成工具 334
30.4.4 平颱的限製 334
30.5 總結 334
第31章 麵嚮切麵編程及其在Android中的應用 335
31.1 AOP 的基本概念 335
31.2 代碼織入的時機 336
31.3 基於 AspectJ 實現 Android 平颱的 AOP 337
31.3.1 Hugo 的用法簡介 337
31.3.2 Hugo 的實現原理 339
31.4 其他 AOP 開源框架 344
第32章 基於Facebook Buck改造Android構建係統 345
32.1 Buck環境配置 346
32.1.1 Homebrew 方式 346
32.1.2 手動構建方式 346
32.1.3 安裝 Watchman 348
32.1.4 安裝 Android SDK 和 Android NDK 348
32.2 快速創建基於 Buck 構建的 Android 工程 349
32.3 Buck 的基本概念 351
32.3.1 構建規則(Build Rule) 352
32.3.2 構建目標(Build Target) 354
32.3.3 構建文件(Build File) 355
32.3.4 構建目標模式(Build Target Pattern) 356
32.4 項目改造實戰 357
32.4.1 步驟一:手動下載工程依賴的第三方 Jar包或者aar包 357
32.4.2 步驟二:將 R.* 常量修改為非 final 的 357
32.4.3 步驟三:創建 BUCK 文件 358
32.4.4 步驟四:編譯 Buck 的 buck-android-support 363
32.4.5 步驟五:Exopackage 的使用 363
32.5 Buck 的自動化改造 366
第5篇 性能優化篇
第33章 代碼優化 368
33.1 數據結構的選擇 368
33.2 Handler 和內部類的正確用法 370
33.3 正確地使用 Context 373
33.3.1 Context 的種類 374
33.3.2 錯誤使用 Context 導緻的內存泄漏 374
33.3.3 不同 Context 的對比 376
33.4 掌握 Java 的四種引用方式 376
33.5 其他代碼微優化 377
33.5.1 避免創建非必要的對象 377
33.5.2 對常量使用 static final 修飾 378
33.5.3 避免內部的 Getters/Setters 378
33.5.4 代碼的重構 378
第34章 圖片優化 379
34.1 圖片的格式 379
34.1.1 JPEG 380
34.1.2 PNG 380
34.1.3 GIF 380
34.1.4 WebP 380
34.2 圖片的壓縮 380
34.2.1 無損壓縮 ImageOptim 381
34.2.2 有損壓縮 ImageAlpha 381
34.2.3 有損壓縮 TinyPNG 381
34.2.4 PNG/JPEG 轉換為 WebP 381
34.2.5 盡量使用 NinePatch 格式的 PNG 圖 382
34.3 圖片的緩存 382
第35章 電量優化 383
35.1 BroadcastReceiver 383
35.2 數據傳輸 384
35.3 位置服務 384
35.4 AlarmManager 386
35.5 WakeLock 386
第36章 布局優化 388
36.1 include 標簽共享布局 388
36.2 ViewStub 標簽實現延遲加載 389
36.3 merge 標簽減少布局層次 391
36.4 盡量使用 CompoundDrawable 392
36.5 使用 Lint 393
第37章 網絡優化 395
37.1 避免 DNS 解析 395
37.2 閤並網絡請求 395
37.3 預先獲取數據 396
37.4 避免輪詢 396
37.5 優化重連機製 396
37.6 離綫緩存 396
37.7 壓縮數據大小 396
37.8 不同的網絡環境使用不同的超時策略 397
37.9 CDN 的使用 397
第6篇 移動安全篇
第38章 Android混淆機製詳解 400
38.1 Java 代碼的混淆 400
38.1.1 Proguard 的特性 401
38.1.2 Proguard 的使能和配置 401
38.1.3 proguard-rules.pro 文件的編寫 404
38.1.4 Proguard 生成的文件 407
38.1.5 Proguard 混淆規則匯總 409
38.2 Native(C/C++) 代碼的混淆 409
38.3 資源文件的混淆 409
第39章 Android 反編譯機製詳解 411
39.1 資源文件的反編譯 411
39.1.1 ApkTool 的安裝 411
39.1.2 ApkTool 的使用 412
39.2 Java 代碼的反編譯 413
第40章 客戶端敏感信息隱藏技術研究 414
40.1 敏感信息嵌套在 strings.xml 中 415
40.2 敏感信息隱藏在 Java 源代碼中 415
40.3 敏感信息隱藏在 BuildConfig 中 417
40.4 使用 DexGuard 418
40.5 對敏感信息進行僞裝或者加密 419
40.6 敏感信息隱藏在原生函數庫中(.so文件) 419
40.7 對APK進行加固處理 419
第41章 Android 加固技術研究 421
41.1 愛加密的主要功能 421
41.1.1 漏洞分析 421
41.1.2 加密服務 422
41.1.3 渠道監測 423
41.2 常見 APP 漏洞及風險 423
41.2.1 靜態破解 423
41.2.2 二次打包 424
41.2.3 本地儲存數據竊取 424
41.2.4 界麵截取 424
41.2.5 輸入法攻擊 424
41.2.6 協議抓取 424
41.3 Android 程序反破解技術 424
41.3.1 對抗反編譯 424
41.3.2 對抗靜態分析 425
41.3.3 對抗動態調試 425
41.3.4 防止重編譯 425
41.4 加固技術研究知識儲備 426
41.4.1 掌握常見的破解分析工具 426
41.4.2 掌握 Dalvik 指令集代碼 428
41.4.3 掌握 Dex 和 Odex 文件格式 428
41.4.4 掌握 Smali 文件格式 428
41.4.5 掌握基於 Android 的 ARM 匯編語言基礎 428
第42章 Android安全編碼 429
42.1 WebView 遠程代碼執行 429
42.2 WebView 密碼明文保存 430
42.3 Android 本地拒絕服務 431
42.3.1 非法序列化對象導緻的 ClassNotFoundException 431
42.3.2 空 Action 導緻的 NullPointerException 432
42.3.3 強製類型轉換導緻的 ClassCastException 433
42.3.4 數組越界導緻的 IndexOutOfBoundsException 433
42.4 SharedPreference 全局任意讀寫 434
42.5 密鑰硬編碼 434
42.6 AES/DES/RSA 弱加密 434
42.7 隨機函數使用錯誤 437
42.8 WebView 忽略 SSL 證書 438
42.9 HTTPS 證書弱校驗 438
42.9.1 自定義 X509TrustManager 未實現安全校驗 438
42.9.2 自定義 HostnameVerifier 默認接受所有域名 441
42.9.3 SSLSocketFactory 信任所有證書 442
42.10 PendingIntent 使用不當 443
第7篇 工具篇
第43章 Android調試工具Facebook Stetho 446
43.1 視圖布局監視 447
43.2 數據庫監視 447
43.3 網絡監視 448
43.3.1 網絡模塊使用的是 HTTPUrlConnection 449
43.3.2 網絡模塊使用的是 OkHttp 452
43.4 dumpapp 454
43.4.1 插件的編寫 454
43.4.2 插件的集成 456
43.4.3 插件的使用 456
43.5 Javascript 控製颱 457
43.6 最佳實踐 457
第44章 內存泄漏檢測函數庫 LeakCanary 460
44.1 基本概念 461
44.2 LeakCanary 的集成 461
44.3 LeakCanary 的原理 465
44.4 LeakCanary 的定製 469
44.4.1 RefWatcher 的自定義 469
44.4.2 通知頁麵樣式的自定義 470
44.4.3 內存泄漏堆棧信息保存個數的自定義 471
44.4.4 Watcher 的延時 471
44.4.5 自定義內存泄漏堆棧信息和 heap dump 的處理方式 471
44.4.6 忽略特定的弱引用 472
44.4.7 不監視特定的 Activity 類 472
第45章 基於Facebook Redex實現Android APK的壓縮和優化 474
45.1 轉換的時機 474
45.2 管道的思想 475
45.3 減少字節碼的意義 475
45.4 混淆和壓縮 475
45.5 使用內聯函數 476
45.6 無用代碼的消除 477
45.7 Redex 的集成和使用 478
45.7.1 依賴的安裝 478
45.7.2 下載,構建和安裝 478
45.7.3 使用 478
第46章 Android Studio你所需要知道的功能 479
46.1 Annotate 479
46.2 .ignore 插件 480
46.3 Live Templates 481
46.4 集成 Bug 管理係統 482
第8篇 測試篇
第47章 Android單元測試框架簡介 486
47.1 Java 單元測試框架 JUnit 486
47.2 Android 單元測試框架 Robolectric 3.0 488
47.3 Java 模擬測試框架 Mockito 490
47.3.1 行為的驗證 490
47.3.2 Stub(樁函數)的使用 491
第48章 Android UI自動化測試框架簡介 492
48.1 Monkey 492
48.2 MonkeyRunner 493
48.3 UIAutomator 493
48.4 Robotium 494
48.5 Espresso 494
48.6 Appium 494
第49章 Android靜態代碼分析實戰 495
49.1 Java代碼規範檢查工具CheckStyle 495
49.1.1 Gradle方式 495
49.1.2 Android Studio插件方式 497
49.2 Java靜態代碼分析工具FindBugs 498
49.2.1 Gradle方式 498
49.2.2 Android Studio插件方式 499
49.3 Java靜態代碼分析工具PMD 500
49.3.1 Gradle方式 500
49.3.2 Android Studio插件方式 501
49.4 Android代碼優化工具Lint 501
49.4.1 Gradle方式 501
49.4.2 Android Studio插件方式 502
第50章 基於Jenkins+Gradle搭建Android持續集成編譯環境 503
50.1 Tomcat的下載和啓動 503
50.2 Jenkins的下載和運行 505
50.3 Jenkins插件的安裝 506
50.4 Jenkins全局配置 507
50.4.1 配置 JDK 環境 507
50.4.2 配置 Android SDK 環境 507
50.4.3 配置 Git 環境 508
50.4.4 配置 SVN 環境 508
50.4.5 配置 Gradle 環境 508
50.5 JOB相關的操作 508
50.5.1 JOB 的創建 508
50.5.2 JOB 的配置 509
50.5.3 Gradle 的配置 510
50.5.4 構建觸發器的配置 511
50.5.5 參數化構建 514
50.6 Jenkins預定義的環境變量 514
· · · · · · (
收起)