Android外掛程式化開發指南Android外掛程式化開發指南

Android外掛程式化開發指南Android外掛程式化開發指南

《Android外掛程式化開發指南》是2018年8月機械工業出版社出版的圖書,作者是包建強。

本書詳細介紹了外掛程式化技術的原理、各種方案,及其在Android App中的使用方法,還詳細介紹了Android 系統的底層知識。

基本介紹

  • 中文名:Android外掛程式化開發指南
  • 作者:包建強
  • 出版社:機械工業出版社 
  • ISBN:9787111603368
內容簡介,圖書目錄,作者簡介,

內容簡介

本書詳細介紹了外掛程式化技術的原理、各種方案,及其在Android App中的使用方法。本書在介紹外掛程式化技術的同時,還詳細介紹了Android 系統的底層知識,有助於App開發人員深入理解Android系統,從而寫出更健壯的代碼。
全書分為三大部分,共22章。第1部分“預備知識”包括第1~5章,是進行Android外掛程式化編程的準備知識,先介紹Android外掛程式化技術的歷史和現狀,系統介紹了Android的底層知識以及反射、代理等技術。第2部分“解決方案”包括第6~16章,詳細介紹並分析了外掛程式化編程的各種解決方案,以及一些外掛程式化框架的實現原理,如that、Zeus等。第3部分“相關技術”包括第17~21章,介紹外掛程式化編程的周邊技術,包括降級、混淆、增量更新等,並對紛繁複雜的外掛程式化技術進行了總結。

圖書目錄

序一
序二
序三
前言
第一部分 預備知識
第1章 外掛程式化技術的昨天、今天與明天2
1.1 外掛程式化技術是什麼2
1.2 為什麼需要外掛程式化3
1.3 外掛程式化技術的歷史3
1.4 外掛程式化技術的用途到底是什麼8
1.5 更好的替代品:React Native8
1.6 只有中國這么玩嗎9
1.7 四大組件都需要外掛程式化技術嗎10
1.8 雙開和虛擬機10
1.9 從原生頁面到HTML 5的過渡11
1.10 本章小結12
第2章 Android底層知識13
2.1 概述13
2.2 Binder原理14
2.3 AIDL原理16
2.4 AMS20
2.5 Activity工作原理21
2.5.1 App是怎么啟動的21
2.5.2 啟動App並非那么簡單21
2.6 App內部的頁面跳轉32
2.7 Context家族史34
2.8 Service工作原理36
2.8.1 在新進程啟動Service36
2.8.2 啟動同一進程的Service39
2.8.3 在同一進程綁定Service39
2.9 BroadcastReceiver工作原理41
2.9.1 註冊過程43
2.9.2 傳送廣播的流程44
2.9.3 廣播的種類45
2.10 ContentProvider工作原理46
2.10.1 ContentProvider的本質49
2.10.2 匿名共享記憶體(ASM)49
2.10.3 ContentProvider與AMS的通信流程50
2.11 PMS及App安裝過程52
2.11.1 PMS簡介52
2.11.2 App的安裝流程52
2.11.3 PackageParser53
2.11.4 ActivityThread與PackageManager54
2.12 ClassLoader家族史55
2.13 雙親委託57
2.14 MultiDex57
2.15 實現一個音樂播放器App59
2.15.1 基於兩個Receiver的音樂播放器59
2.15.2 基於一個Receiver的音樂播放器63
2.16 本章小結68
第3章 反射70
3.1 基本反射技術70
3.1.1 根據一個字元串得到一個類70
3.1.2 獲取類的成員71
3.1.3 對泛型類的反射75
3.2 jOOR77
3.2.1 根據一個字元串得到一個類78
3.2.2 獲取類的成員78
3.2.3 對泛型類的反射79
3.3 對基本反射語法的封裝80
3.3.1 反射出一個構造函式81
3.3.2 調用實例方法81
3.3.3 調用靜態方法82
3.3.4 獲取並設定一個欄位的值82
3.3.5 對泛型類的處理83
3.4 對反射的進一步封裝84
3.5 本章小結88
第4章 代理模式89
4.1 概述89
4.1.1 遠程代理(AIDL)90
4.1.2 保護代理(許可權控制)92
4.1.3 虛代理(圖片占位)92
4.1.4 協作開發(Mock Class)92
4.1.5 給生活加點料(記日誌)93
4.2 靜態代理和動態代理94
4.3 對AMN的Hook95
4.4 對PMS的Hook97
4.5 本章小結98
第5章 對startActivity方法進行Hook99
5.1 startActivity方法的兩種形式99
5.2 對Activity的startActivity方法進行Hook100
5.2.1 方案1:重寫Activity的startActivityForResult方法102
5.2.2 方案2:對Activity的mInstrumentation欄位進行Hook102
5.2.3 方案3:對AMN的getDefault方法進行Hook104
5.2.4 方案4:對H類的mCallback欄位進行Hook107
5.2.5 方案5:再次對Instrumentation欄位進行Hook109
5.3 對Context的startActivity方法進行Hook111
5.3.1 方案6:對ActivityThread的mInstrumentation欄位進行Hook111
5.3.2 對AMN的getDafault方法進行Hook是一勞永逸的113
5.4 啟動沒有在AndroidManifest中聲明的Activity113
5.4.1 “欺騙AMS”的策略分析114
5.4.2 Hook的上半場115
5.4.3 Hook的下半場:對H類的mCallback欄位進行Hook118
5.4.4 Hook的下半場:對ActivityThread的mInstrumentation欄位進行Hook119
5.4.5 “欺騙AMS”的弊端121
5.5 本章小結121
第二部分 解決方案
第6章 外掛程式化技術基礎知識124
6.1 載入外部的dex124
6.2 面向接口編程126
6.3 外掛程式的瘦身129
6.4 對外掛程式進行代碼調試131
6.5 Application的外掛程式化解決方案133
6.6 本章小結134
第7章 資源初探135
7.1 資源載入機制135
7.1.1 資源分類135
7.1.2 剪不斷理還亂:Resources和AssetManager136
7.2 資源的外掛程式化解決方案137
7.3 換膚141
7.4 殊途同歸:另一種換膚方式149
7.5 本章小結149
第8章 最簡單的外掛程式化解決方案150
8.1 在AndroidManifest中聲明外掛程式中的組件150
8.2 宿主App載入外掛程式中的類151
8.3 啟動外掛程式Service152
8.4 載入外掛程式中的資源152
8.5 本章小結154
第9章 Activity的外掛程式化解決方案155
9.1 啟動沒有在AndroidManifest中聲明的外掛程式Activity155
9.2 基於動態替換的Activity外掛程式化解決方案159
9.2.1 Android啟動Activity的原理分析159
9.2.2 故意命中快取160
9.2.3 載入外掛程式中類的方案1:為每個外掛程式創建一個ClassLoader164
9.2.4 為了圓一個謊言而編造更多的謊言164
9.3 載入外掛程式中類的方案2:合併多個dex166
9.4 為Activity解決資源問題169
9.5 對LaunchMode的支持169
9.6 載入外掛程式中類的方案3:修改App原生的ClassLoader172
9.7 本章小結174
第10章 Service的外掛程式化解決方案175
10.1 Android界的荀彧和荀攸:Service和Activity175
10.2 預先占位176
10.3 startService的解決方案178
10.4 bindService的解決方案183
10.5 本章小結185
第11章 BroadcastReceiver的外掛程式化解決方案186
11.1 Receiver概述186
11.2 動態廣播的外掛程式化解決方案187
11.3 靜態廣播的外掛程式化解決方案187
11.4 靜態廣播的外掛程式化終極解決方案189
11.5 本章小結193
第12章 ContentProvider的外掛程式化解決方案194
12.1 ContentProvider基本概念194
12.2 一個簡單的ContentProvider例子195
12.3 ContentProvider外掛程式化197
12.4 執行這段Hook代碼的時機199
12.5 ContentProvider的轉發機制200
12.6 本章小結201
第13章 基於靜態代理的外掛程式化解決方案:that框架202
13.1 靜態代理的思想202
13.2 一個最簡單的靜態代理的例子203
13.2.1 從宿主Activity跳轉到外掛程式Activity203
13.2.2 ProxyActivity與外掛程式Activity的通信204
13.2.3 外掛程式Activity的邏輯206
13.3 外掛程式內部的頁面跳轉206
13.4 從“肉體”上消滅that關鍵字207
13.5 外掛程式向外跳轉209
13.6 面向接口編程在靜態代理中的套用211
13.7 對LaunchMode的支持216
13.8 本章小結221
第14章 that框架對Service和BroadcastReceiver的支持222
14.1 靜態代理的思想在Service的套用222
14.2 對BindService的支持227
14.3 Service的預先占位思想229
14.4 Service外掛程式化的終極解決方案:動靜結合231
14.4.1 解析外掛程式中的Service231
14.4.2 通過反射創建一個Service對象232
14.4.3 ProxyService與ServiceManager234
14.4.4 bindService的外掛程式化解決方案240
14.5 靜態代理的思想在BroadcastReceiver的套用245
14.6 本章小結248
第15章 再談資源249
15.1 Android App的打包流程249
15.2 修改AAPT251
15.2.1 修改並生成新的aapt命令251
15.2.2 在外掛程式化項目中使用新的aapt命令254
15.3 public.xml固定資源id值256
15.4 外掛程式使用宿主的資源258
15.5 本章小結259
第16章 基於Fragment的外掛程式化框架261
16.1 AndroidDynamicLoader概述261
16.2 最簡單的Fragment外掛程式化例子262
16.3 外掛程式內部的Fragment跳轉263
16.4 從外掛程式的Fragment跳轉到外掛程式外部的Fragment264
16.5 本章小結266
第三部分 相關技術
第17章 降級268
17.1 從Activity到HTML 5269
17.2 從HTML 5到Activity273
17.3 對返回鍵的支持278
17.4 本章小結278
第18章 外掛程式的混淆279
18.1 外掛程式的基本混淆279
18.2 方案1:不混淆公共庫MyPluginLibrary280
18.3 方案2:混淆公共庫MyPluginLibrary282
18.3.1 配置multidex283
18.3.2 配置proguard285
18.3.3 移除Plugin1.apk中的冗餘dex286
18.4 本章小結287
第19章 增量更新288
19.1 如何使用增量更新288
19.2 製作外掛程式的增量包289
19.3 App下載增量包並解壓到本地289
19.4 App合併增量包290
19.5 本章小結291
第20章 so的外掛程式化解決方案292
20.1 編寫一個最簡單的so292
20.2 使用so296
20.3 so的載入原理298
20.4 基於System.load的外掛程式化解決方案301
20.5 基於System.loadLibrary的外掛程式化解決方案304
20.6 本章小結305
第21章 對App的打包流程進行Hook306
21.1 自定義Gradle外掛程式306
21.1.1 創建Gradle自定義外掛程式項目306
21.1.2 Extension又是什麼308
21.1.3 修改打包流程309
21.2 修改resources.arsc311
21.2.1 Android是怎么查找資源的311
21.2.2 aapt都幹了什麼312
21.2.3 gradle-small的工作原理313
21.2.4 怎么使用gradle-small313
21.2.5 gradle-small中的Plugin家族313
21.2.6 gradle-small中的Editor家族317
21.3 本章小結318
第22章 外掛程式化技術總結319
22.1 外掛程式的工程化319
22.2 外掛程式中類的載入319
22.3 哪些地方可以Hook320
22.4 Activity外掛程式化的解決方案320
22.5 資源的解決方案321
22.6 Fragment是哪門哪派322
22.7 Service、ContentProvider、BroadcastReceiver外掛程式化的通用解決方案322
22.8 特定於Service的外掛程式化解決方案322
22.9 特定於BroadcastReceiver的外掛程式化解決方案323
22.10 特定於ContentProvider的外掛程式化解決方案323
22.11 本章小結323
附錄
附錄A 常用工具326
附錄B 本書代碼索引328

作者簡介

包建強
畢業於復旦大學數學系。先後在多家網際網路公司擔任無線部門技術總監,現在從事區塊鏈技術領域的研究,在Android、iOS、ReactNative等多門無線技術中跋涉過,在App的項目管理上也有多年的實踐經驗。他曾經出版了《App研發錄》,並有一個堅持寫了10年的技術部落格:http://jax.cnblogs.com/,他的Github地址:https://github.com/BaoBaoJianqiang。

相關詞條

熱門詞條

聯絡我們