上篇高级聊完OkHttp和LeakCanary源码,这篇进入美团资深。资深面试考工程化能力——"美团的组件化怎么做的?热修复用什么方案?多渠道打包怎么处理几万个渠道?"
美团在工程化方面走在行业前列——组件化方案影响了整个Android社区,Walle多渠道打包支持几万个渠道,Robust热修复被大量公司参考。资深Android要能主导这类工程化项目。
今天8道题覆盖美团资深核心考点。
Q1:美团的组件化方案怎么做的?
核心思路:把App拆成独立模块(组件),每个组件可独立编译、运行、测试。组件间通过接口通信不直接依赖。
分层:基础层(网络/图片/日志)→ 通用组件层(登录/分享/支付)→ 业务组件层(外卖/到店/酒旅)→ 壳工程(App壳,聚合所有组件)。
组件间通信:接口下沉——每个组件对外暴露API模块(如login-api),其他组件依赖API模块不依赖实现。运行时通过ServiceLoader/路由查找实现。
资源隔离:每个组件独立res目录。组件间资源不互相引用。资源前缀区分(如meituan_login_bg避免冲突)。
追问:组件化和模块化有什么区别?模块化是代码层面的拆分(多Module),组件化是功能层面的拆分(每个组件可独立运行)。组件化的模块可以单独打包成App测试,模块化的Module不行。
Q2:美团的热修复方案?
美团早期用Tinker(微信开源),后来自研了Robust。
Robust原理:编译期在每个方法入口插入一段代码——检查有没有补丁方法,有就调补丁方法跳过原方法。补丁方法是运行时加载的dex。
优势:即时生效(不用重启),不依赖ART内部实现(兼容性比Sophix好),支持新增方法/新增类。
劣势:每个方法插入检查代码,包大小增加约10-15%。性能略有影响(每个方法多一次判断)。
追问:Robust和Tinker/Sophix怎么选型?Tinker:dex级替换,需重启,补丁体积小。Sophix:ART方法入口替换,即时生效但兼容性依赖Android版本。Robust:代码插入检查,即时生效兼容性好但包大小增加。大厂自研(Robust),中小公司用Tinker/Sophix。
Q3:美团的跨进程通信方案?
美团App是多进程架构——主进程+推送进程+下载进程。进程间通信需要统一方案。
MTG(Meituan Transport Gateway):自研的跨进程通信框架。基于AIDL封装——自动生成客户端/服务端代码,开发者只定义接口。支持回调(服务端主动通知客户端)、超时控制、断线重连。
和原生AIDL区别:AIDL要手动写Stub/Proxy、处理进程死亡重连、管理Binder线程池。MTG把这些封装了,开发者像调本地方法一样调远程方法。
追问:多进程架构有什么注意事项?SharedPreferences不能跨进程共享(用MMKV的MULTI_PROCESS_MODE)。Application每个进程都创建一次(用进程名判断是否主进程初始化)。数据库多进程访问要加锁或用ContentProvider。
Q4:多渠道打包怎么做的?
美团有几万个渠道(各应用市场+推广渠道),传统打包方式(每个渠道单独编译)太慢。
Walle(美团开源方案):APK签名块(APK Signing Block)写入渠道信息。打包时复制APK文件,只修改签名块里的渠道标识。不需要重新编译——几万个渠道几分钟打完。
原理:APK签名块位于ZIP Central Directory和End of Central Directory之间。Android系统校验签名时跳过这个块。Walle在这个块里写入自定义键值对(channel=huawei),App运行时读取。
读取渠道:App启动时解析APK的签名块,提取channel字段。用于统计各渠道的新增/留存/付费数据。
追问:Walle和传统多渠道打包什么区别?传统方案(productFlavors)每个渠道重新编译签名——100个渠道打100次包,耗时几小时。Wale只复制文件改签名块——1万个渠道几分钟。但Wale只支持渠道标识,不同渠道需要不同代码/资源时还是得用productFlavors。
Q5:组件化的编译和调试怎么做?
独立运行:每个组件配一个壳工程(如login-shell),壳工程依赖组件模块。开发时运行壳工程,只编译当前组件——编译速度大幅提升。
组件切换:通过Gradle开关控制组件是作为Application独立运行还是Library集成到主工程。isComponent=false时作为Library被壳工程聚合。
调试:组件独立运行时可以单独调试。联调时主壳工程依赖所有组件的Library模式。Android Studio的Attach Debugger可以调试组件代码。
CI/CD:每个组件独立CI——代码提交触发组件的单元测试和Lint检查。主工程CI聚合所有组件的产物打包APK。组件发版走Maven仓库(AAR)。
Q6:组件间路由怎么设计?
路由框架选型:美团自研路由(类似ARouter)。每个页面用注解标记路由路径,编译期APT生成路由表。
路由表:Map<String, Class<?>>,key是路径(如"/order/detail"),value是Activity类。跳转时Router.navigate("/order/detail", params)查路由表找到目标类startActivity。
拦截器:路由跳转前可以加拦截器——登录拦截(未登录跳登录页)、降级拦截(低版本跳H5)、AB实验拦截(实验组跳新页面)。
追问:路由框架和Deep Link什么关系?Deep Link是系统级跳转(从浏览器/短信跳App),路由框架是App内页面跳转。实际结合用:Deep Link进来先URL解析,再调路由框架跳转具体页面。
Q7:Gradle插件开发怎么入门?
自定义Plugin:实现Plugin<Project>接口,在apply(project)里添加Task或配置。通过buildSrc或发布到Maven仓库供项目使用。
常见用途:自动注册路由表(扫描@Route注解生成代码)、多渠道打包(修改渠道信息)、代码检查(自定义Lint规则)、包大小监控(统计每个模块的APK增量)。
Transform API:在编译期修改字节码。遍历所有class文件,对匹配的class做修改(如插入监控代码)。Robust热修复就是基于Transform API实现的。
追问:Gradle插件怎么调试?gradlew --debug看详细日志。或在Plugin里打断点,Android Studio用Remote Debug连接Gradle Daemon(默认端口5005)。
Q8:工程化面试怎么准备?
展示项目经验:讲你做过的工程化改进——"我主导了组件化拆分,把单体工程拆成12个组件,编译时间从8分钟降到2分钟"。数据说话。
展示技术深度:能讲清楚方案选型理由——"选Robust不选Tinker因为我们需要即时生效,选Robust不选Sophix因为兼容性要求高"。
了解行业实践:美团技术博客(tech.meituan.com)有很多工程化文章,面试前读几篇了解美团的实践细节。
面试Tips:美团资深组件化考分层设计和资源隔离。热修复考Robust原理(编译期插入代码)和方案对比。多渠道考Walle原理(APK签名块写入)。路由考拦截器设计。Gradle考Plugin开发和Transform API。准备美团面试强烈推荐读美团技术博客——很多面试题直接来自他们的实践文章。
下一篇进入美团架构师——美团外卖架构、高并发场景、多团队协作、技术债务治理。
做过组件化的同学评论区聊聊,你们项目拆了多少个组件?
本系列连载中,关注不迷路,下一篇:美团Android架构师面试真题
系列简介:Android大厂面经连载,覆盖字节跳动、腾讯、阿里、美团等40+企业,从初级到架构师全岗位覆盖。每篇文章包含真实面试题+详细答案+代码示例,帮你拿到大厂Offer。