Android博客週刊專題之#插件化開發#


本期專欄目討論插件化開發。插件化涉及的東西很多,所以我們需要多個維度去學習。大概分爲5個部分:預備知識、入門、進階、系列、類庫。一步一步深入瞭解插件的原理。本專欄會不定時更新相關內容,請留意更新的消息。請加入QQ羣:149581646.會統一通知最新的文章。
Posted 2016-03-16 by Jomeslu.
基礎

1.Java 類加載器

類加載器(class loader)是 Java™中的一個很重要的概念。類加載器負責加載 Java 類的字節代碼到 Java 虛擬機中。本文首先詳細介紹了 Java 類加載器的基本概念,包括代理模式、加載類的具體過程和線程上下文類加載器等,接着介紹如何開發自己的類加載器,最後介紹了類加載器在 Web 容器和 OSGi™中的應用。

2.反射原理

Java 提供的反射機制允許您於執行時期動態載入類別、檢視類別資訊、生成物件或操作生成的物件,要舉反射機制的一個應用實例,就是在整合式開發環境中所提供的方法提示或是類別檢視工具,另外像 JSP 中的 JavaBean 自動收集請求資訊也使用到反射,而一些軟體開發框架(Framework)也常見到反射機制的使用,以達到動態載入使用者自訂類別的目的。

3.代理模式及Java實現動態代理

定義:給某個對象提供一個代理對象,並由代理對象控制對於原對象的訪問,即客戶不直接操控原對象,而是通過代理對象間接地操控原對象。
入門

1.Android動態加載dex技術初探

Android使用Dalvik虛擬機加載可執行程序,所以不能直接加載基於class的jar,而是需要將class轉化爲dex字節碼,從而執行代碼。優化後的字節碼文件可以存在一個*.jar中,只要其內部存放的是*.dex即可使用。

2.Android插件化入門

開發者將插件代碼封裝成Jar或者APK。宿主下載或者從本地加載Jar或者APK到宿主中。將宿主調用插件中的算法或者Android特定的Class(如Activity)

3.插件化開發—動態加載技術加載已安裝和未安裝的apk

動態加載技術就是使用類加載器加載相應的apk、dex、jar(必須含有dex文件),再通過反射獲得該apk、dex、jar內部的資源(class、圖片、color等等)進而供宿主app使用。

4.Android動態加載技術三個關鍵問題詳解

動態加載技術(也叫插件化技術)在技術驅動型的公司中扮演着相當重要的角色,當項目越來越龐大的時候,需要通過插件化來減輕應用的內存和CPU佔用,還可以實現熱插拔,即在不發佈新版本的情況下更新某些模塊。
進階

1.攜程Android App插件化和動態加載實踐

攜程Android App的插件化和動態加載框架已上線半年,經歷了初期的探索和持續的打磨優化,新框架和工程配置經受住了生產實踐的考驗。本文將詳細介紹Android平臺插件式開發和動態加載技術的原理和實現細節,回顧攜程Android App的架構演化過程,期望我們的經驗能幫助到更多的Android工程師。

2.動態加載APK原理分享

被加載的apk稱之爲插件,因爲機制類似於生物學的"寄生",加載了插件的應用也被稱爲宿主。 往往不是所有的apk都可作爲插件被加載,往往需要遵循一定的"開發規範",還需要插件項目引入某種api類庫,業界通常都是這麼做的。

3.Android插件化的一種實現

Android的插件化已經是老生常談的話題了,插件化的好處有很多:解除代碼耦合,插件支持熱插拔,靜默升級,從根本上解決65K屬性和方法的bug等等。下面給大家介紹一下我們正在用的差價化框架。本片主要以類圖的方式向大家介紹插件話框架的實現。

4.蘑菇街 App 的組件化之路

隨着我街業務的蓬勃發展,產品和運營隨時上新功能新活動的需求越來越強烈,經常可以聽到“有個功能我想周x上,行不行”。行麼?當然是不行啦,上新功能得發新版本啊,到時候費時費力打亂開發節奏不說,覆蓋率也是個問題。

5.DynamicLoadApk 源碼解析

DynamicLoadApk 是一個開源的 Android 插件化框架。插件化的優點包括:(1) 模塊解耦,(2) 動態升級,(3) 高效並行開發(編譯速度更快) (4) 按需加載,內存佔用更低等等DynamicLoadApk 提供了 3 種開發方式,讓開發者在無需理解其工作原理的情況下快速的集成插件化功能。

6.Android apk動態加載機制的研究

問題是這樣的:我們知道,apk必須安裝才能運行,如果不安裝要是也能運行該多好啊,事實上,這不是完全不可能的,儘管它比較難實現。在理論層面上,我們可以通過一個宿主程序來運行一些未安裝的apk,當然,實踐層面上也能實現,不過這對未安裝的apk有要求。我們的想法是這樣的,首先要明白apk未安裝是不能被直接調起來.

7.美團Android DEX自動拆包及動態加載簡介

作爲一個android開發者,在開發應用時,隨着業務規模發展到一定程度,不斷地加入新功能、添加新的類庫,代碼在急劇的膨脹,相應的apk包的大小也急劇增加, 那麼終有一天,你會不幸遇到這個錯誤.

8.途牛原創|途牛Android App的插件實現

途牛的插件化是基於dynamic-load-apk(github)實現的。定義了宿主和插件的通信方式,使得兩者能夠互起對方的頁面,調用彼此的功能。同時對activity的啓動方式singletask等進行了模式實現,並增加了對Service的支持等。總之使得插件開發最大限度的保持着原有的Android開發習慣。

9. Android apk資源加載和activity生命週期管理

博主分析了Android中apk的動態加載機制,並在文章的最後指出需要解決的兩個複雜問題:資源的訪問和activity生命週期的管理,而本文將會分析這兩個複雜問題的解決方法。

10.APK動態加載框架(DL)解析

首先要說的是動態加載技術(或者說插件化)在技術驅動型的公司中扮演這相當重要的角色,當項目越來越龐大的時候,需要通過插件化來減輕應用的內存和cpu佔用,還可以實現熱插拔,即在不發佈新版本的情況下更新某些模塊。
系列

1.Kaedea---Android動態加載技術 簡單易懂的介紹

我們很早開始就在Android項目中採用了動態加載技術,主要目的是爲了達到讓用戶不用重新安裝APK就能升級應用的功能(特別是 SDK項目),這樣一來不但可以大大提高應用新版本的覆蓋率,也減少了服務器對舊版本接口兼容的壓力,同時如果也可以快速修復一些線上的BUG。

2.Kaedea---Android動態加載基礎 ClassLoader的工作機制

早期使用過Eclipse等Java編寫的軟件的同學可能比較熟悉,Eclipse可以加載許多第三方的插件(或者叫擴展),這就是動態加載。這些插件大多是一些Jar包,而使用插件其實就是動態加載Jar包裏的Class進行工作。

3.Kaedea---Android動態加載補充 加載SD卡的SO庫

Android中JNI的使用其實就包含了動態加載,APP運行時動態加載.so庫並通過JNI調用其封裝好的方法。後者一般是使用NDK工具從C/C++代碼編譯而成,運行在Native層,效率會比執行在虛擬機的Java代碼高很多,所以Android中經常通過動態加載.so庫來完成一些對性能比較有需求的工作(比如T9搜索、或者Bitmap的解碼、圖片高斯模糊處理等)。

4.Kaedea---Android動態加載入門 簡單加載模式

Java程序中,JVM虛擬機是通過類加載器ClassLoader加載.jar文件裏面的類的。Android也類似,不過Android用的是Dalvik/ART虛擬機,不是JVM,也不能直接加載.jar文件,而是加載dex文件。

5.Kaedea---Android動態加載進階 代理Activity模式

簡單模式中,使用ClassLoader加載外部的Dex或Apk文件,可以加載一些本地APP不存在的類,從而執行一些新的代碼邏輯。但是使用這種方法卻不能直接啓動插件裏的Activity。

6.Kaedea---Android動態加載黑科技 動態創建Activity模式

還記得我們在代理Activity模式裏談到啓動插件APK裏的Activity的兩個難題嗎,由於插件裏的Activity沒在主項目的Manifest裏面註冊,所以無法經歷系統Framework層級的一系列初始化過程,最終導致獲得的Activity實例並沒有生命週期和無法使用res資源。

7.尼古拉斯---插件開發基礎篇:動態加載技術解讀

在目前的軟硬件環境下,Native App與Web App在用戶體驗上有着明顯的優勢,但在實際項目中有些會因爲業務的頻繁變更而頻繁的升級客戶端,造成較差的用戶體驗,而這也恰恰是Web App的優勢。本文對網上Android動態加載jar的資料進行梳理和實踐在這裏與大家一起分享,試圖改善頻繁升級這一弊病。

8.尼古拉斯---插件開發開篇:類加載器分析

這篇文章主要介紹了Android中主要的兩個類加載器:PathClassLoader和DexClassLoader,他們的區別,聯繫,用法等問題,以及我們在製作插件的過程中會遇到哪些常見的問題。這篇文章也是後續兩篇文章的基礎,因爲如果不瞭解這兩個類的話,我們將無法進行後續的操作。

9.尼古拉斯---插件開發中篇:資源加載問題(換膚原理解析)

這篇文章主要通過現在一些應用自帶的換膚技術的解讀來看看,在開發插件的過程中如何解決一些資源加載上的問題,這個問題爲何要單獨拿出來解釋,就是因爲他涉及的知識很多,也是後面一篇文章的基礎,我們在需要加載插件中的資源文件的時候。

10.尼古拉斯---插件開發終極篇:動態加載Activity(免安裝運行程序)

這篇文章主要是講解了如何加載插件中的Activity。從而實現免安裝運行程序,同時這篇文章也是對前三篇文章知識的綜合使用。下載很多應用都會使用到插件技術,因爲包的大小和一些功能的優先級來決定哪些模塊可以製作成插件。

11.Weishu---Android插件化原理解析——概要

類的加載可以使用Java的ClassLoader機制,但是對於Android來說,並不是說類加載進來就可以用了,很多組件都是有“生命”的;因此對於這些有血有肉的類,必須給它們注入活力,也就是所謂的組件生命週期管理.

12.Weishu---Android插件化原理解析——Hook機制之動態代理

使用代理機制進行API Hook進而達到方法增強是框架的常用手段,比如J2EE框架Spring通過動態代理優雅地實現了AOP編程,極大地提升了Web開發效率;同樣,插件框架也廣泛使用了代理機制來增強系統API從而達到插件化的目的.

13.Weishu---Android插件化原理解析——Hook機制之Binder Hook

Android系統通過Binder機制給應用程序提供了一系列的系統服務,諸如ActivityManagerService,ClipboardManager, AudioManager等;這些廣泛存在系統服務給應用程序提供了諸如任務管理,音頻,視頻等異常強大的功能。

14.Weishu---Android 插件化原理解析——Hook機制之AMS&PMS

在前面的文章中我們介紹了DroidPlugin的Hook機制,也就是代理方式和Binder Hook;插件框架通過AOP實現了插件使用和開發的透明性。在講述DroidPlugin如何實現四大組件的插件化之前,有必要說明一下它對AMS以及PMS的Hook方式。

15.Weishu---Android 插件化原理解析——Activity生命週期管理

之前的 Android插件化原理解析 系列文章揭開了Hook機制的神祕面紗,現在我們手握倚天屠龍,那麼如何通過這種技術完成插件化方案呢?具體來說,插件中的Activity,Service等組件如何在Android系統上運行起來?

16.Weishu---Android 插件化原理解析——插件加載機制

上文 Activity生命週期管理 中我們地完成了『啓動沒有在AndroidManifest.xml中顯式聲明的Activity』的任務;通過Hook AMS和攔截ActivityThread中H類對於組件調度我們成功地繞過了AndroidMAnifest.xml的限制。

17.Weishu---Android插件化原理解析——廣播的管理

在Activity生命週期管理 以及 插件加載機制 中我們詳細講述了插件化過程中對於Activity組件的處理方式,爲了實現Activity的插件化我們付出了相當多的努力;那麼Android系統的其他組件,比如BroadcastReceiver,Service還有ContentProvider,它們又該如何處理呢?

18.Weishu---Android 插件化原理解析——Service的插件化

在 Activity生命週期管理 以及 廣播的管理 中我們詳細探討了Android系統中的Activity、BroadcastReceiver組件的工作原理以及它們的插件化方案,相信讀者已經對Android Framework和插件化技術有了一定的瞭解;
類庫

1.DroidPlugin

是360手機助手在Android系統上實現了一種新的插件機制

2.Android-Plugin-Framework

此項目是Android插件開發框架完整源碼及示例。用來通過動態加載的方式在宿主程序中運行插件APK。

3.Small

世界那麼大,組件那麼小。Small,做最輕巧的跨平臺插件化框架。裏面有很詳細的文檔

4.dynamic-load-apk

Android 使用動態加載框架DL進行插件化開發

5.AndroidDynamicLoader

Android 動態加載框架,他不是用代理 Activity 的方式實現而是用 Fragment 以及 Schema 的方式實現

6.DynamicAPK

實現Android App多apk插件化和動態加載,支持資源分包和熱修復.攜程App的插件化和動態加載框架.

7.ACDD

非代理Android動態部署框架

8.android-pluginmgr

不需要插件規範的apk動態加載框架。
參考視頻

1.DroidPlugin的實現原理及其應用

Droid Plugin是360手機助手在2015年初研發的一個全新的基於Android平臺的插件機制.

2.android插件化及動態部署

阿里技術沙龍第十六期《android插件化及動態部署》視頻
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章