You are on page 1of 29

58同城Android客户端框架演进与实践

赵路路平
⽬目录

PART 01
框架演进历程

组件化实践
PART 02

保障平台与规划
PART 03
PART 01

框架演进历程
演进图

2012 2014 2016

回归体验,满⾜足灵活 可维护性,开发效率
快速占领市场,速度
纯Native 部分动态化 Walle框架成型

快速发展,迭代快 AllInApp,⼤大平台,并⾏行行开发

Hybrid模式 插件框架
4

2013 2015
纯Native

✦ 模块拆分 主模块 房产 ⼆二⼿手

业务代码 招聘 …
✦ 基础组件

✦ 快速搭建框架

公共代码 network image map

SDK …
Hybrid模式-框架

主程序 详情⻚页 列列表⻚页 运营⻚页 …


业务代码
✦ 业务迅速迭代

✦ 线上修复能⼒力力强 WebView (html js css)

动态框架
UIWidget

Cache

公共代码 network image map SDK …


Hybrid模式-实践
✦ 加载⻚页⾯面速度慢?

1. 缓存(html、js、css、image)

2.3 3.0 5.0

shouldInterceptRequest shouldInterceptRequest
ContentProvider (WebView webView, WebResourceRequest webResourceRequest)
(WebView view, String url)

2. 并⾏行行加载

ParcelFileDescriptor
AssetFileDescriptor

Thread(pipe)
图⽚片服务器器
WebView Thread(pipe)
Thread(pipe)

SDCARD
Hybrid模式-实践
✦ 如何管理理缓存⽂文件(版本号、超时间)?
1. ⽂文件名? key value
version 0.0.1
2. 数据库表?
time 2017-6-9
10:12:00
3. 放在⽂文件内容中

把内容转换成固定字节,保存到⽂文件头中,如下图

… …
标识 map⻓长度 key1⻓长度
…。。
key1值 val1⻓长度 val1值 key2⻓长度 …..

读取时:

WapperStream

client scared
InputStream
部分动态化

主程序 详情⻚页 列列表⻚页 运营⻚页 …


✦ 提升⽤用户体验 业务代码

✦ 保留留了了动态部署能⼒力力
动态配置 hybrid
动态框架
模板管理理 Cache

公共代码 network image map SDK …


插件化
分享
登录

主程序
房产
✦ 并⾏行行开发能⼒力力
招聘 记加班
业务代码 定位

✦ 动态升级能⼒力力

动态模板 web+native …
公共代码
network image map SDK

ActivityProxy+Context隔离
插件机制
os
HOOK
插件化-实践

✦ 进程问题?

B 固定进程数
A ⼀一个插件⼀一个进程

主业务间有依赖关系,
会出现进程数膨胀问题,


不不能杀死进程
不不可接受

C 合并单⼀一进程

会引起单例例问题,⽐比如
引⼊入Fresco时资源混乱
插件化-实践

✦ 代码共⽤用问题?

1. 单例例问题

不不共⽤用代码 共⽤用代码

Manager Manager Manager Manager


Context Context1 Context2 Context

PathClassLoader DexClassLoader1 DexClassLoader2 PathClassLoader DexClassLoader1 DexClassLoader2

主APP 插件1 插件2 主APP


插件1 插件2
Manager.class Manager.class Manager.class Manager.class

2. apk包增⼤大

3. 插件之间交互变复杂之后联调成本增加
PART 02

组件化实践
开发周期

开发期 运⾏行行期 运维期

并⾏行行开发 提⾼高运⾏行行效率 动态升级

提升开发效率 按需加载
Walle框架结构

分享

登录

✦ 并⾏行行开发能⼒力力
房产

记加班
⾸首⻚页 招聘 定位

✦ 降低依赖层次

grade 保障
plugin 平台

✦ 提升编译速度

ROUTE web+native …
插件机制
WALLE network image

multidex
路路由中⼼心

✦ 为什什么要有路路由中⼼心?

房产 登录
路路由中⼼心

⼆二⼿手 ⽅方法调⽤用 定位
⻚页⾯面跳转

事件总线
IM
招聘

1. 代码和资源解耦,⽅方便便组件维护

2. 编译时可以随时去掉不不需要的组件,提升编译速度
路路由中⼼心实现

✦ wbmain://authority/path?query

✦ wbmian://component/{name}/{action}?{query}

name1 name2 nameN

assets/ assets/ assets/


name1_handle name2_handle name2_handle

action1 action1 action1


action2 action2 action2

action3 action3 action3

… … …

loading verifier cache route


路路由优势

client service

public class ShareHandle extends ComHandle {



public int getTaskScore(int taskId){ @Action(uri="wbmain://component/share/getTaskScore")

Response result = Walle.route(“"wbmain:// public void getTaskScore(Context context, Request req, Response res){

component/share/getTaskScore"”);
int taskid = req.getInt("taskId");

return result.getInt(“result”)
} …
res.putInt(“result”,0);

}
}

✦ ⽅方法级别的同步调⽤用

✦ 使⽤用简单、开发成本⼩小
路路由中⼼心实践

路路由虽好,但不不能滥⽤用
开发期流程

maven服务器器

按需下载wae
发布仓库

wae
⽣生成wae res 打包APK
classes.jar
assets/classes.dex
assets/compile.txt
独⽴立开发组件 编译⽂文件
apk
classes.dex
classes1.dex
aar ….
res resources.arc
classes.jar
开发期-发布wae流程

是 aar
编译⼯工程 是否包依赖库 获取所有依赖库 aar or jar 读取txt获取jar列列表

否 jar or aar

本库解压jar 是
jar+aar列列表
否存

aar 复制到临时⽬目录 解压出jar

dx⽣生成dex⽂文件 ⽣生成compile.txt

⽣生成wae⽂文件

✦ dex太⼤大怎么解决?
开发期-打包

wae wae…

assets/classes.dex assets/classes.dex …
assets/compile.txt assets/compile.txt

开始编译 编译合并资源 classes转换成dex 签名⽣生成apk


开发期-打包优势

实例例:编译APK总⽤用时147s,下⾯面是各Task⽤用时

Task 时间(s) 占⽐比(%)

mergeDebugResources 10
11%
processDebugResourcces 7

transformClassesWithJarMergingForDebug 7

transformClassesWithMultidexlistForDebug 16 73%

transformClassesWithDexForDebug 85

✦ 跳过合成dex后,总时⻓长可缩短70%
Walle框架分析

  并⾏行行开发 组件化程度 解耦化 编译速度 运⾏行行效率 兼容性 动态性 开发成本

深度插件化 ⽀支持 ⾼高 ⾼高 低 中 中 ⾼高 ⾼高

容器器化 ⽀支持 ⾼高 ⾼高 低 中 中 中 ⾼高

Walle ⽀支持 ⾼高 ⾼高 ⾼高 ⾼高 ⾼高 低+⾼高 低


PART 03

保障平台与规划
开发期-保障⽀支撑平台

⼯工具集 构建平台

MergeRequest wae发布⼯工具 内置资源打包 代码⾃自动检测合并

代码仓库管理理 … Jenkins

质量量保障

⾃自动检测上线单 ⾃自动化测试 Testin

灰度发布 ⽇日志系统 Bugly


开发期-⽀支撑平台 合并功能分⽀支(f-

✦ 合并流程⾃自动化 预合并分⽀支
(pre-release-7.11.0)

✦ 上线检查⾃自动化
⾃自动合并冲突检测

✦ 发版流程⾃自动化 不不通过

⾃自动编译
不不通过

静态代码审核 不不通过
RD
Sonar(lint、findBugs、checkstyle)
不不通过

⾃自动发布Wae包

版本分⽀支release-7.11.0
后期规划

资源 ⽬目前只⽀支持Dex的升级,后期可加⼊入
升级 资源的动态升级

编译 通过预编译资源可以进⼀一步加快编译
规划 速度 速度

细化 当前组件的粒度⽐比较⼤大,可以继续拆
拆分 分优化

You might also like