58同城 赵路平 - 58同城Android客户端Walle框架演进与实践之路

谯香彤

2017/12/18 发布于 技术 分类

随着团队和APP的增大,lib库过多、依赖太复杂、编译速度变慢都会成为开发中的痛点。本次分享58同城android客户端整体框架的演进过程(hybrid-插件化-组件化),并重点介绍Walle框架在组件化方面的实践,以及在组件化基础上对编译速度的优化提升。

文字内容
1. 58同城Android客户端框架演进与实践 赵路路平
2. ⽬目录 框架演进历程 PART 01 组件化实践 PART 02 保障平台与规划 PART 03
3. PART 01 框架演进历程
4. 演进图 2012 2014 快速占领市场,速度 纯Native 回归体验,满⾜足灵活 部分动态化 2016 可维护性,开发效率 Walle框架成型 快速发展,迭代快 Hybrid模式 2013 AllInApp,⼤大平台,并⾏行行开发 插件框架 4 2015
5. 纯Native ✦ 模块拆分 ✦ 基础组件 ✦ 快速搭建框架 主模块 房产 ⼆二⼿手 业务代码 招聘 … 公共代码 network image map SDK …
6. Hybrid模式-框架 ✦ 业务迅速迭代 业务代码 主程序 详情⻚页 列列表⻚页 运营⻚页 … ✦ 线上修复能⼒力力强 动态框架 WebView (html js css) UIWidget Cache 公共代码 network image map SDK …
7. Hybrid模式-实践 ✦ 加载⻚页⾯面速度慢? 1. 缓存(html、js、css、image) 2.3 ContentProvider 2. 并⾏行行加载 3.0 shouldInterceptRequest (WebView view, String url) 5.0 shouldInterceptRequest (WebView webView, WebResourceRequest webResourceRequest) ParcelFileDescriptor AssetFileDescriptor WebView Thread(pipe) Thread(pipe) Thread(pipe) 图⽚片服务器器 SDCARD
8. Hybrid模式-实践 ✦ 如何管理理缓存⽂文件(版本号、超时间)? 1. ⽂文件名? 2. 数据库表? 3. 放在⽂文件内容中 key version time 把内容转换成固定字节,保存到⽂文件头中,如下图 value 0.0.1 2017-6-9 10:12:00 标识 map⻓长度 key1⻓长度 … …。。 key1值 val1⻓长度 … val1值 key2⻓长度 ….. 读取时: client WapperStream InputStream scared
9. 部分动态化 ✦ 提升⽤用户体验 业务代码 主程序 详情⻚页 列列表⻚页 运营⻚页 … ✦ 保留留了了动态部署能⼒力力 动态框架 动态配置 模板管理理 hybrid Cache 公共代码 network image map SDK …
10. 插件化 ✦ 并⾏行行开发能⼒力力 ✦ 动态升级能⼒力力 主程序 业务代码 房产 分享 招聘 登录 定位 公共代码 动态模板 network image web+native map 记加班 … SDK 插件机制 os ActivityProxy+Context隔离 HOOK
11. 插件化-实践 ✦ 进程问题? A ⼀一个插件⼀一个进程 会出现进程数膨胀问题, 不不可接受 ? B 固定进程数 主业务间有依赖关系, 不不能杀死进程 C 合并单⼀一进程 会引起单例例问题,⽐比如 引⼊入Fresco时资源混乱
12. 插件化-实践 ✦ 代码共⽤用问题? 1. 单例例问题 不不共⽤用代码 Manager Context Manager Context1 Manager Context2 PathClassLoader DexClassLoader1 DexClassLoader2 主APP Manager.class 插件1 Manager.class 插件2 Manager.class Manager Context 共⽤用代码 PathClassLoader DexClassLoader1 DexClassLoader2 主APP Manager.class 插件1 插件2 2. apk包增⼤大 3. 插件之间交互变复杂之后联调成本增加
13. PART 02 组件化实践
14. 开发周期 开发期 并⾏行行开发 提升开发效率 运⾏行行期 提⾼高运⾏行行效率 按需加载 运维期 动态升级
15. Walle框架结构 ✦ 并⾏行行开发能⼒力力 ✦ 降低依赖层次 ✦ 提升编译速度 ⾸首⻚页 房产 分享 登录 招聘 定位 grade plugin ROUTE WALLE web+native network … image multidex 记加班 保障 平台 插件机制
16. 路路由中⼼心 ✦ 为什什么要有路路由中⼼心? 房产 路路由中⼼心 ⼆二⼿手 招聘 ⽅方法调⽤用 ⻚页⾯面跳转 事件总线 1. 代码和资源解耦,⽅方便便组件维护 2. 编译时可以随时去掉不不需要的组件,提升编译速度 登录 定位 IM
17. 路路由中⼼心实现 ✦ wbmain://authority/path?querywbmian://component/{name}/{action}?{query} name1 assets/ name1_handle name2 assets/ name2_handle nameN assets/ name2_handle action1 action2 action3 … action1 action2 action3 … action1 action2 action3 … loading verifier cache route
18. 路路由优势 client public int getTaskScore(int taskId){ Response result = Walle.route(“"wbmain:// component/share/getTaskScore"”); return result.getInt(“result”) } service public class ShareHandle extends ComHandle {
 @Action(uri="wbmain://component/share/getTaskScore")
 public void getTaskScore(Context context, Request req, Response res){
 int taskid = req.getInt("taskId");
 … res.putInt(“result”,0);
 } } ✦ ⽅方法级别的同步调⽤用 ✦ 使⽤用简单、开发成本⼩小
19. 路路由中⼼心实践 路路由虽好,但不不能滥⽤用
20. 开发期流程 maven服务器器 独⽴立开发组件 发布仓库 ⽣生成wae 编译⽂文件 wae res classes.jar assets/classes.dex assets/compile.txt aar res classes.jar 按需下载wae 打包APK apk classes.dex classes1.dex …. resources.arc
21. 开发期-发布wae流程 编译⼯工程 是否包依赖库 否 本库解压jar 是 获取所有依赖库 aar 复制到临时⽬目录 aar or jar aar 读取txt获取jar列列表 jar or aar 是 否存 否 解压出jar jar+aar列列表 dx⽣生成dex⽂文件 ⽣生成compile.txt ✦ dex太⼤大怎么解决? ⽣生成wae⽂文件
22. 开发期-打包 wae assets/classes.dex assets/compile.txt wae… assets/classes.dex … assets/compile.txt 开始编译 编译合并资源 classes转换成dex 签名⽣生成apk
23. 开发期-打包优势 实例例:编译APK总⽤用时147s,下⾯面是各Task⽤用时 Task mergeDebugResources processDebugResourcces transformClassesWithJarMergingForDebug transformClassesWithMultidexlistForDebug transformClassesWithDexForDebug 时间(s) 10 7 7 16 85 ✦ 跳过合成dex后,总时⻓长可缩短70% 占⽐比(%) 11% 73%
24. Walle框架分析 并⾏行行开发 组件化程度 解耦化 编译速度 运⾏行行效率 兼容性 动态性 开发成本 深度插件化 ⽀支持 ⾼高 ⾼高 低 中 中 ⾼高 ⾼高 容器器化 ⽀支持 ⾼高 Walle ⽀支持 ⾼高 ⾼高 低 中 中 中 ⾼高 ⾼高 ⾼高 ⾼高 ⾼高 低+⾼高 低
25. PART 03 保障平台与规划
26. 开发期-保障⽀支撑平台 ⼯工具集 MergeRequest wae发布⼯工具 代码仓库管理理 … 构建平台 内置资源打包 代码⾃自动检测合并 Jenkins ⾃自动检测上线单 灰度发布 质量量保障 ⾃自动化测试 ⽇日志系统 Testin Bugly
27. 开发期-⽀支撑平台 合并功能分⽀支(f- ✦ 合并流程⾃自动化 ✦ 上线检查⾃自动化 ✦ 发版流程⾃自动化 预合并分⽀支 (pre-release-7.11.0) ⾃自动合并冲突检测 ⾃自动编译 不不通过 不不通过 静态代码审核 Sonar(lint、findBugs、checkstyle) 不不通过 RD 不不通过 ⾃自动发布Wae包 版本分⽀支release-7.11.0
28. 后期规划 规划 资源 升级 ⽬目前只⽀支持Dex的升级,后期可加⼊入 资源的动态升级 编译 速度 通过预编译资源可以进⼀一步加快编译 速度 细化 拆分 当前组件的粒度⽐比较⼤大,可以继续拆 分优化