Home

Awesome

license Release Version Build Status

Phantom — 唯一零 Hook 稳定占坑类 Android 热更新插件化方案

Phantom 是满帮集团开源的一套稳定、灵活、兼容性好的 Android 插件化方案。

Phantom 的优势

Phantom 与主流开源插件框架的对比

特性AtlasSmallVirtualAPKRePluginPhantom
Hook 数量较多较少较少仅一处
四大组件全支持只支持 Activity全支持全支持ContentProvider 外,全支持
剔除公共库支持支持支持不支持支持
兼容性适配非常高
插件热更新不支持不支持不支持不支持支持
插件快速部署不支持不支持不支持支持支持
插件宿主通信一般一般一般

接入指南

宿主端

添加 Gradle 配置

在宿主项目根目录下的 build.gradle 中增加宿主 gradle 依赖

buildscript {
    dependencies {
      classpath 'com.wlqq.phantom:phantom-host-gradle:3.1.2'
    }
}

在宿主工程 Application 模块的 build.gradle 中增加宿主 library 依赖,并应用宿主 gradle 依赖包含的 gradle 插件 com.wlqq.phantom.host

dependencies {
    compile 'com.wlqq.phantom:phantom-host-lib:3.1.3'
}

apply plugin: 'com.wlqq.phantom.host'

初始化 Phantom 插件框架

在宿主工程 Application 模块中的 Application#onCreate() 方法中初始化 Phantom

public class YourApplication extends Application {
    @Override
    public void onCreate() {
       super.onCreate();
       PhantomCore.getInstance().init(this, new PhantomCore.Config());
    }
}

安装内置到宿主 assets 中的插件 APK 并启动插件中的 Activity

// 安装打包到宿主 assets 中 plugins 目录下的插件
InstallResult ret = PhantomCore.getInstance().installPluginFromAssets("plugins/com.wlqq.phantom.pluign.component_1.0.0.apk");
// 插件安装成功后启动插件(执行插件的 Application#onCreate 方法)
if (ret.isSuccess() && ret.plugin.start()) {
    Intent intent = new Intent();
    // 指定插件 Activity 所在的插件包名以及 Activity 类名
    intent.setClassName("com.wlqq.phantom.pluign.component", "com.wlqq.phantom.pluign.component.MainActivity");
    PhantomCore.getInstance().startActivity(this, intent);
}

插件端

添加 Gradle 配置

在插件项目根目录下的 build.gradle 中增加插件 gradle 依赖

buildscript {
    dependencies {
      classpath 'com.wlqq.phantom:phantom-plugin-gradle:3.1.2'
    }
}

在插件项目 Application 模块的 build.gradle 中增加插件 library 依赖,并应用宿主 gradle 依赖包含的 gradle 插件 com.wlqq.phantom.plugin

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Phantom 混淆配置文件
            proguardFile 'proguard-phantom.pro'
        }
    }
}

dependencies {
    provided 'com.wlqq.phantom:phantom-plugin-lib:3.1.2'
    compile 'com.android.support:support-v4:28.0.0'
}

apply plugin: 'com.wlqq.phantom.plugin'

phantomPluginConfig {
    // BEGIN 剔除公共库配置
    // 若插件中有使用 support-v4 ,则需要剔除掉(必须)
    excludeLib "com.android.support:support-v4:28.0.0"
    // END

    // BEGIN 生成插件额外的混淆配置文件,避免因剔除公共库引起的混淆问题
    libraryJarsProguardFile file('proguard-phantom.pro')
    // END

    // BEGIN 快速部署插件配置
    // 宿主包名
    hostApplicationId = "com.wlqq.phantom.sample"
    // 宿主 launcher Activity full class name
    hostAppLauncherActivity = "com.wlqq.phantom.sample.MainActivity"
    // 插件包名
    pluginApplicationId = android.defaultConfig.applicationId
    // 插件版本名
    pluginVersionName = android.defaultConfig.versionName
    // END
}

在插件 AndroidManifest.xml 中申明对宿主 Phantom 插件框架最低版本依赖

<meta-data
    android:name="phantom.service.import.PhantomVersionService"
    android:value="30000"/>

编译插件

与编译独立 APK 相同,如:

编译插件并将插件 APK 安装到宿主

插件端使用的 Gradle 插件会自动为项目的 variant 生成相应的插件安装 task ,格式为 phInstallPlugin${variant} ,例如:

进阶指南

示例应用

联系我们

如果你在使用过程中遇到问题,或者有好的建议,欢迎给我们提 issuePull Request。详细说明请移步 贡献指南

临时交流 QQ 群号:690051836

项目作者

开源协议

Apache License 2.0, part MIT. See the LICENSE file for details.

致谢

参考以及使用的开源项目

项目名称开源协议说明
MavenApache License依赖库版本比较
jsemverMIT License依赖库版本比较
AtlasApache License首次加载插件提速 jar 包及 so 库
RePluginApache LicenseGradle Plugin 快速部署插件到宿主<br/>反射工具类 ReflectUtils
VirtualApkApache License构建 Gradle Plugin 对 Gradle 4.x + Android Gradle Plugin 3.x 的兼容处理