字节跳动 张明庆 面向国际化业务的 Android 组件开发框架
2020-03-01 395浏览
- 1.面向国际化业务的 Android 组件开发框架 张明庆 字节跳动 Android高级工程师
- 2.
- 3.张明庆 字节跳动 Android架构师 ・毕业于浙江大学和中科院 ・14年毕业,先后在网易、得到等工 作 ・18年加入字节跳动,目前负责火山 小视频 Android 端架构和性能优 化工作。 ・组件化开源项目 DDComponent 作者
- 4.目录 1.国际化业务的挑战 2.模块化拆分的新姿势 3.插件化 与 Android App Bundle 4.不同模式的无缝切换 5.总结
- 5.国际化的挑战
- 6.国际化业务 150+ 国家和地区;TikTok 连续五个季度(App Store)下载量最高
- 7.臃肿的代码
- 8.混乱的依赖
- 9.世界不同地区 APK 大小 在亚洲和非洲地区平均包大小在5M左右 统计发现降低10M体积,转化率至少提升2.5%
- 10.
- 11.整体架构图
- 12.模块化拆分的新姿势
- 13.模块化的技术点 ・分层解耦 ・服务发现与注册 ・UI跳转-路由表 ・单独编译与调试 ・组件集成-切换源码和 AAR ・…
- 14.组件化的架构图
- 15.模块化拆分的新姿势 模块化通信
- 16.模块通信新姿势: 服务发现 -> 依赖注入 服务注册(Host) 服务发现
- 17.服务发现传统方式
- 18.要解决的问题 1、服务发现应该是被动的 2、服务的依赖顺序 3、懒加载 4、无感知的注入 5、线程安全 6、编译耗时 or 运行时反射耗时
- 19.Dagger
- 20.Dagger 被动:使用方不关系谁提供服务,何时提供,甚至不知道中 央路由的存在 依赖顺序:只需要在构造器中声明依赖就可以,不关心顺序 无感知的注入:基本无感知;即使对于 Activity/ Fragment 也是如此
- 21.Dagger 线程安全和懒加载:天然支持 耗时:没有Transform 和反射
- 22.Dagger 依赖树结构
- 23.模块化拆分的新姿势 UI跳转-路由表
- 24.Intent跳转的N宗罪 ❏ 直接引用LoginActivity.class,导致耦合 ❏ 构建 Intent 和从 Intent 中获取参数都是 胶水代码 ❏ 不利于三端(Android/ios/H5)统一 ❏ 传入参数的key硬编码,并且定义随意 ❏ 传入参数没有类型校验 ❏ 没有区分必传参数和非必传参数
- 25.Router跳转不是最优解 ❏ 直接引用LoginActivity.class,导致耦合 ❏ 构建 Intent 和从 Intent 中获取参数都是 胶水代码(使用注解) ❏ 不利于三端(Android/ios/H5)统一 ❏ 传入参数的key硬编码,并且定义随意 ❏ 传入参数没有类型校验 ❏ 没有区分必传参数和非必传参数
- 26.路由表-简洁可靠 ❏ 直接引用LoginActivity.class,导致耦合 ❏ 构建 Intent 和从 Intent 中获取参数都是 胶水代码(使用注解) ❏ 不利于三端(Android/ios/H5)统一 ❏ 传入参数的key硬编码,并且定义随意 ❏ 传入参数没有类型校验 ❏ 没有区分必传参数和非必传参数
- 27.路由表的生成 ❏ 路由表的生成依赖于注解的 解析 ❏ 但不能简单的使用 APT ❏ 并行编译,APT 需要所有类 都存在
- 28.路由表的生成 ❏ 将路由表的生成提前到每个 module config 完成之后 ❏ 不要求编译通过 ❏ 使用 TreePathScanner/KtFile 来 解析 Java 和 Kotlin 类 ❏ 使用 javapoet 生成路由表类
- 29.插件化与 Android App Bundle
- 30.国内-插件化
- 31.App Bundle 是什么
- 32.依赖关系 和组件化相反的依赖关系
- 33.多种模式 无缝切换
- 34.三种状态 切换
- 35.从组件到插件
- 36.从插件到 App Bundle
- 37.举例
- 38.统一状态接口 状态名称 插件 aab UNKNOWN 未知状态 未知状态 PENDING 待下载 待下载 REQUIRES_USER_CONFIRMATION 无 插件超过10M需要用户确认 DOWNLOADING 下载中 下载中 DOWNLOADED 下载完成 下载完成 INSTALLING 安装中 安装中 INSTALLED 安装完成 安装完成 FAILED 失败 失败 CANCELING 无 取消中 CANCELED 无 取消完成
- 39.其他问题 资源混淆 ・修改 AndResGuard,支持 AAB格式 模拟测试 ・本地App mock GP 的交互,提供各种状态 ・bundletool 本地出包测试 字节码处理 ・minfyEnable 或者 multidex ・debug 下使用 buildSrc 同名替换
- 40.架构是一个生态
- 41.总结
- 42.问题回顾 代码臃肿 ・服务于 150+ 国家,语言包、so、icon、登录、sdk ・编译慢 10min+= 依赖混乱 ・动一发而牵全身,拖慢整个迭代进度 ・错误传递,bug 蔓延 包体积太大 ・印度、非洲、南美等国家网络差,平均 5M+ ・每下降10M,转化率提升 2.5% +
- 43.整体架构图
- 44.重点回顾 国际化的挑战 代码庞杂 模块化的原则 服务发现 依赖注入 Dagger 路由表 包体积 插件化 Android App Bundle 无感知的切换 适配层 中间状态 恶化检查 效率提升 配套工程
- 45.高高山顶立 深深海底行 站在山上做架构 深入海底去践行 反复的上山和下海才能最终成功
- 46.
- 47.关注msup微信公众账号 关注高可用架构公众账号 获取更多技术实践干货 改变互联网的构建方式