本書在京東購買位址:https://item.jd.com/31178047689.html
本書Q群:389329264
(一)這是一本什麼書
如果隻把本書當作純粹介紹Android插件化技術的書籍,那就大錯特錯了。
本書在研究Android插件化之餘,還詳細介紹了Android系統的底層知識,包括Binder和AIDL的原理、四大元件的原理、App的安裝和啟動流程、Context和ClassLoader的家族史。沒有羅列大量的Android系統中的源碼,而是以一張張UML圖,把這些知識串起來。
本書詳細介紹了Android中的資源機制,包括aapt指令的原理,resource檔案的組成,以及public.xml的使用方式,順帶還提及了如何自定義一個Gradle插件化。
此外,本書還介紹了so的加載原理,尤其是動态加載so的技術,可以幫助app進行瘦身;探讨了H5降級技術,可以實作任何一個原生頁面和H5頁面的互換,介紹了反射技術,以及jOOR這個有趣的開源架構;介紹了Android中的動态代理技術Proxy.newProxyInstance方法。
如果讀者能堅持把這本書從頭到尾讀完,那麼不光掌握了插件化技術,同時也把上述所有這些知識點全都系統的學習了一遍。也許Android插件化會随着Google的限制而有所變化甚至消亡,但我在本書中介紹的其他知識,仍然是大有用武之處的,這也是本書的特色。
(二)如何面對Android P的限制
寫作這本書的時候,Google推出了Android P preview的作業系統,會限制對@hide api的反射調用。目前會通過log發出警告,使用者代碼仍然能夠擷取到正确的Method或Field,在後續版本中擷取到的Method或Field極有可能為空。
但是道高一尺,魔高一丈。Google對這次限制,很快就被技術geek們繞過去了[1],有兩種解決方法:
1)把通過反射調用的系統内部類,改為直接調用。
具體操作辦法是,在Android項目中建立一個庫,把要反射的類的方法和字段,複制一份到這個庫中,App對這個庫的引用關系設定為provided。那麼我們就可以在App中直接調用這個類和方法,同時,在編譯的時候,又不會把這些類包含到Apk中。
其實早在2015年,hoxkx就在他的插件化架構中實作了這種技術[2]。
但是這種解決方案,僅限于Android系統中标記為public的方法和字段,對于protected和private就無能為力了。
2)類的每個方法和字段,都有一個标記,表明它是不是hide類型的。我們隻要在jni層,把這個标記改為不是hide的,就可以繞過檢查了。
然而,魔高一丈,道高一丈二。Google在Android P的正式版中勢必會推出更嚴厲的限制方案,到時候,又會有新的解決方案面世,讓我們拭目以待。
其實,作為開發者而言,是不希望看到開發者們和Google之間的技術對抗的,這是毫無意義的内耗。,泛濫成災的篡改,導緻了App大量的崩潰,Google實在看不下去了,是以才搞出這套限制方案;另一方面,插件化技術是剛需,尤其在中國的網際網路行業,App崩潰了影響生意,會導緻績效獎金都被扣光,是以開發者才會不惜一切代價走插件化這條路。
再回到限制方案來,Google也不是清一色不要開發者使用系統底層的标記為hide的api,而是推出了一組黑灰名單,如下所示:
名單 | 影響 |
light-greylist 淺灰名單 | 僅列印警告日志,Google盡可能在未來版本提供 public API |
dark-greylist 深灰名單 | 第三方App不能通路,開發者可以申請把這份清單中的某些api加入到淺灰名單 |
blacklist 黑名單 | 第三方App不能通路 |
是以,另一種應對政策是,在插件化中使用淺灰名單中的api,比如說ActivityThread的currentActivityThread方法。
Google的這組清單,還在持續調整中,據我所知,給各大手機廠商的清單,就和他在社群中釋出的清單,略有出入。在Android P的正式版本中,這份清單會最終确定下來。是以現在中國的各個插件化架構的開發人員,都在等Android P的正式版本釋出後再指定相應的政策。留給中國隊的時間不多了。
(三)寫這本書的來龍去脈
這是一本醞釀了3年的書。
早在2015年Android插件化技術百家争鳴時,我就籌劃寫這方面的書了。但當時積累的技術不夠,就沒寫出來。我當時在一場技術大會上有個《Android插件化從入門到放棄》的演講,四十五分鐘隻能介紹插件化的皮毛。後來這個演講内容被整理成文章釋出到網上,流傳很廣。
2017年1月,有企業要我去講2天Android插件化的技術。為此,我花了一個月時間,準備了四十多個例子。這是第一次的素材積累。
2017年6月,我在騰訊課堂做線上教育訓練,為了宣傳推廣我的課程,我寫了一套文章《寫給Android App開發人員看的Android底層知識》,共計8篇,沒列太多代碼,完全以UML圖的方式,向讀者普及Binder、AIDL、四大元件、AMS、PMS的知識。本書的第2章,就是在這8篇文章的基礎之上進行擴充的。
2018年1月低,我父親住院一周。我當時在醫院每天晚上值班。老爺子半夜打呼噜,吵的我睡不着,雖然事後我才知道,我睡着了打呼噜聲音比他還大。半夜睡不着,就開始了本書的寫作,每晚堅持寫到淩晨兩三點。直到父親出院,這本書寫了将近五分之一。
碰巧的是,這一年5月底,我結婚。是以我必須在5月初,完成這本書的一稿,為此,我宅在家裡整整寫了3個月,拼了老命,才趕在這個時間點交稿。
僅以此書作為新婚禮物獻給我親愛的老婆,感謝你的了解,這本書才得以面世。
(四)這兩年我在忙些什麼?
寫完《App研發錄》後不久,大約是2016年5月,我就從一線網際網路公司出來,開始了長達兩年的App技術教育訓練工作。
一改之前十幾年在辦公室悶頭研究技術的工作方式,而是在全中國飛來飛去,給各大國企、傳統公司、手機商的Android和iOS團隊進行教育訓練。這兩年去過了近百家公司,談一談我的切身感受。
App技術人員以一種金字塔型的方式存在,在金子塔尖的,自然是那些一線網際網路的開發人員,他們掌握Android和iOS最先進的技術,比如說元件化、插件化等等這些技術,但這些人畢竟是少數,一線網際網路也就是那十幾家,他們的技術人員加在一起,也就是三兩千人;而位于金字塔底端的開發人員則是大多數,他們大都位于創業公司或者傳統行業,相應的App側重于業務的實作,對App的高尖端技術,用的不多,自然也談不上掌握。
另一方面,我還在騰訊課堂講了幾個月App開發課程,認識了很多學員,有幾千粉絲。他們也有類似的苦惱。
寫作這本書,則是向廣大Android開發人員普及插件化技術。
(五)這本書講些什麼
戰戰兢兢寫下這本書,十幾萬言。
插件化千頭萬緒,流派衆多。憑借一己之力,并不能覆寫其所有。我這本書從最基本的原理講起,配合以大量的例子,能幫助一個完全不懂Android插件化的技術小白,更新為一個精通這本技術的高手。
面對業内各種成熟的插件化架構,我隻選取了具有代表意義的DroidPlugin、DL、Small和Zeus進行介紹。這幾個架構基本覆寫了插件化程式設計的所有思想,而且非常簡單,像Zeus就隻有11個類,就支撐起掌閱App的插件化。
而對于後期推出的VirtualApk、Atlas、Replugin,我在本書中并沒有章節去介紹,主要是因為這些架構都是大塊頭,代碼量很多,我沒有精力再去研究和學習了。但這些企業級插件化架構,所用的技術,本書都有涉及。
(六)本書的結構。
全書分為三大部分。
第1部分包括第1章到第5章,是Android插件化程式設計的準備知識。
第2部分包括第6章到第16章,介紹了插件化程式設計的各種解決方案。
第3部分包括第17章到第21章,介紹插件化程式設計的周邊技術。
接下來簡要介紹一下本書各章的内容。
第1章介紹的是Android插件化的曆史,當作小說來讀,茶餘飯後,地鐵站中,這一章是最容易看懂的。
第2章介紹Android底層知識,涉及到那些與Android插件化相關的知識,比如說Binder和AIDL,比如說Android App的安裝流程和啟動流程,比如說ActivityThread,比如說LoadedApk,比如說Android四大元件的運作原理。這一章篇幅較多,需要仔細研讀。其中,講到一個音樂播放器的例子,幫助大家更加深刻的認識Android的四大元件。
第3章講反射,詳細介紹了構造函數、方法、字段、泛型的反射文法。本章介紹了Java領域很火的一個開源庫jOOR,可惜,它對Android的支援并不是很好,是以本章還介紹了我們自己封裝的RefInvoke類,這個類将貫穿本書,基本上所有源碼例子都會使用到它。
第4章講代理模式。這個模式在Android中最著名的實作就是Proxy.newProxyInstance方法。基于此,我們Hook了AMS和PMS中的一些方法。
第5章是第4章的延續,仍然是基于Proxy.newProxyInstance方法,Hook了Activity的啟動流程,進而可以啟動一個沒有在AndroidManifest中聲明的Activity,這是插件化的核心技術之一。
第6章介紹了如何加載插件App,以及如何對插件化項目的宿主App和插件App同時進行調試。說到插件化程式設計,就離不開面向接口程式設計的思想,本章也花了很多筆墨介紹這個思想,以及具體的代碼實作。
第7章介紹了資源的加載機制,包括AssetManager和Resources。本章給出了資源的插件化解決方案,進而為Activity的插件化鋪平了道路。。本章還介紹了換膚技術的插件化實作。
第8章介紹了最簡單的插件化解決方案,通過在宿主App的AndroidManifest中事先聲明插件中的四大元件。為了能讓宿主App随意加載插件的類,本章介紹了合并dex的技術方案。
第9章到第12章介紹了Android四大元件的插件化解決方案。四大元件的生命周期各不相同,是以它們各自的插件化解決方案也都不同。
第13章、第14章介紹了Android插件化的靜态代理的解決方案。這是一種“牽線木偶”的思想,我們不用Hook太多Android系統底層的代碼。
第15章再次講到資源,這次要解決的是宿主和多個插件的資源id值沖突的問題。有多種解決方案,本章都會有介紹,有思想的分析,有具體的代碼示例。
第16章介紹一種古老的插件化解決方案,通過動态替換Fragment的方式。
第17章介紹了介紹了App的降級解決方案。一旦插件化方案不可用,那麼我們仍然可以使用H5,來替換任何一個App原生頁面。
第18章介紹了插件的混淆技術。有時候宿主App和插件App都會引用MyPluginLibrary這個類庫,這個公用類庫是否要混淆,相應的有兩種不同的混淆方案。
第19章介紹了增量更新技術。這是插件化必備的技術,進而保證插件的更新,不需要從伺服器下載下傳太大的包。
第20章介紹了so的插件化解決方案。本章詳細介紹了so的加載原理,以及從伺服器動态加載so的方案,基于此,有兩種so的插件化解決方案。
第21章作為整本書的結尾,系統總結了Android插件化的各種解決方案。Android插件化技術千頭萬緒,本書花了将近二十章的篇幅,系統介紹這些技術的思想和實作,如果讀者能堅持讀到這最後一章,本章可以幫助讀者鞏固這些知識。
(七)名詞解釋
本書中有很多專業術語,對于剛接觸Android插件化的讀者,可以不容易了解。有一些專業術語,還有别稱或者簡稱,我在這裡羅列出最常見的一些術語:
HostApp,本書中有時也寫作“宿主App”。用于承載各種插件App,是最終發版的App。我們從Android市場上下載下傳的,都是HostApp。
Plugin,本書中有時也寫作“插件”、“插件App”。
Receiver,是BroadcastReceiver的簡稱,Android四大元件之一。
AndroidManifest,也就是AndroidManifest.xml。
Hook,在本書中有時也寫作“篡改”,就是使用反射修改Android系統底層的方法和字段。
AMS,是ActivityManagerService的簡稱,在App運作時和四大元件進行通信。
PMS,是PackageManagerService的簡稱,用于App的安裝和解析。
(八)關于本書的源碼
本書有70多個源碼例子,請參見附錄2,列出了所有的源碼的位址和對應的章節。此外,在本書的正文中,在用到了源碼的章節處,我也标注出相應的代碼例子的位址。
(九)感謝
幾乎所有的書都千篇一律的感謝父母妻子、同僚上司、圖書編輯,卻不寫為什麼要感謝他們。
我這裡一定要把感謝的理由說清楚。
首先,感謝我那古靈精怪的老婆郭曼雲。謝謝她在我人生迷惘的時候及時出現,陪我玩王者榮耀,帶我騎小黃車去散心,看電影時一起八卦劇情然後被坐在旁邊的觀衆出聲制止,頭疼去醫院看神經内科後從此她在我眼中便成為了深井冰。又比如說,每天要我做不一樣的飯菜給她吃,把我鍛煉成廚房小能手,我現在已經習慣于每天傍晚五點半就放下手中所有的活兒,愉快的投入買菜做飯的工作。我時常自诩為還沒遇到劉備的諸葛亮,如果真是那樣,那麼她命中注定就是那個醜醜的黃月英。
其次,感謝張勇、任玉剛、羅迪、黃劍、林光亮、鄧凡平、王堯波、田維術這些Android領域的朋友,我在寫作這本書的時候,經常會遇到各種疑惑,每次問到他們,都會不厭其煩的給我詳細的解答。
在這裡,尤其感謝田維術,他的技術部落格(weishu.me)對我的影響很大,可惜沒寫完,隻講了Binder原理和四大元件的插件化方案。本書的部分章節,參考了他的部落格文章,對他提供的一些代碼例子,進行了二次加工。經過他本人同意後,收入我這本書中。代碼中的很多類上,都标注了作者是weishu,以表達對他的感謝。
第三,感謝任正浩、霹靂嬌娃、何以笙、韋辰這群狐朋狗友的陪伴,在我從網際網路出來轉型做App技術教育訓練的過程中,初期沒啥生意,整理了半年ppt教程後才開始陸陸續續的接單子,在這半年時間裡,我就跟這幫學弟學妹厮混在一起,爬山、撕名牌、唱K、密室逃脫、狼人殺,還有一陣時間沉迷于你畫我猜,四個人玩到淩晨五點。那是我最惬意的一段時光。
最後,感謝我爸我媽以及咱爸咱媽。你們的女兒我一定照顧好。雖然北京天津那麼近,很抱歉還是不能常回家看看,我永遠是那麼忙,忙着去追求事業的成功,距離财務自由還很遠,但是我一直在努力。
第三,感謝曹洪偉等21位社群朋友的辛勤勞動,把這本書翻譯為英文,限于篇幅,這裡就不一一列舉了。接下來這本書的英文版本會在國外網站社群逐篇釋出以及出版成書,讓全世界的Android開發人員看到中國工程師們的智慧結晶。
[1] 詳細内容,請參見田維術的文章:http://weishu.me/2018/06/07/free-reflection-above-android-p/
[2] 項目位址參見:https://github.com/houkx/android-pluginmgr