第2章 宿主工程初始化与Gradle插件配置
2.1 原理概述
动态加载框架的宿主工程是所有插件的运行容器。RePlugin与Atlas均要求宿主工程在编译期完成特殊Gradle配置,以便在构建时注入插件化基础设施(如ClassLoader桥接、组件代理、资源合并策略)。多模块工程结构旨在将宿主、插件、公共依赖库分离,保证各插件可独立编译、更新和调试。
| 框架 | 宿主初始化核心机制 | 关键Gradle依赖 |
|---|---|---|
| RePlugin | 通过gradle-plugin插入字节码,替换Activity/Service为代理类 | com.qihoo360.replugin:replugin-host-gradle |
| Atlas | 通过Bundle打包工具生成awb/so库,宿主动态加载bundle | com.taobao.android:atlas-gradle-plugin |
2.2 RePlugin宿主Gradle依赖注入
请在项目根build.gradle中添加插件路径:
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath 'com.qihoo360.replugin:replugin-host-gradle:2.3.4'
classpath 'com.android.tools.build:gradle:4.2.0'
}
}
宿主app模块的build.gradle应用插件并添加运行时依赖:
apply plugin: 'com.android.application'
apply plugin: 'replugin-host-gradle'
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.example.host"
minSdkVersion 21
targetSdkVersion 30
}
}
dependencies {
implementation 'com.qihoo360.replugin:replugin-host-lib:2.3.4'
}
启用RePlugin后,建议开启minifyEnabled为false(调试阶段),避免混淆导致代理替换失败。
2.3 Atlas宿主基础配置
根build.gradle引入Atlas插件:
buildscript {
dependencies {
classpath 'com.taobao.android:atlas-gradle-plugin:2.0.0'
}
}
宿主app模块build.gradle配置Atlas bundle模式:
apply plugin: 'com.android.application'
apply plugin: 'com.taobao.atlas.library'
atlas {
bundleConfig {
bundleName "main_host"
isHost true
}
bundleCompile {
compile bundlePublic {
artifact 'com.taobao.android:atlas-core:2.0.0'
}
}
}
dependencies {
implementation 'com.taobao.android:atlas-core:2.0.0'
implementation 'com.taobao.android:atlas-update:2.0.0'
}
Atlas要求宿主Application继承自
com.taobao.android.dexposed.ClassLoaderManager提供的基类,必须在AndroidManifest中声明自定义Application。2.4 多模块工程结构搭建
标准的多模块工程目录树如下:
MyDynamicApp/
├── settings.gradle # 模块注册
├── build.gradle # 根配置
├── host-app/ # 宿主主工程
│ └── build.gradle
├── common-lib/ # 公共依赖库(可被插件引用)
│ └── build.gradle
├── plugin-module-a/ # 插件A(RePlugin使用)
│ └── build.gradle
├── plugin-module-b/ # 插件B(Atlas使用awb)
│ └── build.gradle
└── services/ # 后台服务模块(可选)
└── build.gradle
settings.gradle示例:
rootProject.name = 'MyDynamicApp'
include ':host-app'
include ':common-lib'
include ':plugin-module-a'
include ':plugin-module-b'
include ':services'
host-app/build.gradle依赖公共库:
dependencies {
implementation project(':common-lib')
}
2.5 调试与验证
- 执行
./gradlew :host-app:assembleDebug,观察控制台是否打印RePlugin/Atlas的字节码注入日志。 - 检查
build/intermediates/下生成的RePluginConfig.json(RePlugin)或AtlasBundleInfo.json(Atlas)是否存在。 - 安装宿主APK后,尝试加载一个测试插件(可通过adb push插件APK到指定目录),查看插件界面是否正常显示。
2.6 常见错误与解决方案
| 错误现象 | 原因 | 解法 |
|---|---|---|
Gradle sync失败,找不到replugin-host-gradle | 仓库未配置或版本号错误 | 检查mavenCentral()是否在buildscript.repositories中 |
编译时出现Classpath conflict | 宿主和插件引用了不同版本的支持库 | 统一使用provided或compileOnly暴露给插件 |
| Atlas打包后找不到bundle | 未正确配置atlas.bundleConfig或未注册bundle | 确认宿主app的atlas { bundleConfig { isHost true } } |
| 插件无法加载资源(Resource Not Found) | 插件与宿主资源ID冲突 | 启用资源分段(RePlugin通过repluginHostConfig的useAppCompatResource) |
2.7 性能与稳定性优化
- 按需引入依赖:宿主仅包含框架核心库,插件依赖的第三方库在插件独立打包时引入,避免宿主APK膨胀。
- Gradle缓存加速:在
gradle.properties中开启org.gradle.caching=true和android.enableBuildCache=true,减少重复编译。 - 插件预加载策略:对于常用插件,可在宿主Application初始化时异步预加载其dex/资源,提升首屏启动速度。
最佳实践:在持续集成中为每个插件模块单独构建APK,使用宿主白名单机制动态控制插件版本,避免因插件更新导致宿主兼容性问题。