1. 程式人生 > >《Android外掛化開發指南》面世

《Android外掛化開發指南》面世

本書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

相關推薦

Android外掛開發指南面世

本書Q群:389329264      (一)這是一本什麼書        如果只把本書當作純粹介紹Android外掛化技術的書籍,那就大錯特錯了。        本書在研究Android外掛化之餘,還詳細介紹了Android系統的底層知識,包括Binder和AIDL的原理、四大元件的原理、Ap

Android外掛開發指南》勘誤

一些常識: 1)全書70個程式碼例子中,涉及到外掛的例子,請先assemble外掛的專案,這會在HostApp專案中生成assets目錄,並在該目錄下plugin1.apk。這樣,HostApp才能正常執行。 2)本書基於Android6.0(API level 23)的原始碼進行分析,本書的程式碼在

Android外掛開發過程中遇到的問題總結

最近接手的一個專案,是在外掛分支裡開發一個功能。但是寫過demo之後,發現同樣的程式碼在專案中執行不起來。在此過程中遇到的問題總結一下,以便以後遇到同樣的問題直到問題出在哪。 一、四大元件的註冊 四大元件的使用是一定要宣告的,尤其是要在主站中宣告。並且在外掛化開發的過程中

Android外掛開發之AMS與應用程式(客戶端ActivityThread、Instrumentation、Activity)通訊模型分析

今天主要分析下ActivityManagerService(服務端) 與應用程式(客戶端)之間的通訊模型,在介紹這個通訊模型的基礎上,再    簡單介紹實現這個模型所需要資料型別。         本文所介紹內容基於android2.2版本。由於Android版本的不同

Android外掛開發教程(一)

1.什麼是外掛化開發首先我們要對外掛化的概念有一個認識:外掛化開發是將整個app拆分成很多模組,這些模組包括一個宿主和多個外掛,每個模組都是一個apk(元件化的每個模組是個lib),最終打包的時候將宿主apk和外掛apk分開或者聯合打包。外掛式開發通俗的講就是把一個很大的app分成n多個

Android外掛開發 第三篇 [載入外掛資源]

引言 本文講解宿主如何從外掛apk中獲取到資源,為啥要從外掛中獲取資源呢?這種需求可能來自於顯示外掛的名字啊,圖示之類的。比如宿主的一個按鍵上顯示“掃一掃”或者"搖一搖"之類的,這個字串是外掛提供的。 Demo建立 引入外掛的AssetManager private sta

詳解Android外掛開發-資源訪問

    動態載入技術(也叫外掛化技術),當專案越來越龐大的時候,我們通過外掛化開發不僅可以減輕應用的記憶體和CPU佔用,還可以實現熱插拔,即在不釋出新版本的情況下更新某些模組。     通常我們把安卓資原始檔製作成外掛的形式,無外乎有一下幾種: zip

Android外掛最佳方案--Phantom 實踐指南

PhantomTest 滿幫集團外掛化框架Phantom使用演示 Phantom外掛化演示(請star支援) 演示demo下載 注意:請將外掛apk拷貝至sdcard下。 Phantom介紹 Phantom 是滿幫集團開源的一套穩定、靈

外掛開發系列之三---Android外掛從入門到放棄-最強合集

本人最近研究外掛化, 偶然發現此合集, 按照部分連結的文章實際簡單寫了些demo,受益良多, 覺得確實不錯,特轉載過來,給需要的人。 外掛化涉及的東西很多,所以我們需要多個維度去學習。大概分為5個部分:預備知識、入門、進階、系列、類庫。一步一步深入瞭解外掛的原理。 基礎1.Java 類載入器 類載入

Android Plugin插樁式實現外掛開發(一)-實現原理及Activity外掛實現

1. 前言在現在一些大型的Android應用中都採用了外掛化的開發方式,比如美團,支付寶及我們常用的微信等採用了插修的化的開發方式來進行開發的,既然國內一流的網際網路公司都採用這樣的方式來開發那它一定能帶給開發部署大型應用帶來很大的便捷,那麼外掛化的優勢在哪裡呢?1.1 外掛

滴滴開源Android外掛框架VirtualAPK原理分析

概述 Activity 支援 Hook ActivityManagerService Hook Instrumentation 啟動外掛Acti

[Songqw.Net 基礎]WPF實現簡單的外掛開發

原文: [Songqw.Net 基礎]WPF實現簡單的外掛化開發 接著上一篇部落格, 那裡實現了簡單的控制檯載入外掛,在這裡通過WPF實現,做個備份. WPF控制元件空間經常會與WinFrom混淆,要記得WPF控制元件是引用 using System.Windows.Co

Android外掛技術簡介

https://blog.csdn.net/io_field/article/details/79084630 可以通過反射 事先定義統一介面的方式,訪問外掛中的類和方法 還可以在AndroidManifest.xml中動態註冊元件Activity、Service、BroadcastReceiver、

android外掛框架-Replugin

Replugin是360開源的一款外掛化框架,同樣過多的資料就不在這展現了,github上有最完整的官網介紹。 github地址:https://github.com/DroidPluginTeam/DroidPlugin 宿主接入工作 project的gradle中加入:

Android外掛、元件

轉載僅供本人存檔及後續研究使用,請尊重原創。 轉載自:https://blog.csdn.net/qq941263013/article/details/82864553   如今移動app市場已經是百花齊放,其中有不乏有很多大型公司、巨型公司都是通過app創業發展起來的;ap

Android模組開發、元件開發

模組化開發:優點嘛,專案過大時便於管理; 1、在根目錄的gradle.properties檔案下新增 isBuildModule=false; 使用isBuildModule來控制這個是Library還是獨立的APP; 2、建立一個新的Module,在其build.gra

Android 外掛化入手指南之classLoader完全解析

原文:https://blog.csdn.net/u012124438/article/details/53235848  Java程式碼都是寫在Class裡面的,程式執行在虛擬機器上時,虛擬機器需要把需要的Class載入進來才能建立例項物件並工作,而完成這一個載入工作的角色就是Cla

Android外掛原理和實踐 (四) 之 合併外掛中的資源

我們繼續來學習Android外掛化相關知識,還是要圍繞著三個根本問題來展開。在前面兩章中已經講解過第一個根本問題:在宿主中如何去載入外掛以及呼叫外掛中類和元件程式碼。Demo中使用了Service來演示,因為還沒有解決載入外掛中資源的問題,用Activity不好展示。所以本文將要從資源的載入機制

Android外掛原理和實踐 (七) 之 專案實踐

我們在前面一系列文章中已經介紹完了外掛化原理以及三個根本問題的解決方案,本文主要就是作為前面幾篇文章的一個總結,通過專案實踐將前面的知識點串起來使完成一個入門級簡單的外掛化工程以及在實際外掛化開發中遇到的一些總結。 實踐 我們先通過Android Studio建立一個工程,工程中包括了兩

自己動手寫Android外掛框架,讓老闆對你刮目相看

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~ 本文由達文西發表於雲+社群專欄 最近在工作中接觸到了Android外掛內的開發,發現自己這種技術還缺乏最基本的瞭解,以至於在一些基本問題上浪費不少時間,如外掛Context和主工程Context的區別,許可權必須在主工程申明等,因此花了點時間瞭解