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月前
|
数据采集 监控 API
告别手动埋点!Android 无侵入式数据采集方案深度解析
传统的Android应用监控方案需要开发者在代码中手动添加埋点,不仅侵入性强、工作量大,还难以维护。本文深入探讨了基于字节码插桩技术的无侵入式数据采集方案,通过Gradle插件 + AGP API + ASM的技术组合,实现对应用性能、用户行为、网络请求等全方位监控,真正做到零侵入、易集成、高稳定。
833 85
|
数据采集 JSON 网络安全
移动端数据抓取:Android App的TLS流量解密方案
本文介绍了一种通过TLS流量解密技术抓取知乎App热榜数据的方法。利用Charles Proxy解密HTTPS流量,分析App与服务器通信内容;结合Python Requests库模拟请求,配置特定请求头以绕过反爬机制。同时使用代理IP隐藏真实IP地址,确保抓取稳定。最终成功提取热榜标题、内容简介、链接等信息,为分析热点话题和用户趋势提供数据支持。此方法也可应用于其他Android App的数据采集,但需注意选择可靠的代理服务。
565 11
移动端数据抓取:Android App的TLS流量解密方案
|
移动开发 数据库 Android开发
构建高效Android应用:Kotlin协程的实践指南
【5月更文挑战第30天】 在移动开发领域,性能优化和流畅的用户体验是至关重要的因素。对于Android开发者来说,Kotlin协程作为一种异步编程解决方案,提供了强大且轻量级的机制来处理后台任务,而不会对主线程造成阻塞。本文将深入探讨Kotlin协程的概念、优势以及如何在Android应用中实现它们,从而改善应用响应性和用户满意度。通过实例代码和最佳实践的分享,我们将展示如何有效利用协程来处理网络请求、数据库操作和耗时计算,同时确保UI的流畅性。
|
移动开发 调度 Android开发
构建高效Android应用:Kotlin协程的实践指南
【5月更文挑战第30天】在移动开发领域,Android平台的流畅性与效率一直是开发者追求的核心。随着Kotlin语言的普及,其提供的协程特性为编写高效、轻量级的异步代码提供了强大工具。本文将深入探讨如何在Android项目中利用Kotlin协程来优化性能,提升用户体验。我们将从协程的基本概念出发,通过实例演示如何在实际开发中合理运用协程,并讨论协程对资源管理和错误处理的影响。
318 3
|
开发框架 Dart 前端开发
Android 跨平台方案对比之Flutter 和 React Native
本文对比了 Flutter 和 React Native 这两个跨平台移动应用开发框架。Flutter 使用 Dart 语言,提供接近原生的性能和丰富的组件库;React Native 则基于 JavaScript,具备庞大的社区支持和灵活性。两者各有优势,选择时需考虑团队技能和项目需求。
1351 9
|
Web App开发 网络协议 Android开发
Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【9月更文挑战第4天】本文详细对比了在Android平台上实现一对一音视频通话时常用的WebRTC、RTMP及RTSP三种技术方案。从技术原理、性能表现与开发难度等方面进行了深入分析,并提供了示例代码。WebRTC适合追求低延迟和高质量的场景,但开发成本较高;RTMP和RTSP则在简化开发流程的同时仍能保持较好的传输效果,适用于不同需求的应用场景。
1440 2
|
存储 安全 API
Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore
本文介绍了 Android 开发中常用的键值对存储方案,包括 SharedPreferences、MMKV 和 DataStore,并对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。
1274 1
|
Android开发 C++ 开发者
Android经典实战之跨平台开发方案:Kotlin Multiplatform vs Flutter
本文对比了Kotlin Multiplatform与Flutter两大跨平台开发框架,从技术特性、性能、开发效率、UI体验、可扩展性及适用场景等维度进行了详尽分析,帮助开发者根据项目需求和技术背景选择最优方案。
1763 2
|
物联网 区块链 vr&ar
构建高效Android应用:Kotlin协程的实践指南未来交织:新兴技术趋势与跨领域应用探索
【5月更文挑战第28天】随着移动应用开发的不断进步,开发者寻求更高效、更简洁的方式来处理异步任务和提升用户体验。在Android平台上,Kotlin协程作为一种轻量级的线程管理方案,提供了强大的工具来简化并发和异步编程。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在Android应用中利用协程优化性能和响应性。通过本文,你将学会如何运用协程来编写更加流畅和高效的代码,同时减少内存消耗和提高应用的稳定性。 【5月更文挑战第28天】 随着科技的迅猛发展,一系列创新技术如区块链、物联网(IoT)、虚拟现实(VR)等正在逐渐从概念验证走向实际应用。这些技术的融合与交叉不仅预示着信息时
|
Web App开发 网络协议 Android开发
### 惊天对决!Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【8月更文挑战第14天】随着移动互联网的发展,实时音视频通信已成为移动应用的关键部分。本文对比分析了Android平台上WebRTC、RTMP与RTSP三种主流技术方案。WebRTC提供端到端加密与直接数据传输,适于高质量低延迟通信;RTMP适用于直播场景,但需服务器中转;RTSP支持实时流播放,但在复杂网络下稳定性不及WebRTC。三种方案各有优劣,WebRTC功能强大但集成复杂,RTMP和RTSP实现较简单但需额外编码支持。本文还提供了示例代码以帮助开发者更好地理解和应用这些技术。
683 0

热门文章

最新文章