360手机卫士的基础之一:插件化方案漫谈

2020-02-27 288浏览

  • 1.360⼿手机卫⼠士
 插件化漫谈 张炅轩/360⼿手机卫⼠士
  • 2.张炅轩 (Zhang Jiongxuan) • 出⽣生:1988年年 • 邂逅编程:9岁 • 360司龄:6年年 • 发明:83件(国内外) • 360⼿手机卫⼠士·主程序框架组
  • 3.为什什么要做 插件化
  • 4.共同的挑战 • 发布不不灵活 • 软件包过⼤大 • 模块不不够独⽴立 数亿⽤用户级别
  • 5.前赴后继
  • 6.AndroidDynami cLoader类 Dynamic-LoadApk类 Atlas/ACDD类 DroidPlugin类 雏形 代码 + 资源 (Fragment) 2012 代理理 代码 + 资源 2014 模块化 代码 + 资源 + 固定组件 2014 独⽴立可发布 代码 + 资源 + 坑位组件 2015
  • 7.2013 卫⼠士插件化框架诞⽣生
  • 8.都百花⻬齐放了了
  • 9.⽤用得不不多 边缘化
  • 10.担⼼心
  • 11.担⼼心 1. 不不够稳定 2. 不不够灵活 平衡
  • 12.稳定 灵活 灵活,但不不够稳定 稳定,但不不够灵活 怎么办?
  • 13.担⼼心 1. 不不够稳定 2. 不不够灵活 3. ⼤大项⽬目才⽤用 平衡
  • 14.2014 卫⼠士完整占坑⽅方案发布
  • 15.2016 核⼼心功能“皆为插件”
  • 16.数亿台 设备使⽤用
  • 17.我们 是怎么做到的
  • 18.不不破不不⽴立 1. “不不够稳定”怎么破 2. “不不够灵活”怎么破 3. “⼤大项⽬目才⽤用”怎么破
  • 19.“不不够稳定”的原因 究竟是?
  • 20.Hook了了太多 (修改关键API)
  • 21.Hook了了太多 • ActivityThread (AMS) • Instrumentation • System-Services • PackageManager • ContextImpl • Resources • …… X Android 升级? ROM 修改? 使⽤用不不当?
  • 22.我们要 Hook-Less!
  • 23.Hook-Less • ActivityThread (AMS) (X) • Instrumentation (X) • System-Services (X) • PackageManager (X) • ContextImpl (X) • Resources (X) • …… (X) 只Hook了了⼀一处 (√)
  • 24.只Hook了了⼀一处?
  • 25.ClassLoader
  • 26.⼀一 唯 ClassLoader Application.mBase.mPackageInfo.mClassLoader ↓↓↓ new HostClassLoader()
  • 27.loadClass 原⽣生的 loadClass() • Activity • PitManager • Service • HookingClassManager • Content Provider • …… • Broadcast Receiver • Hooking Class • …… 我们的 → Plugin
  • 28.Dex呢? 资源呢?
  • 29.⽣生 原 DexClassLoader mPath = getPluginApkPath();
 String out = mContext.getDir(ODEX_DIR, 0).getPath();
 ClassLoader p = getClass().getClassLoader().getParent();
 mClassLoader = new DexClassLoader(mPath, out, …, p);
  • 30.⽣生 原 Resources mPackageInfo = pm.getPackageArchiveInfo(mPath, …); ApplicationInfo ai = mPackageInfo.applicationInfo; mPkgResources = pm.getResourcesForApplication(ai);
  • 31.⽣生 原 Context (宿主) // Nothing
  • 32.插件的Context呢?
  • 33.k o o H ⾮非 PluginContext mPlgContext = new PluginContext(…)
  • 34.Resources XXX Activity Dex
 ClassLoader Plugin
 Context XXX Service XXX …… Application Context PluginContext 插件组件之⺟母
  • 35.getClassLoader() 插件的原⽣生 DexClassLoader getResources() 插件的原⽣生 Resources getAssets() Resources.Assets getSystemService() 修改LayoutInflater的Factory startService()/bindService()/.. 全新Service⽅方案 getSharedPreferences() 重定向到插件⽬目录 File Operations 重定向到插件⽬目录 getApplicationContext() 插件的 Application 对象 … …
  • 36.稳定的奥秘 • Hook⼀一处:宿主ClassLoader • DexClassLoader → 原⽣生 • Resources → 原⽣生 • PluginContext → ⾮非Hook • 坚持原则!
  • 37.稳定的 坚持原则
  • 38.框架崩溃率 究竟如何呢
  • 39.万分之⼀一 0.01% 框架崩溃率
  • 40.0 因Hook导致崩溃量量
  • 41.数亿台 0.01% 设备使⽤用 框架崩溃率(万分之⼀一) 很稳定 1 0 Hook点 因Hook导致崩溃量量
  • 42.不不破不不⽴立 1. “不不够稳定”怎么破 2. “不不够灵活”怎么破 3. “⼤大项⽬目才⽤用”怎么破
  • 43.“不不够灵活”的表现 主要有?
  • 44.不不够灵活 • 插件组件增改 (X) • 新插件直接⽤用 (X) • 主程序不不发版 (X) 我们要 • ⾃自由设置进程 (X) ⾃自由! • 各特性随⼼心⽤用 (X) • 还得很稳定! (X)
  • 45.有我就灵活 • 插件组件增改 (√) • 新插件直接⽤用 (√) • 主程序不不发版 (√) • ⾃自由设置进程 (√) • 各特性随⼼心⽤用 (√) • 还得很稳定! (√)
  • 46.⼀一年年前的主程序 ⽆无需升级
 也能⽀支持 新增 的“四⼤大组件” 
 甚⾄至,新插件
  • 47.Component Pit
 Manager 全新坑位⽅方案
  • 48.⾮非坑位 vs 坑位XXXActivity ⾮非坑位⽅方案(⼀一⼀一对应关系)XXXActivity YYYActivity 坑位⽅方案(租赁关系)
  • 49.Activity
  • 50.Activity坑位⽅方案 Hook ⾮非Hook . Hook ⾮非Hook 原⽣生 Hook Hook 原⽣生 Hook ⾮非Hook ) () ) ) ) . context.
 startActivity(Nx) PluginContext.
 startActivity . classloader.
 loadClass(XXX)
  • 51.Activity坑位的分层 STANDARD SINGLE TASK FULL SCREEN
  • 52.Activity坑位的分层 STANDARD SINGLE TASK FULL SCREEN SINGLE INSATNCE
  • 53.Activity坑位的分层 STANDARD SINGLE TASK FULL SCREEN SINGLE INSATNCE
  • 54.Activity坑位的分层 • 分层 → ⽀支持度 • 坑位 → 稳定
  • 55.同时⽀支持 Task Affinity 分层坑位
  • 56.完整Activity插件⽅方案 = 分层 + 坑位
  • 57.Service
  • 58.Service⽅方案 Hook Hook Hook 借助 Hook 核⼼心 Hook ( ( ( 调⽤用进程 ) ) ( (. ) ) ) ⽬目标进程 (
  • 59.架构图
  • 60.PLUGINS Exam Cleanner LockScreen Floating Window Antivirus (80+) BASE PLUGINS WebView Downloader Protobuf Share PLUGIN FRAMEWORK PMF Faster-Sync AIDL Plugin Activity Plugin Context Component Pit Manager Host ClassLoader Process Manager Verifier Plugin Service Client Plugin Provider Client Application Package Manager ANDROID Context ClassLoader Intent Application Info Resources Android OS
  • 61.为了了稳定 & 灵活 X • 插件Activity → PluginActivity • 插件Service → stopSelf的重定向 • 插件ContentResolver → 各⽅方法的重定向
  • 62.动态编译⽅方案
  • 63.插件 动态编译 APK 单品
  • 64.动态编译⽅方案 ./ ( )) )) Activity stopSelf() CResolver.query() PluginActivity JavaAssist
 (Gradle) PSC.stopSelf() PPC.query()
  • 65.(X) 改Code? 改⼏几句句Gradle即可
  • 66.还有很多 • 静态Receiver ★ • 多进程坑位 ★ • Service & Provider & App • IPC(跨进程通信) • TaskAffinity & Theme • ⼀一⾏行行获取宿主/插件接⼝口 • SO库随⼼心⽤用 • ……
  • 67.最严峻的挑战
  • 68.
  • 69.
  • 70.
  • 71.⼏几乎所有的特性 (√)
  • 72.灵活的秘诀 • 复杂的“全新坑位⽅方案”
 (基于仅1 Hook点⽽而设计) • 多进程、静态Receiver等 • ⽀支持20+特性 • • 动态编译⽅方案
 (免开发者修改) 完美运⾏行行“Launcher”!
  • 73.稳定
  • 74.稳定 灵活 平衡,我们的答案
  • 75.不不破不不⽴立 1. “不不够稳定”怎么破 2. “不不够灵活”怎么破 3. “⼤大项⽬目才⽤用”怎么破
  • 76.⼤大项⽬目才⽤用? 结 终 • 插件 = 免安装应⽤用 • 基础在主程序⾥里里,放⼼心 • 迁移成本⾼高
  • 77.定位
  • 78.免安装应⽤用? 全⾯面插件化? 组件解耦化?
  • 79.全⾯面插件化 不不跑“微信” 不不做重打包
  • 80.全⾯面插件化 1. ⾃自由、独⽴立发布 2. 应⽤用“积⽊木”化 3. 宿主/插件交互⽅方便便
  • 81.596 年年发版次数
  • 82.2 平均每天
  • 83.卫⼠士⾸首⻚页
  • 84.清理理加速
  • 85.欺诈拦截 (+ 后台服务)
  • 86.来电秀
  • 87.智能悬浮窗
  • 88.今⽇日爆点 商业化
  • 89.安全WebView (基础插件)
  • 90.分享 (基础插件)
  • 91.桌⾯面插件 (可下载)
  • 92.
  • 93.甚⾄至 • 常驻服务 • Push服务 • 帐号中⼼心 统统
 • 下载服务 都是插件 • Protobuf • 各后台服务
  • 94.应⽤用“积⽊木化”
  • 95.完美·复⽤用
  • 96.兼容到 2014 年年的主程序
  • 97.102 插件数
  • 98.57 核⼼心 + 基础插件
  • 99.596 102 年年发版次数 插件个数 全⾯面插件化 57 积⽊木化 核⼼心+基础插件 应⽤用
  • 100.对⽐比
  • 101.Dynamic-Load-Apk Atlas/ACDD DroidPlugin 卫⼠士Plugin 不不改主程序 Manifest 不不⽀支持 部分⽀支持 ⽀支持 ⽀支持 插件与宿主交互 ⼀一般 容易易 较复杂 容易易 插件接⼊入成本 ⼀一般 ⼀一般 ⽆无成本 很低
 (编译期) Hook量量 很少 很少 很多 很少,只有⼀一处 UI插件所处进程 (性能 / 独⽴立性) 单进程 单进程 多进程 单进程 & 进程坑位 应⽤用免安装 独⽴立发布
 全⾯面插件化 场景 简单插件 组件解耦化
  • 102.数亿台 596 设备使⽤用 年年发版次数 102 57 插件个数 核⼼心+基础插件 0.01% 83% 框架崩溃率(万分之⼀一) 插件占应⽤用⽐比 1 2014 Hook点 完整坑位⽅方案发布
  • 103.One More Thing…
  • 104.离不不开 360⼿手机卫⼠士专家们的付出
  • 105.离不不开 各位接⼊入⽅方的宝贵建议
  • 106.2014
  • 107.2015
  • 108.2016
  • 109.2017.Q2
  • 110.
  • 111.“我们很快将全部改⽤用你们的!” –360 ⼿手机助⼿手团队
  • 112.
  • 113.2017.Q2
  • 114.15 接⼊入App
  • 115.更更有价值 如何让这套插件化框架变得
  • 116.SDK ?
  • 117.更更有价值 如何让这套插件化框架变得
  • 118.开源 RePlugin 献给Android世界的最好礼物
  • 119.⻜飞⼊入寻常 百姓家
  • 120.如何找到我们 • GitHub • 🔍 → [RePlugin] • 及时关注进展 • 预计 → 7⽉月
  • 121.如何关注? 1. [Star],给我们⿎鼓励 2. [Watch],及时关注 3. 发布 → 邮件 4. 我们 → 持续改进
  • 122.两种选择
  • 123.Open Source
 SDK
 社区版 旗舰版 ⼠士 卫 提供各核⼼心功能 社区版所有特性 插件安装与使⽤用 插件发布、差量量更更新
 (360云服务提供⽀支持) 四⼤大组件与各特性
 (独⽴立发布 & 全⾯面插件化) 20+ ⾼高质量量基础插件 进程管理理 优先技术⽀支持 其它框架特性 和360⼿手机卫⼠士⽤用⼀一套 动⼿手,时间富裕 ⼤大部分项⽬目 的
  • 124.应⽤用“积⽊木化”
  • 125.⼀一起创造 更更⾼高的价值,让我们
  • 126.THANKS! Zhang Jiongxuan(张炅轩) @ 360⼿手机卫⼠士 · 主程序开发团队