APP中嵌入APP可以吗?就像支付宝里嵌入了饿了么,这样是怎么操作的?

发布时间:2022-02-21 / 作者:清心寡欲


看了很多答案,都说是嵌入的小程序,其实支付宝之前的版本里面嵌入的就是饿了吗app,APP中嵌入APP是可以的,下面具体说说实现原理。

使用插件化技术实现APP嵌入APP

  • 安卓系统加载APP的原理

安卓开发语言是JAVA,当然现在有kotlin了,这里我就拿java来说吧。

我们开发编写的java文件会被编译成class文件,然后才能被java虚拟机加载解析并运行。

那安卓使用的是Dalvik虚拟机,它可执行不了class文件,所以安卓编译器会把java文件编译成dex文件,才能被Dalvik虚拟机是加载解析运行。

那Dalvik虚拟机时候如何加载dex文件的呢?

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,还可以是其他的文件、资源等等。

上面简单介绍安卓插件化的原理,如有说的不好或不对的地方,还请大佬指教!

我是非著名攻城狮,希望我的回答对您有用,感谢您的关注与支持!


声明:本媒体部分图片、文章来源于网络,版权归原作者所有,如有侵权,请联系QQ:330946442删除。

猜您喜欢