三、DiDi开源VirtualApk源码解析(Activity/Service)。 VirtualApk优化反射带来损耗的小技巧。 ps:如果你对此(一、二)已经十分了解,请自行略过。 按照VirtualApk的实现,大致流程为: 1、初始化Hook住Instrumentation和ActivityThread等。 三、VirtualApk源码解析 1、初始化 初始化过程中,VirtualApk 创建了PluginManager ,并且hook住了Instrumentation和SystemService,如下图所示 没错,如下图,在启动Activity的入口处,VirtualApk拦截了请求,然后根据Intent的参数,去匹配plugin中的Activity坑位,之后替换Intent中的Activity,以此来达到欺骗系统的效果 VirtualApk:https://github.com/didi/VirtualAPK 个人github:https://github.com/CarGuo ? 终于结束了,点个赞不?
三、DiDi开源VirtualApk源码解析(Activity/Service)。 VirtualApk优化反射带来损耗的小技巧。 ps:如果你对此(一、二)已经十分了解,请自行略过。 按照VirtualApk的实现,大致流程为: 1、初始化Hook住Instrumentation和ActivityThread等。 三、VirtualApk源码解析 1、初始化 初始化过程中,VirtualApk 创建了PluginManager ,并且hook住了Instrumentation和SystemService,如下图所示 没错,如下图,在启动Activity的入口处,VirtualApk拦截了请求,然后根据Intent的参数,去匹配plugin中的Activity坑位,之后替换Intent中的Activity,以此来达到欺骗系统的效果 VirtualApk:https://github.com/didi/VirtualAPK 个人github:https://github.com/CarGuo
上周末,滴滴与360都开源了各自的插件化框架,VirtualAPK与RePlugin,作为一个插件化方面的狂热研究者,在周末就迫不及待的下载了Virtualapk框架来进行研究,本篇博客带来的是VirtualAPK (看博客之前,请大家先下载VirtualVirtualAPKapk的项目,https://github.com/didi/VirtualAPK) Hook ActivityManagerService 在解释VirtualAPK是如何对Activity进行管理之前,有必要说一下ActivityManagerService,Android的四大组件都需要与它打交道,它主要为四大组件做了这些事情: 1.startActivity 这个Handler.Callback是一个接口,我们可以使用动态代理或者普通代理完成Hook,在Virtualapk中使用普通的静态代理方式,还记得前面的VAInstrumentation类么? 至此,整个Virtualapk框架对于插件Activity的管理就到此结束了,接下来还会继续分析其他组件的原理,最后,如果小弟有分析偏差的地方,欢迎矫正。
在前一篇博客滴滴插件化框架VirtualAPK原理解析(一)之插件Activity管理 中VirtualAPK是如何对Activity进行管理的,本篇博客,我们继续来学习这个框架,这次我们学习的是如何去管理 VirtualAPK是如何实现Service插件化的 VirtualAPK中使用了一种代理分发的方法,注册一个真正的Service组件ProxyService,让这个Service承载一个真正的Service 等对应的方法 1.注册代理Service 上面说道,我们需要一个货真价实的Service组件来承载进程优先级等功能,因此需要在AndroidManifest.xml中声明一个或多个这样的Sevice,打开VirtualAPK -- Local Service running in main process --> <service android:name="com.didi.<em>virtualapk</em>.delegate.LocalService applicationId}.intent.ACTION_DAEMON_SERVICE" /> </intent-filter> </service> 可以发现,VirtualAPK
android插件化在9.0上插件activity的theme失效问题(VirtualApk) 在使用VirtualApk的时候,发现在android 9.0上,插件中的Activity配置的theme 正是如此,给了我们hook修改的机会,看到VirtualApk的处理VAInstrumentation中 @Override public boolean handleMessage(Message msg Log.w(TAG, e); } Virtual 给ActivityThread中的Handler增加了自己的callback,也就是在系统处理LAUNCH_ACTIVITY消息时,virtualApk 所以知道为什么VirtualApk在9.0上为什么设置的theme没有效果,因为系统启动的调用方式已经发生了改变。 那现在我们如何去修改呢。
DroidPlugin ( 360 ) 五、dynamic-load-apk ( 任玉刚 ) 六、Shadow ( 腾讯 ) 七、Phantom ( 满帮 ) 八、RePlugin ( 360 ) 九、Small 十、VirtualAPK RePlugin 九、Small ---- 官网 : http://code.wequick.net/Small/cn/home https://github.com/wequick/Small 十、VirtualAPK ( 滴滴 ) ---- https://github.com/didi/VirtualAPK 十一、ACDD ---- https://github.com/bunnyblue/ACDD
所以,VirtualAPK首先hook了Instrumentation的newActivity方法。 我们可以看到,VirtualAPK将插件的ClassLoader和Resources封装在了LoadedPlugin中。 通过上面两个方法,我们得知VirtualApk是如何加载一个包外的Activity。 于是VirtualApk在library中,加入了一个AndroidManifest.xml。 至此,Activity启动的坑就被VirtualApk一一绕过去了。
2026年Android插件化主流方案盘点与选型:原理、框架对比与落地建议插件化技术原理简述与参考来源Phantom框架解析与特性VirtualAPK框架解析与特性VirtualApp框架解析与特性Shiply 本文将依次解析Phantom、VirtualAPK、VirtualApp与Shiply四款框架的原理与优劣,并给出选型参考。 Phantom在Hook数量为零、兼容性极高、插件热更新与快速部署方面优于早期VirtualAPK、RePlugin等方案,适合对系统版本跨度大且需快速落地的业务。 VirtualAPK框架解析与特性VirtualAPK由DiDi开源,是Android插件化经典实现之一,开源地址为https://github.com/didi/VirtualAPK。 VirtualAPK的资源管理体系由PluginManager、ResourcesManager、LoadedPlugin协同完成,在需要深度掌握底层机制并有能力自行解决兼容性问题的团队中仍有价值。
第一件那就是:滴滴出行开源的 VirtualAPK ,这是滴滴开源的自家的插件化解决方案,一款极度轻量级的 APK 动态加载框架。 开源插件地址:https://github.com/didi/VirtualAPK。
(2017年 6 月 ) VirtualAPK 是滴滴开源的一套插件化框架,支持几乎所有的 Android 特性,四大组件方面。 架构图: 实现思路: VirtualAPK 对插件没有额外的约束,原生的 apk 即可作为插件。 如下图所示,通过这些 LoadedPlugin 对象,VirtualAPK 就可以管理插件并赋予插件新的意义,使其可以像手机中安装过的 App 一样运行。 如下是 VirtualAPK 和主流的插件化框架之间的对比。 实战 主要是测试各个框架之间上手的容易度如何,并做不同对比,这边写了两个 Demo 例子,一个是基于 Small 框架,一个基于 VirtualAPK 框架,从中能看出不同。
VirtualAPK (2017年 6 月 ) VirtualAPK 是滴滴开源的一套插件化框架,支持几乎所有的 Android 特性,四大组件方面。 架构图: ? 实现思路: VirtualAPK 对插件没有额外的约束,原生的 apk 即可作为插件。 如下图所示,通过这些 LoadedPlugin 对象,VirtualAPK 就可以管理插件并赋予插件新的意义,使其可以像手机中安装过的 App 一样运行。 如下是 VirtualAPK 和主流的插件化框架之间的对比。 ? 实战 主要是测试各个框架之间上手的容易度如何,并做不同对比,这边写了两个 Demo 例子,一个是基于 Small 框架,一个基于 VirtualAPK 框架,从中能看出不同。
代表框架:360的DroidPlugin、滴滴的VirtualAPK、以及360的RePlugin。 VirtualAPK:滴滴的务实选择 相比DroidPlugin的"全量虚拟化",滴滴的VirtualAPK走了一条更务实的路:只Hook必要的点,插件和宿主可以共享代码和资源。 (约15KB,160个方法数) • 插件框架的Bug可以随插件一起热修,不用发宿主版本 • 不同插件可以用不同版本的框架,互不干扰 三代方案对比一览 对比维度 → Hook派(DroidPlugin/VirtualAPK 本篇小结 • 插件化解决三大工程刚需:动态发布、包体瘦身、模块解耦 • 第一代Hook派(DroidPlugin/VirtualAPK)效果惊艳但与系统升级为敌 • Android 9的Hidden API
以VirtualAPK的处理方式为例 第一步:创建Resource if (Constants.COMBINE_RESOURCES) { //插件和主工程资源合并时需要hook住主工程的资源 如何构造Activity实例,同步生命周期 解决方法有很多种,以VirtualAPK为例,核心思路如下: 先在Manifest中预埋StubActivity,启动时hook上图第1步,将Intent替换成 VirtualAPK为了支持Activity的launchMode在主工程的AndroidManifest中对于每种启动模式的Activity都预埋了多个坑位。 小结 VirtualAPK通过替换了系统的Instrumentation,hook了Activity的启动和创建,省去了手动管理插件Activity生命周期的繁琐,让插件Activity像正常的Activity 资源加载原理解析 (https://www.notion.so/VirtualAPK-1fce1a910c424937acde9528d2acd537) ---- 如果您觉得我们的内容还不错,就请转发到朋友圈
目前已获得 1.9k,开源地址: https://github.com/didi/mpx 移动端 1、VirtualAPK ? VirtualAPK 是滴滴首个开源项目。 目前,已获得 7.7 k Stars,开源地址: https://github.com/didi/VirtualAPK 2、cube-ui ?
查阅了很多Android开发架构的资料,组件化自己写了个简单的Demo并且开始了原有项目的改造,插件化自己也尝试了滴滴的VirtualAPK框架。 现在很多大厂都早已推出了自己的插件化框架,例如VirtualApk、RePlugin等等。 ? 插件化 6、总结 内容本身比较简单,就是基础概念的总结。
以VirtualAPK的处理方式为例。 如何构造Activity实例,同步生命周期 解决方法有很多种,以VirtualAPK为例,核心思路如下: 先在Manifest中预埋StubActivity,启动时hook上图第1步,将Intent替换成 hook第10步,通过插件的ClassLoader反射创建插件Activity 之后Activity的所有生命周期回调都会通知给插件Activity 替换系统Instrumentation VirtualAPK VirtualAPK为了支持Activity的launchMode在主工程的AndroidManifest中对于每种启动模式的Activity都预埋了多个坑位。 小结 VirtualAPK通过替换了系统的Instrumentation,hook了Activity的启动和创建,省去了手动管理插件Activity生命周期的繁琐,让插件Activity像正常的Activity
精彩内容不容错过~ 前言 插件化技术从 2015 年就开始百花齐放,如: 奇虎 360 的 replugin,滴滴的 VirtualAPK,到现在的 VirtualApp,插件化经历了市场严峻的考验,也算逐步成熟 参考链接 沐小晨曦 VirtualApk 插件化
性能优化总结 Android 内存泄漏总结 Android布局优化之include、merge、ViewStub的使用 Android权限处理 Android热修复原理 Android插件化入门指南 VirtualApk
3.滴滴VirtualAPK(推荐指数:⭐⭐⭐)核心特点:功能全、侵入低。原理:支持四大组件动态加载、资源分包共享和So库加载。
开源框架 目前市场上主流的插件框架如下表: Dynamicapk:携程 github: https://github.com/CtripMobile/DynamicAPK VirtualAPK:滴滴 github: https://github.com/didi/VirtualAPK DroidPlugin :360 https://github.com/DroidPluginTeam/DroidPlugin