Android 插件化的动因很现实:发版周期长但业务想天天上新,包体积越滚越大而单个团队只关心自己那块,活动页想临时上线却要走一次全量构建。办法是把一部分功能做成可独立编译、运行、更新的 APK,由宿主在运行时加载。
Phantom 是满帮集团(货车帮)开源的插件化方案,开源前已在货车帮旗下多款产品的 50 多个插件上运行两年多、服务千万级用户,官方称稳定性与兼容性指标都在 4 个 9 以上。代码以 Apache 2.0 开源(部分为 MIT),最新版本 3.1.3。
插件化框架最怕的是什么
插件框架的命门在兼容性。早期方案普遍靠 Hook 系统内部实现来「骗过」AMS、PMS、ResourcesManager,一旦 Android 版本升级、内部类改名或方法签名变化就可能当场崩溃,而且崩的是宿主。
Phantom 冲的就是这点,方案里有两个关键词:
- 零 Hook:不反射修改系统内部实现,尽量只依赖系统公开的组件机制,把版本适配面压到最小;
- 占坑 / 预置组件:宿主预置通用组件占位,插件的
Activity 等组件在插件自己的 AndroidManifest.xml 里正常声明,运行时由 Phantom 路由到宿主对应的占位组件执行。
官方称这让宿主无需升级、也无需为每个插件组件在宿主 Manifest 里预埋声明,插件就能新增组件甚至新增插件。插件组件的写法与独立应用基本一致:
<activity
android:name="com.example.plugin.MainActivity"
android:launchMode="singleInstance"/>
Intent intent = new Intent();
intent.setClassName("com.example.plugin", "com.example.plugin.MainActivity");
PhantomCore.getInstance().startActivity(this, intent);
官方宣称兼容 Android 4.0 一直到 Android Q beta 4(final APIs),这个跨度在同类框架里很罕见。
与主流框架的取舍
README 里给了与 Atlas、Small、VirtualAPK、RePlugin 的对比,关键差异是:
- Hook 数量:Phantom 为零,其余从「较少」到「较多」不等;
- 四大组件:Phantom 除
ContentProvider 外全支持,Small 只支持 Activity;
- 插件热更新:只有 Phantom 标为支持;
- 快速部署 / 宿主通信:Phantom 支持快速部署,通信能力也强于多数同类。
要说明的是,Phantom 自己**也不支持 ContentProvider**,这是它明确的短板。
接入方式
宿主端加几行 Gradle、在 Application#onCreate() 里初始化即可:
buildscript {
dependencies {
classpath 'com.wlqq.phantom:phantom-host-gradle:3.1.2'
}
}
dependencies {
compile 'com.wlqq.phantom:phantom-host-lib:3.1.3'
}
apply plugin: 'com.wlqq.phantom.host'
PhantomCore.getInstance().init(this, new PhantomCore.Config());
插件端用 provided 引插件库、应用插件 Gradle Plugin,并在 phantomPluginConfig 里剔除公共库(如 support-v4)、配置宿主包名。框架会为每个 variant 生成安装任务,编译后可直接装到宿主:
./gradlew phInstallPluginDebug
上线前要确认的边界
官方文档坦白了已知限制:不支持 ContentProvider、不支持隐式 Intent 启动、插件里 registerActivityLifecycleCallbacks 无效、不支持 JobService / JobIntentService、自定义 layout 通知需把布局放到宿主、不支持 Data Binding。
它也是 2018~2019 年前后的项目,仓库记录的构建工具链是 Gradle 3.3 + AGP 2.3.3,之后虽对 AGP 3.x 做过兼容,但接入前务必先核对 Gradle / AGP / targetSdk 组合,别直接套用到最新工程。
小结
Phantom 的价值不在功能多全,而在路子够稳:用零 Hook 和占坑组件把兼容性风险压到最低,用接近独立 APK 的体验换来「插件新增组件不必升级宿主」。它更适合宿主基座稳定、插件频繁迭代的场景;反过来,若你依赖 Data Binding、ContentProvider 或较新工具链,就得先评估边界能否接受。
项目托管在 GitHub(Gitee 有镜像),Apache 2.0 协议;相关的 Android 构建与调试工具可在本站 /download 与 /tool 找找。