日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android插件化实现方案

發(fā)布時間:2023/12/20 Android 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android插件化实现方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

插件化對于廣大Android開發(fā)者而言,應(yīng)該是一個不陌生的名詞。許多APP都有用到插件化技術(shù),例如逢年過節(jié),許多APP都會動態(tài)換上許多營造節(jié)日氛圍的ui特效,但是卻不需要用戶去重新下載APP;再者下載一款游戲平臺APP,若一次性下載一個包含所有游戲的平臺APP,那肯定需要很長時間,而用戶往往只玩其中一兩款,這時候就需要“按需下載”,在用戶想玩的時候在下載相應(yīng)游戲的插件,這樣體驗就好多了。

? ? ? ?目前來說實現(xiàn)Android實現(xiàn)插件化的方案大致分為兩個方向:

? ? ? ?1、動態(tài)替換方案:提供對Android底層的各種類進(jìn)行Hook,來實現(xiàn)加載插件中的四大組件,以DroidPlugin框架為代表;

? ? ? ?2、靜態(tài)代理方案:通過ProxyActivity統(tǒng)一加載插件中的所有Activity,以that框架為代表。

? ? ? ?本文以方案二靜態(tài)代理來實現(xiàn)Activity的插件化。

? ? ? ?本文項目結(jié)構(gòu)如下:

? ? ? ?本文項目分為三大模塊,主APP模塊,插件APP模塊,以及充當(dāng)兩者橋梁,起到解耦作用的pluginlib Library部分。

接下來我們分別講解這三個部分。

一、主APP模塊

? ? ? ?我們知道項目build完后會生成apk文件,作為主APP模塊,我們需要加載外部的插件apk,正常的加載流程應(yīng)該如下:

? ? ? ?1、從服務(wù)器下載插件dex到手機(jī)SDCard,為此需要申請SDCard讀寫權(quán)限;

? ? ? ?2、讀取插件apk中的dex文件,生成對應(yīng)的DexClassLoader;

? ? ? ?3、使用DexClassLoader的loadClass方法讀取插件dex中的任何一個類。

? ? ? ?為了模擬從服務(wù)器下載插件的方法,我們首先build插件APP,生成相應(yīng)的apk文件,然后將apk文件重命名放到主APP模塊的assets文件中,APP啟動后會把a(bǔ)sset目錄中的插件復(fù)制到內(nèi)存中,如下圖所示:

相關(guān)代碼如下:

?

二、Library模塊

? ? ? ?首先需要一個插件APK的實體類,代碼如下:

? ? ? ?其中DexClassLoader用于加載插件中的類,Resources和AssetManager用于加載插件中的資源,PackageInfo用于獲取插件中的包信息。

? ? ? ?同時需要一個PluginManager類來管理實體對象,代碼如下:

? ? ? ?另外,我們需要意識到,插件中的Activity不同于我們正常啟動的Activity有AMS管理調(diào)用其生命周期,對于插件Activity,我們需要管理它的生命周期,為此我們寫了一個ProxyActivity來充當(dāng)這個管理的角色,如下:

? ? ? ?為了更好地管理和調(diào)用插件Activity,我們需要制定一套規(guī)范,讓插件Activity遵循我們這套規(guī)則,為此寫了如下接口:

? ? ? ? 同時寫了一個BasePluginActivity來讓插件Activity繼承:

? ? ? ?如上代碼所示,若Activity屬于主APK,即mFrom=FROM_INTERNAL,則走常規(guī)的啟動流程,若屬于插件APK,則走插件管理的啟動流程。

三、插件APP模塊

? ? ? ?插件APP這邊比較簡單,繼承于BasePluginActivity,代碼如下:

? ? ? ? 整體效果如下,點擊加載APK文件成功后,點擊跳轉(zhuǎn),跳轉(zhuǎn)到插件Activity。

? ? ??

? ? ?

四、總結(jié)

? ? ? ?插件化是Android開發(fā)中比較重要的一塊,涉及的東西很多,如Android四大組件的插件化,動態(tài)代理,四大組件的啟動過程,反射機(jī)制等,本文的介紹只是冰山一角,后續(xù)需要研究學(xué)習(xí)的地方還很多,有興趣的朋友可以一起探討。

? ? ? ?PS:許多同行對插件化有個誤區(qū),認(rèn)為插件化能極大減少APK的體積,把需要“按需下載”的APK在需要時才下載到主APK中,其實不然。確實插件化一定程度上能減少APK的體積,但是假設(shè)一個插件APK大小為10M,讓用戶從服務(wù)器下載一個10M的插件新版本,需要耗費很長時間。合理的做法應(yīng)該把插件1.0版本放在主APP中,APP發(fā)版后需要更新插件,通過增量更新的方式來加載。

? ? ? ?最后,附上項目Github地址,有問題可交流:https://github.com/xudongstorm/PlugProject

?

原文轉(zhuǎn)載自:https://blog.csdn.net/m0_37451060/article/details/99614847?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

總結(jié)

以上是生活随笔為你收集整理的Android插件化实现方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。