编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • 性能优化实践

  • 程序编程原理

  • 稳定性与可靠性

  • 工程化与运维

  • 方案设计思想

    • README
    • 架构与组件

      • 通用架构设计方案
      • 组件化方案的设计
      • 插件化与热加载方案
        • 01.一个上线的危机
          • 1.1 双 11 前的事故
          • 1.2 发版周期的瓶颈
          • 1.3 插件化的契机
        • 02.要解决的核心矛盾
          • 2.1 应用商店审核
          • 2.2 包体积的膨胀
          • 2.3 灰度回滚困难
          • 2.4 插件化的本质
        • 03.业界主流方案
          • 3.1 三种技术路线
          • 3.2 横向对比矩阵
          • 3.3 关键技术拆解
        • 04.插件化设计原则
          • 04.1 隔离优先原则
          • 4.2 兼容性原则
          • 4.3 安全性原则
        • 05.插件化方案落地
          • 5.1 整体架构设计
          • 5.2 类加载机制
          • 5.3 资源加载机制
          • 5.4 生命周期管理
          • 5.5 插件下发流程
        • 06.热修复方案落地
          • 6.1 类替换方案
          • 6.2 dex 替换方案
          • 6.3 资源修复方案
        • 07.常见陷阱与反例
          • 7.1 平台合规风险
          • 7.2 兼容性碎片化
          • 7.3 性能开销失控
        • 08.演进路线
          • 8.1 V1 远程配置
          • 8.2 V2 H5 容器
          • 8.3 V3 插件化
          • 8.4 V4 动态化框架
        • 09.总结与决策
          • 9.1 适用场景清单
          • 9.2 选型决策树
      • SDK设计与发布方案
      • 中台化能力沉淀方案
      • 配置中心设计方案
    • 数据与存储

    • 通信与协议

    • 稳定性与安全

    • 端侧专项性

    • 研发的效能

  • 专栏
  • 方案设计思想
  • 架构与组件
杨充
2026-05-21
目录

插件化与热加载方案

# 03.插件化与热加载方案

本篇定位:组件化(02 篇)解决的是"编译期解耦",插件化解决的是"运行期解耦"——让 App 在不重新发版的前提下,动态加载新业务、修复 Bug、上线运营活动。本文回答三个核心问题——为什么需要插件化?业界三大方案怎么选?什么时候千万不要用?

# 目录介绍

  • 01.一个上线的危机
    • 1.1 双 11 前的事故
    • 1.2 发版周期的瓶颈
    • 1.3 插件化的契机
  • 02.要解决的核心矛盾
    • 2.1 应用商店审核
    • 2.2 包体积的膨胀
    • 2.3 灰度回滚困难
    • 2.4 插件化的本质
  • 03.业界主流方案
    • 3.1 三种技术路线
    • 3.2 横向对比矩阵
    • 3.3 关键技术拆解
  • 04.插件化设计原则
    • 4.1 隔离优先原则
    • 4.2 兼容性原则
    • 4.3 安全性原则
  • 05.插件化方案落地
    • 5.1 整体架构设计
    • 5.2 类加载机制
    • 5.3 资源加载机制
    • 5.4 生命周期管理
    • 5.5 插件下发流程
  • 06.热修复方案落地
    • 6.1 类替换方案
    • 6.2 dex 替换方案
    • 6.3 资源修复方案
  • 07.常见陷阱与反例
    • 7.1 平台合规风险
    • 7.2 兼容性碎片化
    • 7.3 性能开销失控
  • 08.演进路线
    • 8.1 V1 远程配置
    • 8.2 V2 H5 容器
    • 8.3 V3 插件化
    • 8.4 V4 动态化框架
  • 09.总结与决策
    • 9.1 适用场景清单
    • 9.2 选型决策树

# 01.一个上线的危机

# 1.1 双 11 前的事故

某电商 App 在 2019 年双 11 前 3 天发现一个致命 Bug:优惠券计算在特定 SKU 组合下会算错金额,最严重的场景能用 1 元买 2000 元的商品。

按正常流程:

  • 修复代码 → 走灰度 → 全量发版 → 用户更新 → 至少 7 天

但双 11 还有 3 天就开始。如果不能在 24 小时内修掉这个 Bug,预计损失 8000 万。

# 1.2 发版周期的瓶颈

复盘一下传统发版到底有多慢:

gantt
    title 传统 App 发版周期
    dateFormat  HH:mm
    axisFormat  %H:%M
    
    section 开发
    修复 Bug         :done, fix, 00:00, 2h
    内部测试         :done, qa1, after fix, 4h
    
    section 发布
    提交应用商店     :done, submit, after qa1, 1h
    平台审核         :crit, review, after submit, 24h
    
    section 用户更新
    50% 用户更新到 7 天后
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

真正的卡点是审核 + 用户更新——开发改完只要几小时,但 iOS 审核 24 小时打底,用户主动更新到 50% 通常要 3-7 天。

# 1.3 插件化的契机

那个事故团队最终用 dex 热替换 在 6 小时内把修复推到了 80% 用户,避免了灾难。事后他们做了一个决定:将所有"营销玩法"模块插件化,未来这种紧急运营都不再依赖发版。

这就是插件化最朴素的诉求——把"必须发版"的成本降下来。

# 02.要解决的核心矛盾

# 2.1 应用商店审核

iOS 强制审核(24-48 小时),Android 各应用商店也有 4-24 小时不等的审核。在以下场景这成为致命瓶颈:

场景 时效要求 审核能否满足
紧急 Bug 修复 < 6 小时 ❌
春晚红包等活动 精确到小时 ❌
A/B 实验快速迭代 1 天 1 版 ❌
区域差异化运营 不影响其他区域 ❌

# 2.2 包体积的膨胀

App 功能越来越多,包体积也越来越大。某电商 App 从 2018 年的 35MB 涨到 2022 年的 180MB,用户首次下载流失率从 8% 涨到 23%。

graph LR
    A[全量功能打包] --> B[包体积大]
    B --> C[首次下载慢]
    C --> D[流失率高]
    
    A2[核心功能打包] --> B2[包体积小]
    B2 --> C2[首次下载快]
    B2 --> E[非核心功能<br/>按需下载插件]
    
    style D fill:#ffebee
    style E fill:#e8f5e8
1
2
3
4
5
6
7
8
9
10
11

插件化让"按需下载"成为可能:核心 App 只 30MB,其他功能用到时再拉。

# 2.3 灰度回滚困难

发版后想回滚,只能再发一版(又要审核)。但插件化方案下,回滚 = 把插件版本号从 1.2 改回 1.1,5 分钟全量生效。

# 2.4 插件化的本质

插件化 = 把"代码 + 资源 + 配置"从 App 里解耦出来,让它们可以独立下发、加载、卸载

它解决的是业务节奏和发版节奏之间的矛盾。

# 03.业界主流方案

# 3.1 三种技术路线

路线一:插件化框架(动态加载完整业务) 代表:DroidPlugin、VirtualAPK、Replugin、Shadow。把整个 Activity / Fragment / Service 打包成插件 apk,运行时动态加载。

路线二:热修复(动态替换有缺陷的代码) 代表:Tinker(微信)、Robust(美团)、Sophix(阿里)、AndFix。只能修复已有逻辑,不能新增功能。

路线三:动态化框架(用 DSL/JS 描述 UI 和逻辑) 代表:React Native、Flutter(with code push)、小程序、动态化布局(Tangram、Virtualview)。不动 Java/Kotlin 代码,只动 JS/DSL。

flowchart LR
    A[2014 插件化<br/>动态加载完整业务] --> B[2016 热修复<br/>修复已有 Bug]
    B --> C[2018 动态化<br/>跨端 + 高频迭代]
    
    style A fill:#e3f2fd
    style B fill:#e8f5e8
    style C fill:#fff3e0
1
2
3
4
5
6
7

每代方案的"动态能力"和"风险/复杂度"都不同。

# 3.2 横向对比矩阵

维度 插件化 热修复 动态化
能否新增功能 ✅ ❌ 只能修 ✅
能否修 Bug ⚠️(要替换整个插件) ✅ 首选 ⚠️(只修 JS 层)
iOS 是否可用 ❌ 违规 ⚠️ 灰色地带 ✅(RN/小程序合规)
包体积影响 减小(核心包) 增加 5-10MB 增加 RN/Flutter 引擎
首屏性能 首次有下载 无影响 首次有 JS 加载
接入成本 高 中 高
开发体验 与原生一致 与原生一致 JS / Dart / DSL
典型代表 Shadow / VirtualAPK Tinker / Sophix RN / Flutter / 小程序

# 3.3 关键技术拆解

无论哪种方案,核心都要解决三个技术问题:

mindmap
  root((插件化三大技术))
    类加载
      自定义 ClassLoader
      双亲委派改造
      多 dex 合并
    资源加载
      AssetManager 反射
      资源 ID 隔离
      公共资源共享
    生命周期
      Activity 代理
      Hook AMS
      Application 注册
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • 类加载:怎么让 App 能加载未知 apk 里的 class
  • 资源加载:怎么让插件里的图片、布局、字符串能用 R.id 引用
  • 生命周期:怎么让插件 Activity 能正常响应 onCreate / onResume

这三个问题决定了方案的"动态能力上限"。

# 04.插件化设计原则

# 04.1 隔离优先原则

插件出错不能拖死宿主。三层隔离:

层级 隔离手段 防什么
类隔离 独立 ClassLoader 类冲突
资源隔离 独立 AssetManager / 命名空间 资源 ID 冲突
进程隔离 多进程 崩溃影响主进程

# 4.2 兼容性原则

Android 碎片化严重,插件化方案要穿越多个版本。任何依赖 Hook 系统 API 的方案都要做版本适配,建议每年回归 Top 10 ROM。

# 4.3 安全性原则

插件 = 可执行代码下发,必须签名校验:

flowchart LR
    A[服务端打包插件] --> B[私钥签名]
    B --> C[CDN 分发]
    C --> D[App 下载]
    D --> E[公钥验签]
    E --> F{验签通过?}
    F -->|是| G[加载]
    F -->|否| H[拒绝并上报]
    
    style F fill:#fff3e0
    style H fill:#ffebee
1
2
3
4
5
6
7
8
9
10
11

否则一旦中间人攻击成功,攻击者就能往用户 App 里塞任意代码。

# 05.插件化方案落地

# 5.1 整体架构设计

graph TB
    subgraph "宿主 App"
        Host[宿主主进程]
        PM[插件管理器<br/>PluginManager]
        Loader[插件加载器]
        Bridge[宿主桥接层<br/>提供给插件的能力]
    end
    
    subgraph "插件下发服务"
        Server[插件服务端]
        CDN[CDN]
    end
    
    subgraph "插件运行时"
        P1[插件 A.apk]
        P2[插件 B.apk]
        P3[插件 C.apk]
    end
    
    Server --> CDN
    Host --> PM
    PM -->|查询版本| Server
    PM -->|下载| CDN
    PM --> Loader
    Loader --> P1 & P2 & P3
    P1 & P2 & P3 -->|调用宿主能力| Bridge
    
    style PM fill:#fff3e0
    style Bridge fill:#e8f5e8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 5.2 类加载机制

Android 默认双亲委派的 PathClassLoader 不能加载未知 apk 里的 class,所以需要自定义 ClassLoader 把插件 dex 路径告诉它:

class PluginClassLoader(
    dexPath: String,
    optimizedDirectory: File,
    parent: ClassLoader
) : DexClassLoader(dexPath, optimizedDirectory.absolutePath, null, parent) {
    
    override fun findClass(name: String): Class<*> {
        // 1. 先查插件自己的 dex
        try {
            return super.findClass(name)
        } catch (e: ClassNotFoundException) {
            // 2. 找不到再问宿主(共享类)
            return hostClassLoader.loadClass(name)
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

关键改造点:默认双亲委派会先问宿主,导致插件里和宿主同名的类被宿主"抢答"。自定义 ClassLoader 要让插件优先,但共享类(比如基础库)必须用宿主版本(避免内存里两份)。

# 5.3 资源加载机制

插件的 R.id 是独立编号,但 Android 的资源系统是按 packageId 索引的。两种主流做法:

方案 思路 代表
共用 AssetManager 把插件 apk 路径 addAssetPath 进宿主 AssetManager Replugin
独立 AssetManager 每个插件一个独立 AssetManager,访问时切换 VirtualAPK

共用方案性能更好但要解决资源 ID 冲突(aapt 修改 packageId);独立方案隔离彻底但访问插件资源要切换 Context。

# 5.4 生命周期管理

插件的 Activity 没有在 AndroidManifest 注册,系统不认识。两种主流 Hook 思路:

graph TB
    subgraph "方案A: 占坑 Activity (DroidPlugin)"
        Real[插件 RealActivity] -.伪装成.-> Stub[宿主预注册的 StubActivity]
        Stub -->|onCreate 时| Real
    end
    
    subgraph "方案B: Hook AMS (Shadow)"
        StartIntent[startActivity] -->|拦截| Hook[Hook AMS]
        Hook -->|改写为代理| Proxy[代理 Activity]
        Proxy -->|分发到| RealAct[插件 RealActivity]
    end
    
    style Stub fill:#fff3e0
    style Hook fill:#fff3e0
1
2
3
4
5
6
7
8
9
10
11
12
13
14

腾讯 Shadow 走得更彻底——完全无 Hook 方案:把插件 Activity 改成"普通类",由宿主代理 Activity 来分发生命周期。这个方案兼容性最好,是当前业界推荐方向。

# 5.5 插件下发流程

sequenceDiagram
    participant Dev as 开发
    participant Build as 构建系统
    participant Server as 插件服务
    participant App as 用户 App
    participant Sandbox as 沙箱测试
    
    Dev->>Build: 提交插件代码
    Build->>Build: 打包 apk + 签名
    Build->>Server: 上传插件包
    Dev->>Server: 创建灰度策略 (1% 用户)
    Server->>Sandbox: 内部沙箱验证
    
    App->>Server: 启动时拉取插件清单
    Server-->>App: 返回当前用户应加载的插件版本
    App->>App: 比对本地版本
    
    alt 需要更新
        App->>Server: 下载插件 apk
        Server-->>App: 返回 apk
        App->>App: 验签 → 解压 → 加载
    end
    
    App->>Server: 上报加载成功
    Server->>Server: 监控加载成功率, 异常自动回滚
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

关键点:

  • 灰度比例从 1% → 5% → 20% → 50% → 100% 阶梯放量
  • 加载失败自动上报,超过阈值(如 0.5%)自动停止灰度
  • 服务端可以一键"停发"任意版本,强制用户回退

# 06.热修复方案落地

# 6.1 类替换方案

代表:Robust。为每个方法都插入一个 patch 字段,发现需要修复时把 patch 类绑定上去:

// 编译期插桩后的代码
fun calculatePrice(...) {
    if (patch != null) {
        return patch.calculatePrice(...)  // 走修复版本
    }
    // 原有逻辑
}
1
2
3
4
5
6
7

优点:兼容性极好,立即生效。 缺点:包体积膨胀(每个方法都插桩)、不能改方法签名。

# 6.2 dex 替换方案

代表:Tinker、Sophix。把修复后的 class 和原 class 做 diff,生成补丁 dex,用自定义 ClassLoader 让补丁优先加载:

graph LR
    A[原 dex] --> B[diff 工具]
    C[修复后 dex] --> B
    B --> D[补丁 dex]
    D --> E[下发到 App]
    E --> F[ClassLoader 优先加载补丁类]
    
    style D fill:#e8f5e8
1
2
3
4
5
6
7
8

优点:能力强,可以新增字段、新增类。 缺点:需要重启 App 才生效(Android N 之前);某些 ROM 兼容性差。

# 6.3 资源修复方案

修复布局 / 图片 / 字符串,思路类似插件化的资源加载——把补丁包 addAssetPath 进 AssetManager,让补丁资源优先匹配。

# 07.常见陷阱与反例

# 7.1 平台合规风险

反例:某 App 用 dex 热修复在 iOS 上实现了"动态改业务逻辑",2016 年被苹果集体下架。

苹果规则:iOS 不允许下载可执行代码(除非是 JS / WebView 内)。这意味着插件化 + dex 热修复在 iOS 完全不可行,只能走动态化(RN / Flutter / 小程序)这条路。

Android 国内市场也在收紧:华为 / 小米等应用商店 2021 年后陆续禁止"频繁动态下发代码",违规会被下架处理。

# 7.2 兼容性碎片化

反例:某团队用了一个 Hook 系统 AMS 的插件化方案,每年新 Android 版本发布后都要紧急修复,3 年内累计花了 200+ 人日做兼容。

教训:任何依赖 Hook 私有 API 的方案都有版本债务。优先选择"无 Hook"或"只 Hook 公开接口"的方案(如 Shadow)。

# 7.3 性能开销失控

反例:某 App 把首页全部改成动态化,启动时要下载 + 解析 6MB JS Bundle,冷启动时间从 1.2s 涨到 3.5s,DAU 下跌 6%。

教训:动态化和插件化都有"加载成本"。核心路径(启动、首页、登录)千万不要做动态化,除非有完善的预加载和缓存方案。

mindmap
  root((三大常见陷阱))
    平台合规
      iOS 直接禁止
      Android 商店收紧
      违规被下架
    兼容性
      ROM 碎片化
      系统版本差异
      Hook 不稳定
    性能开销
      首次加载慢
      解析耗时
      内存占用大
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 08.演进路线

大多数团队不会一开始就上重型插件化方案,而是从轻到重渐进。

# 8.1 V1 远程配置

做了什么:服务端下发 JSON 配置(如开关、文案、URL),App 启动时读取并应用。

能解决:

  • 紧急关闭某个功能
  • 替换文案 / 图片
  • 切换接口环境

不能解决:业务逻辑改动、新增页面

适用阶段:所有 App 都应该有

# 8.2 V2 H5 容器

做了什么:把营销活动、运营页面用 H5 实现,App 提供 WebView 容器。

能解决:营销活动 0 发版上线、跨端共用一套页面

不能解决:性能要求高的核心页面(H5 体验差)

适用阶段:业务需要高频运营活动

# 8.3 V3 插件化

做了什么:把"非核心 + 高频迭代"的业务做成插件(如某个节日玩法、某个新业务试水)。

能解决:动态新增完整业务、按需下载减小包体积

典型方案:Shadow(推荐)、VirtualAPK、Replugin

适用阶段:DAU 千万级 + 业务高速扩张期

# 8.4 V4 动态化框架

做了什么:核心业务也用动态化方案重写(RN / Flutter with code push)。

能解决:跨端开发提效、核心业务也能动态更新

适用阶段:跨端团队 + 业务变化极快

flowchart LR
    V1[V1 远程配置<br/>所有 App 都有] --> V2[V2 H5 容器<br/>有运营需求时]
    V2 --> V3[V3 插件化<br/>大型 App 业务扩张期]
    V3 --> V4[V4 动态化<br/>跨端 + 极速迭代]
    
    style V1 fill:#e3f2fd
    style V2 fill:#e8f5e8
    style V3 fill:#fff3e0
    style V4 fill:#f3e5f5
1
2
3
4
5
6
7
8
9

⚠️ 不是每个团队都需要走到 V3 / V4。一个内部工具 App 长期停在 V1 完全合理。

# 09.总结与决策

# 9.1 适用场景清单

✅ 该用插件化的场景:

  • DAU 千万级 + 高频运营活动(电商、内容、社交)
  • 业务模块差异巨大需要按需下载(金融、超级 App)
  • 紧急 Bug 修复时效要求 < 24 小时

❌ 不该用插件化的场景:

  • 团队 < 30 人,自身代码量不大
  • 主战场是 iOS(合规风险)
  • 性能敏感的核心路径(启动、首页)
  • 团队没有专人维护框架(一旦遇到 ROM 兼容问题没人解)

# 9.2 选型决策树

flowchart TD
    Start([我需要"动态更新"能力吗?]) --> Q1{是否上线后<br/>就不太需要变?}
    Q1 -->|是| Skip[不需要插件化<br/>正常发版即可]
    Q1 -->|否| Q2{只是配置或文案?}
    
    Q2 -->|是| Config[V1 远程配置]
    Q2 -->|否| Q3{只是营销活动?}
    
    Q3 -->|是| H5[V2 H5 容器]
    Q3 -->|否| Q4{需要新增完整业务?}
    
    Q4 -->|是| Q5{主要是 iOS 还是 Android?}
    Q5 -->|iOS 为主| RN[V4 动态化<br/>RN / 小程序]
    Q5 -->|Android 为主| Q6{紧急修 Bug 优先?}
    
    Q6 -->|是| HotFix[热修复<br/>Tinker / Sophix]
    Q6 -->|否| Plugin[V3 插件化<br/>Shadow]
    
    Q4 -->|否| HotFix
    
    style Skip fill:#e3f2fd
    style Config fill:#e8f5e8
    style H5 fill:#fff3e0
    style Plugin fill:#ffebee
    style RN fill:#f3e5f5
    style HotFix fill:#ffebee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

最后一句话:插件化是一把双刃剑——它能让你 6 小时止损 8000 万损失,也能让你为兼容性问题熬 3 年夜。只有当"不发版的成本"远高于"维护框架的成本"时,它才是好方案。

好的插件化 = 关键时刻能救命,平时不会要命。

上次更新: 2026/06/07, 10:26:12
组件化方案的设计
SDK设计与发布方案

← 组件化方案的设计 SDK设计与发布方案→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式