看了很多答案,都說是嵌入的小程序,其實支付寶之前的版本里面嵌入的就是餓了嗎APP,APP中嵌入APP是可以的,下面具體說說實現原理。
使用插件化技術實現APP嵌入APP
安卓系統加載APP的原理
安卓開發語言是JAVA,當然現在有kotlin了,這里我就拿java來說吧。
我們開發編寫的java文件會被編譯成class文件,然后才能被java虛擬機加載解析并運行。
那安卓使用的是Dalvik虛擬機,它可執行不了class文件,所以安卓編譯器會把java文件編譯成dex文件,才能被Dalvik虛擬機是加載解析運行。
Android支持動態加載的兩種方式是:DexClassLoader和PathClassLoader。DexClassLoader可加載jar/apk/dex,且支持從SD卡加載;
PathClassLoader只能加載已經安裝在Android系統內APK文件。
PathClassLoader的限制要更多一些,它只能加載已經安裝到Android系統中的apk文件,也就是/data/app目錄下的apk文件。其它位置的文件加載的時候都會出現ClassNotFoundException。
了解了基本的加載方法之后,就可以安卓這套方法,實現加載邏輯,達到運行apk的目的。
實現加載邏輯
加載邏輯需要宿主APP去實現的,然后提供使用文檔給插件方調用。
如何實現加載邏輯,簡單來說就是根據系統的邏輯負責一套就ok了。
安卓包下面有asset資源、raw資源、圖片資源、xml文件、dex文件等等。
這些資源和文件的加載都需要寫一套加載邏輯,大致和系統的相同。
宿主app可以使用系統的加載方法,而插件方只能使用宿主提供的加載方法,否則會報錯崩潰。
插件化的兩個加載方式
1.隨宿主APP一起打包成apk,系統會將插件當成文件進行編譯。這種方式比較少,首先這種內嵌的方式,完全可以用模塊化代替,其次是不支持動態更新。
2.提供下載地址給宿主app,需要用到插件時直接下載到SD卡,然后進行加載解析。這種支持動態化更新,也就是只要提供個接口給宿主app,如果接口返回需要更新,那這個時候在重新下載插件。
基本上都偏向于第二種加載方式。
插件化方式的好處
1.減少app包體積
2.便于分工管理,解耦
3.動態更新,減少發版
...
總結
APP嵌入APP是可以通過插件化來實現的,并且在大型項目插件化實用非常頻繁,不只是加載app,還可以是其他的文件、資源等等。