Android插件化最佳方案--Phantom 实践指南 - xuexiangjys的博客 - CSDN博客

简介: Android插件化最佳方案--Phantom 实践指南 - xuexiangjys的博客 - CSDN博客

PhantomTest


满帮集团插件化框架Phantom使用演示


微信截图_20220515205414.png


Phantom插件化演示(请star支持)


微信截图_20220515205453.png


Phantom介绍


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


Phantom特点


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


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


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


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


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


Phantom不支持项


  • 暂时不支持 Gradle 4.x + Android Gradle Plugin 3.x


  • 暂时不支持 Android DataBinding


  • 不支持ContentProvider



Phantom 与主流开源插件框架的对比【官方给的】


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


Phantom集成指南


宿主程序


宿主程序相当于一个空壳容器,用于加载插件APK,需要注意的是,插件使用到的权限,宿主也要同步获取,否则将无法正常运行。


配置Gradle脚本


特别需要注意的是,这里一定要使用 Gradle 3.3 + Android Gradle Plugin 2.3.3的方式,否则会


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


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


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


apply plugin: 'com.wlqq.phantom.host'
dependencies {
    compile 'com.wlqq.phantom:phantom-host-lib:3.0.0'
}


插件初始化


在Application的onCreate初始化 Phantom 插件框架.详细配置可点击查看


public class YourApplication extends Application {
    @Override
    public void onCreate() {
       super.onCreate();
       //初始化Phantom框架,并加载已经安装的插件
       PhantomCore.getInstance().init(this, new PhantomCore.Config());
    }
}


插件安装和卸载


详细说明请见官方文档


1.插件安装


  • installPlugin: 从SDCard卡上安装插件。


PhantomCore.getInstance().installPlugin(Environment.getExternalStorageDirectory() + "/com.xuexiang.xqrcodetest_1.0.apk");


  • installPluginFromAssets: 从assets下安装插件


PhantomCore.getInstance().installPluginFromAssets("plugins/com.wlqq.phantom.plugin.view_1.0.0.apk")


2.如何判断插件是否已安装


使用PhantomCore.getInstance().isPluginInstalled(“插件包名”)判断。


PhantomCore.getInstance().isPluginInstalled("com.xuexiang.xqrcodetest")


3.插件卸载


使用PhantomCore.getInstance().uninstallPlugin(“插件包名”)来卸载插件。


PhantomCore.getInstance().uninstallPlugin("com.xuexiang.xqrcodetest");


4.插件启用


插件安装完之后,启动插件代表该插件将被立即加载到内存中,调用 PluginInfo 接口中 start() 即可.


InstallResult ret = PhantomCore.getInstance().installPlugin(Environment.getExternalStorageDirectory() + "/com.xuexiang.xqrcodetest_1.0.apk");
// 插件安装成功后启动插件(执行插件的 Application#onCreate 方法)
if (ret.isSuccess() && ret.plugin.start()) {
    Intent intent = new Intent();
    // 指定插件 Activity 所在的插件包名以及 Activity 类名
    intent.setClassName("com.xuexiang.xqrcodetest", "com.xuexiang.xqrcodetest.Main2Activity");
    PhantomCore.getInstance().startActivity(this, intent);
}


插件程序


插件程序作为一个独立的apk,可以独立安装,也可以被宿主程序安装加载使用。需要注意的是,插件使用到的权限,宿主也要同步获取,否则将无法正常运行。


配置Gradle脚本


特别需要注意的是,这里一定要使用 Gradle 3.3 + Android Gradle Plugin 2.3.3的方式,否则会


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


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


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


apply plugin: '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.0.0'
    compile 'com.android.support:support-v4:28.0.0'
}


3.配置PhantomPlugin插件的参数


着重注意hostApplicationIdhostAppLauncherActivity这两个参数,是需要你配成自己的宿主信息。


phantomPluginConfig {
    // BEGIN 剔除公共库配置
    // 若插件中有使用 support-v4 ,则需要剔除掉(必须)
    excludeLib "com.android.support:support-v4:28.0.0"
    // END
    // BEGIN 生成插件额外的混淆配置文件,避免因剔除公共库引起的混淆问题
    libraryJarsProguardFile file('proguard-phantom.pro')
    // END
    // BEGIN 快速部署插件配置
    // 宿主包名,这里需要改成你自己的
    hostApplicationId = "com.xuexiang.phantomtest"
    // 宿主 launcher Activity full class name
    hostAppLauncherActivity = "com.xuexiang.phantomtest.MainActivity"
    // 插件包名,这里需要改成你自己的
    pluginApplicationId = android.defaultConfig.applicationId
    // 插件版本名
    pluginVersionName = android.defaultConfig.versionName
    // END
}


4.在插件 AndroidManifest.xml 中申明对宿主 Phantom 插件框架版本依赖(目前版本名是 3.0.0,对应版本号为 30000)


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


编译


编译插件


与编译独立 APK 相同,如:


  • ./gradlew assembleDebug


  • ./gradlew assembleRelease


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


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


  • ./gradlew phInstallPluginDebug


  • ./gradlew phInstallPluginRelease


注意:以上命令会自动将插件的apk文件push到手机的sdcard目录。




相关文章
|
17天前
|
数据库 Android开发 开发者
构建高效Android应用:Kotlin协程的实践指南
【4月更文挑战第2天】随着移动应用开发的不断进步,开发者们寻求更流畅、高效的用户体验。在Android平台上,Kotlin语言凭借其简洁性和功能性赢得了开发社区的广泛支持。特别是Kotlin协程,作为一种轻量级的并发处理方案,使得异步编程变得更加简单和直观。本文将深入探讨Kotlin协程的核心概念、使用场景以及如何将其应用于Android开发中,以提高应用性能和响应能力。通过实际案例分析,我们将展示协程如何简化复杂任务,优化资源管理,并为最终用户提供更加流畅的体验。
|
1月前
|
移动开发 数据库 Android开发
构建高效Android应用:Kotlin协程的实践指南
【2月更文挑战第16天】 在移动开发领域,性能优化和应用响应速度是衡量用户体验的关键因素。对于Android开发者而言,Kotlin协程提供了一种革新的异步编程方式,旨在简化后台任务的处理并提高应用效率。本文将深入探讨Kotlin协程的核心概念、使用场景以及如何在实际项目中实现以提升应用性能和用户满意度。通过具体示例和最佳实践,我们将了解协程如何在不阻塞主线程的情况下执行耗时操作,以及它们是如何成为现代Android开发不可或缺的工具。
25 1
|
1月前
|
移动开发 Java Android开发
构建高效Android应用:Kotlin协程的实践指南
【2月更文挑战第26天】 在移动开发领域,性能优化和应用响应速度是用户体验的关键因素。针对Android平台,Kotlin协程作为一种新的并发处理方式,以其轻量级线程管理和非阻塞特性,正在改变开发者编写异步和后台任务的方式。本文将深入探讨Kotlin协程的原理,并通过实例展示如何在Android应用中有效利用协程来提升性能和响应能力。
|
1月前
|
数据库 Android开发 开发者
构建高效Android应用:Kotlin协程的实践指南
【2月更文挑战第17天】 在移动开发领域,性能优化和流畅的用户体验是永恒的追求。随着Kotlin语言在Android平台的普及,协程作为其提供的一种轻量级线程管理方案,已成为提升应用响应性和并发处理能力的重要工具。本文将深入探讨Kotlin协程的核心概念、使用场景以及在实际Android开发中如何有效利用协程来改善应用性能和代码可读性。通过实例分析,我们将揭示协程在异步任务执行、网络请求和数据库操作中的高效应用,并展示如何结合现有框架和库无缝集成协程,从而为开发者提供一份全面的Kotlin协程实践指南。
|
7月前
|
存储 缓存 前端开发
Android Github 上面优秀的两种阴影方案,完美兼容高低版本问题
Android Github 上面优秀的两种阴影方案,完美兼容高低版本问题
|
7月前
|
编解码 监控 前端开发
Android平台GB28181设备接入模块相关博客概览
Android平台GB28181设备接入模块,可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如智能监控、智慧零售、智慧教育、远程办公、生产运输、智慧交通、车载或执法记录仪等场景。
|
8月前
|
Android开发
Android手写占位式插件化框架之apk解析原理系统源码分析
Android手写占位式插件化框架之apk解析原理系统源码分析
76 0
|
8月前
|
Android开发
Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信(二)
Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信
80 0
|
8月前
|
Android开发
Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信(一)
Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信
68 0
|
8月前
|
Web App开发 编解码 网络协议
Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP
Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP
281 0