《Android插件化開發指南》面世

本書在京東購買地址:https://item.jd.com/31178047689.html

本書Q羣:389329264

 

     (一)這是一本什麼書html

       若是隻把本書看成純粹介紹Android插件化技術的書籍,那就大錯特錯了。android

       本書在研究Android插件化之餘,還詳細介紹了Android系統的底層知識,包括Binder和AIDL的原理、四大組件的原理、App的安裝和啓動流程、Context和ClassLoader的家族史。沒有羅列大量的Android系統中的源碼,而是以一張張UML圖,把這些知識串起來。git

       本書詳細介紹了Android中的資源機制,包括aapt命令的原理,resource文件的組成,以及public.xml的使用方式,順帶還說起了如何自定義一個Gradle插件化。github

       此外,本書還介紹了so的加載原理,尤爲是動態加載so的技術,能夠幫助app進行瘦身;探討了H5降級技術,能夠實現任何一個原生頁面和H5頁面的互換,介紹了反射技術,以及jOOR這個有趣的開源框架;介紹了Android中的動態代理技術Proxy.newProxyInstance方法。編程

       若是讀者能堅持把這本書從頭至尾讀完,那麼不光掌握了插件化技術,同時也把上述全部這些知識點全都系統的學習了一遍。也許Android插件化會隨着Google的限制而有所變化甚至消亡,但我在本書中介紹的其餘知識,仍然是大有用武之處的,這也是本書的特點。api

 

  (二)如何面對Android P的限制服務器

      寫做這本書的時候,Google推出了Android P preview的操做系統,會限制對@hide api的反射調用。目前會經過log發出警告,用戶代碼仍然可以獲取到正確的Method或Field,在後續版本中獲取到的Method或Field極有可能爲空。app

       可是道高一尺,魔高一丈。Google對此次限制,很快就被技術geek們繞過去了[1],有兩種解決方法:框架

       1)把經過反射調用的系統內部類,改成直接調用。ide

具體操做辦法是,在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

相關文章
相關標籤/搜索