【中级—(1),flutter 面试题
1.含义
所谓插件化,就是让我们的应用不必再像原来一样把所有的内容都放在一个 apk 中,可以把一些功能和逻辑单独抽出来放在插件 apk 中,然后主 apk 做到[按需调用],这样的好处是一来可以减少主 apk 的体积,让应用更轻便,二来可以做到热插拔,更加动态化。
2.背景
3.优点
![](https://upload-images.jiansh
u.io/upload_images/24216715-70cded950213328d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
二、Android 插件化基础
1.插件化的特点
应用在运行的时候通过加载一些本地不存在的可执行文件实现一些特定的功能;
这些可执行文件是可以替换的;
更换静态资源(比如换启动图、换主题、或者用服务器参数开关控制广告的隐藏现实等)不属于动态加载;
Android 中动态加载的核心思想是动态调用外部的 dex 文件,极端的情况下,Android APK 自身带有的 Dex 文件只是一个程序的入口(或者说空壳),所有的功能都通过从服务器下载最新的 Dex 文件完成;
2.需要解决的问题
代码加载
类的加载可以使用 Java 的 ClassLoader 机制,但是对于 Android 来说,并不是说类加载进来就可以用了,很多组件都是有“生命”的;因此对于这些有血有肉的类,必须给它们注入活力,也就是所谓的组件生命周期管理;
资源加载
资源加载方案大家使用的原理都差不多,都是用 AssetManager 的隐藏方法 addAssetPath。
3.插件化必备基础
①ClassLoader 类加载器
要想实现加载外部 dex 文件(即插件)来实现热部署,那么必然要把其中的 class 文件加载到内存中。
其中涉及到两种 ClassLoader:DexClassLoader 和 PathClassLoader。而 DexClassLoader 可以加载外部的 jar,dex 等文件,正是我们需要的。
关于 ClassLoader 详解,见ClassLoader完全解析。
②Java 反射
因为插件 apk 与宿主 apk 不在一个 apk 内,那么一些类的访问必然要通过反射进行获取。所以了解反射对插件化的学习是必须的。
关于 Java 反射,见Java反射详解。
③插件资源访问
res 里的每一个资源都会在 R.java 里生成一个对应的 Integer 类型的 id,APP 启动时会先把 R.java 注册到当前的上下文环境,我们在代码里以 R 文件的方式使用资源时正是通过使用这些 id 访问 res 资源,然而插件的 R.java 并没有注册到当前的上下文环境,所以插件的 res 资源也就无法通过 id 使用了。
查看源码,通过“addAssetPath”方法重新生成一个新的 Resource 对象来保存插件中的资源,避免冲突。
关于插件资源访问,见使用插件中的R资源。
评论