第2章 宿主工程初始化与Gradle插件配置

2.1 原理概述

动态加载框架的宿主工程是所有插件的运行容器。RePlugin与Atlas均要求宿主工程在编译期完成特殊Gradle配置,以便在构建时注入插件化基础设施(如ClassLoader桥接、组件代理、资源合并策略)。多模块工程结构旨在将宿主、插件、公共依赖库分离,保证各插件可独立编译、更新和调试。

框架宿主初始化核心机制关键Gradle依赖
RePlugin通过gradle-plugin插入字节码,替换Activity/Service为代理类com.qihoo360.replugin:replugin-host-gradle
Atlas通过Bundle打包工具生成awb/so库,宿主动态加载bundlecom.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')
}
宿主工程多模块架构与插件依赖关系 host-app (宿主) common-lib RePlugin 框架 Atlas 框架 plugin-module-a plugin-module-b 依赖 依赖注入 实现插件 多模块优势 • 宿主与插件独立编译,降低耦合。 • 公共库可被所有插件引用,避免重复打包。 • 单插件变更只需编译对应模块,提升迭代效率。

2.5 调试与验证

  1. 执行 ./gradlew :host-app:assembleDebug,观察控制台是否打印RePlugin/Atlas的字节码注入日志。
  2. 检查build/intermediates/下生成的RePluginConfig.json(RePlugin)或AtlasBundleInfo.json(Atlas)是否存在。
  3. 安装宿主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,使用宿主白名单机制动态控制插件版本,避免因插件更新导致宿主兼容性问题。