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目录。




相关文章
|
7月前
|
移动开发 数据库 Android开发
构建高效Android应用:Kotlin协程的实践指南
【5月更文挑战第30天】 在移动开发领域,性能优化和流畅的用户体验是至关重要的因素。对于Android开发者来说,Kotlin协程作为一种异步编程解决方案,提供了强大且轻量级的机制来处理后台任务,而不会对主线程造成阻塞。本文将深入探讨Kotlin协程的概念、优势以及如何在Android应用中实现它们,从而改善应用响应性和用户满意度。通过实例代码和最佳实践的分享,我们将展示如何有效利用协程来处理网络请求、数据库操作和耗时计算,同时确保UI的流畅性。
|
7月前
|
移动开发 调度 Android开发
构建高效Android应用:Kotlin协程的实践指南
【5月更文挑战第30天】在移动开发领域,Android平台的流畅性与效率一直是开发者追求的核心。随着Kotlin语言的普及,其提供的协程特性为编写高效、轻量级的异步代码提供了强大工具。本文将深入探讨如何在Android项目中利用Kotlin协程来优化性能,提升用户体验。我们将从协程的基本概念出发,通过实例演示如何在实际开发中合理运用协程,并讨论协程对资源管理和错误处理的影响。
40 3
|
3月前
|
开发框架 Dart 前端开发
Android 跨平台方案对比之Flutter 和 React Native
本文对比了 Flutter 和 React Native 这两个跨平台移动应用开发框架。Flutter 使用 Dart 语言,提供接近原生的性能和丰富的组件库;React Native 则基于 JavaScript,具备庞大的社区支持和灵活性。两者各有优势,选择时需考虑团队技能和项目需求。
436 8
|
3月前
|
Web App开发 网络协议 Android开发
Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【9月更文挑战第4天】本文详细对比了在Android平台上实现一对一音视频通话时常用的WebRTC、RTMP及RTSP三种技术方案。从技术原理、性能表现与开发难度等方面进行了深入分析,并提供了示例代码。WebRTC适合追求低延迟和高质量的场景,但开发成本较高;RTMP和RTSP则在简化开发流程的同时仍能保持较好的传输效果,适用于不同需求的应用场景。
198 1
|
4月前
|
存储 安全 API
Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore
本文介绍了 Android 开发中常用的键值对存储方案,包括 SharedPreferences、MMKV 和 DataStore,并对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。
147 1
|
4月前
|
Android开发 C++ 开发者
Android经典实战之跨平台开发方案:Kotlin Multiplatform vs Flutter
本文对比了Kotlin Multiplatform与Flutter两大跨平台开发框架,从技术特性、性能、开发效率、UI体验、可扩展性及适用场景等维度进行了详尽分析,帮助开发者根据项目需求和技术背景选择最优方案。
189 2
|
4月前
|
Web App开发 网络协议 Android开发
### 惊天对决!Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【8月更文挑战第14天】随着移动互联网的发展,实时音视频通信已成为移动应用的关键部分。本文对比分析了Android平台上WebRTC、RTMP与RTSP三种主流技术方案。WebRTC提供端到端加密与直接数据传输,适于高质量低延迟通信;RTMP适用于直播场景,但需服务器中转;RTSP支持实时流播放,但在复杂网络下稳定性不及WebRTC。三种方案各有优劣,WebRTC功能强大但集成复杂,RTMP和RTSP实现较简单但需额外编码支持。本文还提供了示例代码以帮助开发者更好地理解和应用这些技术。
160 0
|
7月前
|
物联网 区块链 vr&ar
构建高效Android应用:Kotlin协程的实践指南未来交织:新兴技术趋势与跨领域应用探索
【5月更文挑战第28天】随着移动应用开发的不断进步,开发者寻求更高效、更简洁的方式来处理异步任务和提升用户体验。在Android平台上,Kotlin协程作为一种轻量级的线程管理方案,提供了强大的工具来简化并发和异步编程。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在Android应用中利用协程优化性能和响应性。通过本文,你将学会如何运用协程来编写更加流畅和高效的代码,同时减少内存消耗和提高应用的稳定性。 【5月更文挑战第28天】 随着科技的迅猛发展,一系列创新技术如区块链、物联网(IoT)、虚拟现实(VR)等正在逐渐从概念验证走向实际应用。这些技术的融合与交叉不仅预示着信息时
|
7月前
|
安全 数据库 Android开发
构建高效Android应用:采用Kotlin与Jetpack的实践指南
【5月更文挑战第22天】 在移动开发领域,Android系统因其开放性和广泛的用户基础而备受开发者青睐。随着技术的不断演进,Kotlin语言以其简洁性和功能性成为Android开发的首选语言。本文将深入探讨如何结合Kotlin和Android Jetpack组件来构建一个高效且易于维护的Android应用。我们将重点讨论如何使用Jetpack的核心组件,如LiveData、ViewModel和Room,以及Kotlin的语言特性来优化代码结构,提高应用性能,并简化数据管理。通过具体案例分析,本文旨在为开发者提供一套实用的技术指导,帮助他们在竞争激烈的市场中脱颖而出。
|
7月前
|
移动开发 Android开发 开发者
构建高效安卓应用:Kotlin 协程的实践指南
【5月更文挑战第18天】 随着移动开发技术的不断进步,安卓平台亟需一种高效的异步编程解决方案来应对日益复杂的应用需求。Kotlin 协程作为一种新兴的轻量级线程管理机制,以其简洁的语法和强大的功能,成为解决这一问题的关键。本文将深入探讨Kotlin协程在安卓开发中的实际应用,从基本概念到高级技巧,为开发者提供一份全面的实践指南,旨在帮助读者构建更加高效、稳定的安卓应用。