字节跳动 张明庆 面向国际化业务的 Android 组件开发框架

CodeWarrior

2019/07/08 发布于 编程 分类

GIAC2019 

文字内容
1. 面向国际化业务的 Android 组件开发框架 张明庆 字节跳动 Android高级工程师
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%
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. 高高山顶立 深深海底行 站在山上做架构 深入海底去践行 反复的上山和下海才能最终成功
47. 关注msup微信公众账号 关注高可用架构公众账号 获取更多技术实践干货 改变互联网的构建方式