字节跳动 张明庆 面向国际化业务的 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微信公众账号 关注高可用架构公众账号 获取更多技术实践干货 改变互联网的构建方式