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

Posted 互联网技术分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日源码Phantom — 唯一零 Hook 稳定占坑类 Android 热更新插件化方案相关的知识,希望对你有一定的参考价值。

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

Phantom 的优势

  • 兼容性好: Hook,没有调用系统的 hidden API,完美兼容 Android 9.0

  • 功能完整:插件支持独立应用的绝大部分特性

  • 稳定可靠:历经货车帮旗下多款产品 50+ 插件两年多千万级用户验证(稳定性和兼容性指标都在 4 个 9 以上)

  • 部署灵活:宿主无需升级(无需在宿主 AndroidManifest.xml 中预埋组件),即可支持插件新增组件,甚至新增插件

  • 易于集成:无论插件端还是宿主端,只需『数行』就能完成接入,改造成本低

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

特性 Atlas Small VirtualAPK RePlugin Phantom
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.2'
}

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 相同,如:

  • ./gradlew assembleDebug

  • ./gradlew assembleRelease

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

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

  • ./gradlew phInstallPluginDebug

  • ./gradlew phInstallPluginRelease

进阶指南

https://github.com/ManbangGroup/Phantom


— THE END —


推荐阅读

关注「互联网技术分享」,热门阅读集结

1.

2.

| 互联网技术分享 |

ABOUT US


开发 · 干货 · 生活

以上是关于每日源码Phantom — 唯一零 Hook 稳定占坑类 Android 热更新插件化方案的主要内容,如果未能解决你的问题,请参考以下文章

唯一插件化Replugin源码及原理深度剖析--唯一Hook点原理

唯一插件化RePlugin源码及原理深度剖析--工程职责及大纲

HOOK这是一种思想(附源码)

C语言每日一练 —— 第22天:零基础学习动态规划

唯一插件化Replugin源码及原理深度剖析--插件的安装加载原理

唯一插件化Replugin源码及原理深度剖析--插件的安装加载原理