Android插件化实现方案
插件化對于廣大Android開發者而言,應該是一個不陌生的名詞。許多APP都有用到插件化技術,例如逢年過節,許多APP都會動態換上許多營造節日氛圍的ui特效,但是卻不需要用戶去重新下載APP;再者下載一款游戲平臺APP,若一次性下載一個包含所有游戲的平臺APP,那肯定需要很長時間,而用戶往往只玩其中一兩款,這時候就需要“按需下載”,在用戶想玩的時候在下載相應游戲的插件,這樣體驗就好多了。
? ? ? ?目前來說實現Android實現插件化的方案大致分為兩個方向:
? ? ? ?1、動態替換方案:提供對Android底層的各種類進行Hook,來實現加載插件中的四大組件,以DroidPlugin框架為代表;
? ? ? ?2、靜態代理方案:通過ProxyActivity統一加載插件中的所有Activity,以that框架為代表。
? ? ? ?本文以方案二靜態代理來實現Activity的插件化。
? ? ? ?本文項目結構如下:
? ? ? ?本文項目分為三大模塊,主APP模塊,插件APP模塊,以及充當兩者橋梁,起到解耦作用的pluginlib Library部分。
接下來我們分別講解這三個部分。
一、主APP模塊
? ? ? ?我們知道項目build完后會生成apk文件,作為主APP模塊,我們需要加載外部的插件apk,正常的加載流程應該如下:
? ? ? ?1、從服務器下載插件dex到手機SDCard,為此需要申請SDCard讀寫權限;
? ? ? ?2、讀取插件apk中的dex文件,生成對應的DexClassLoader;
? ? ? ?3、使用DexClassLoader的loadClass方法讀取插件dex中的任何一個類。
? ? ? ?為了模擬從服務器下載插件的方法,我們首先build插件APP,生成相應的apk文件,然后將apk文件重命名放到主APP模塊的assets文件中,APP啟動后會把asset目錄中的插件復制到內存中,如下圖所示:
相關代碼如下:
?
二、Library模塊
? ? ? ?首先需要一個插件APK的實體類,代碼如下:
? ? ? ?其中DexClassLoader用于加載插件中的類,Resources和AssetManager用于加載插件中的資源,PackageInfo用于獲取插件中的包信息。
? ? ? ?同時需要一個PluginManager類來管理實體對象,代碼如下:
? ? ? ?另外,我們需要意識到,插件中的Activity不同于我們正常啟動的Activity有AMS管理調用其生命周期,對于插件Activity,我們需要管理它的生命周期,為此我們寫了一個ProxyActivity來充當這個管理的角色,如下:
? ? ? ?為了更好地管理和調用插件Activity,我們需要制定一套規范,讓插件Activity遵循我們這套規則,為此寫了如下接口:
? ? ? ? 同時寫了一個BasePluginActivity來讓插件Activity繼承:
? ? ? ?如上代碼所示,若Activity屬于主APK,即mFrom=FROM_INTERNAL,則走常規的啟動流程,若屬于插件APK,則走插件管理的啟動流程。
三、插件APP模塊
? ? ? ?插件APP這邊比較簡單,繼承于BasePluginActivity,代碼如下:
? ? ? ? 整體效果如下,點擊加載APK文件成功后,點擊跳轉,跳轉到插件Activity。
? ? ??
? ? ?
四、總結
? ? ? ?插件化是Android開發中比較重要的一塊,涉及的東西很多,如Android四大組件的插件化,動態代理,四大組件的啟動過程,反射機制等,本文的介紹只是冰山一角,后續需要研究學習的地方還很多,有興趣的朋友可以一起探討。
? ? ? ?PS:許多同行對插件化有個誤區,認為插件化能極大減少APK的體積,把需要“按需下載”的APK在需要時才下載到主APK中,其實不然。確實插件化一定程度上能減少APK的體積,但是假設一個插件APK大小為10M,讓用戶從服務器下載一個10M的插件新版本,需要耗費很長時間。合理的做法應該把插件1.0版本放在主APP中,APP發版后需要更新插件,通過增量更新的方式來加載。
? ? ? ?最后,附上項目Github地址,有問題可交流:https://github.com/xudongstorm/PlugProject
?
原文轉載自: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
總結
以上是生活随笔為你收集整理的Android插件化实现方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 复杂 sql_复杂的SQL条件
- 下一篇: 导致大量kworker的原因_高尿酸与生