热门前沿知识相关面试问题-android插件化面试问题讲解
插件化由来:
- 65536/64K【技术层面上】
随着代码越来越大,业务逻辑越来繁杂,所以很容易达到一个65536的天花板,其65536指的是整个项目中的方法总数如果达到这个数量时则不无法创建新的方法了,所以基于这个原因插件化就产生了。 - 功能层面的解耦、维护团队的分离,这也是大势所趋,每个团队会维护一个APK中的不同的业务模块,如果每个业务模块升级都需要对整个APK进行升级,代价实在太大,虽说目前有H5的方式能解决这个问题,但是体验上肯定是没法中Native的APP进行比较的。虽说来自Facebook的react native如今比较流行,但是在国内插件化用得比较多,毕境是纯native。
插件化要解决的问题:
- 动态加载APK:
指的是有一个宿主程序会从sdcard中动态加载APK,下面从代码层面来进行说明:在Android中有两个加载器:
DexClassLoader:主要是从jar文件中加载字节码文件,主要用于动态加载、代码热更新等等,可以加载APK中的字节码。
PathClassLoader:它只能加载文件目录下的APK。
那具体如何动态加载呢?先用DexClassLoader通过反射去加载相印的Activity,如下:然后抽象一个BaseActivity,其大体的逻辑是如果有ProxyActivity则走它的逻辑,否则执行正常的逻辑,如下:
接着在MainActivity中去设置contentView,值得注意的是因为读取不到另外一个APK中的xml文件,所以这里得用动态代码的生成View的方式来设置,如下:
- 资源加载:
其实是用的Android系统提供的AssetManager去调用它里面隐藏的一个方法来实现的,具体如下: - 代码加载:
其实也就是利用Java中的类加载器来进行加载,不过Android有它特殊的地方,因为有组件的概念,而且组件有它的生命周期方法,所以这里通过反射来调用相应Activity的生命周期方法,首先获取生命周期的方法:最后再在相应的生命周期中调用相应的方法:
其中发现插件化中大量用到了反射,说到反射肯定会有性能问题~~这也是插件化技术的一个问题。