屠毅敏大众点评手机客户端架构变迁

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

大众点评手机客户端架构变迁12年8月4日星期六•速度•灵活性•耦合12年8月4日星期六速度Network12年8月4日星期六是否有缓存HTTP请求读取缓存GZip解压反序列化Yes,80%No,20%...年8月4日星期六优化HTTP速度•GZip压缩,减小数据包的大小•更加快速的序列化(Binary)01500300045006000JSONBinaryBinary+GZip2010HTTPUnzipDeserialize64k32k14k2010HTCMagic600MHzCPU12年8月4日星期六HTTP响应时间year2010frombaidu12年8月4日星期六优化HTTP协议•移动网络特性:高延时requestprocessresponsetcpconnectsenddatareceivedataclientserver030060090012000125101520304+4byteon2G(EDGE)两次请求间隔时间(warmup)12年8月4日星期六优化HTTP协议•并发请求性能02500050000750001000001x1002x503x334x255x206x172GEDGE0225004500067500900001x1002x503x334x255x206x173GWCDMArequest1,2,3response1,2,3clientserver12年8月4日星期六优化HTTP协议•复用TCP连接(TCP长连接)03006009001,200010002000500010000150002000030000LongConnvs.ShortConnLCSocketBSocket12年8月4日星期六缓存优化•更加细化的缓存规则,以提高使用率•先读取再更新(微博)•网络失败时用过期缓存替代•优化IO速度•SQLite和文件速度差不多(5000)•MemCache只在局部有效•基于KVDB的速度优化12年8月4日星期六KVDB速度比较012,50025,00037,50050,000NessDBLevelDBTreapDBSQLiteFile4kx10000SETGET12年8月4日星期六NessDB加速效果•【Video】12年8月4日星期六NDK•byte[]•Encrypt/Decrypt•GZip•HASH(MD5)•String12年8月4日星期六byte[]JSONObjectMyObject反序列化?classDPObject{byte[]bytes;intstart;intlength;intgetInt(Stringname);StringgetString(Stringname);doublegetDouble(Stringname);DPObjectgetObject(Stringname);DPObject[]getArray(Stringname);}12年8月4日星期六性能Memory00.751.502.253.00DPObjectMyClass图表1MemoryUseageSpeed83000get/s**GalaxyNexus-ARMv71.2G12年8月4日星期六灵活性12年8月4日星期六HybridAppNative+HTML12年8月4日星期六PhoneGapSingleWebViewNativePluginsURLOverrideorJavascriptInterfaceJavascript注入12年8月4日星期六WhyNot?•以NativeUI为主的应用已经形成•团队缺乏有经验的Web前端设计•HTML在当时的硬件条件下运行不流畅,且无法解决长列表滚动卡死的问题•当时还没有PhoneGap12年8月4日星期六首页ActivityStack活动推广(HTML)列表商户详情dianping://home://list?ids=12,32,44dianping://info?id=1212年8月4日星期六URLScheme•HTML•Android•iOSahref=dianping://shopinfo?id=123456查看商户详情/a Intenti=newIntent(Intent.ACTION_VIEW, Uri.parse(dianping://shopinfo?id=123456)); startActivity(i);[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@dianping://shopinfo?id=123456]];12年8月4日星期六Simpleisbest•概念简单,就跟打开网站⼀一样,很容易跟别人解释清楚。•实现简单,几行代码就能实现。•跨平台,iOS和Android都可以采用。12年8月4日星期六HTMLNativePhoneGap重HTML轻NativeURLScheme重Native轻HTMLWeb开发和移动开发还是有显著区别的,如果采用混搭,必须以⼀一个为主。12年8月4日星期六脚本语言Lua&Objective-C12年8月4日星期六ObjCRuntimeObjective-CClassLuaClassWax12年8月4日星期六DEMOWaxCategory年8月4日星期六Android•dalvik下无法创建新的类•Java是静态类型,脚本语言调用需要指定类型,代码非常冗余•使用C/C++实现的Lua和Python解释器面临的问题•无法直接在Lua/Python中引用Java对象(内存地址变化)•需要经过JNI来中转所有调用,中间层实现成本较高•使用Java实现的Lua和Python解释器效率较低,且可靠性未知JavaLua/PythonJNI12年8月4日星期六动态加载AndroidDexClassLoader12年8月4日星期六DexClassLoaderDexClassLoaderdcl=newDexClassLoader( /sdcard/dex.apk,/sdcard/dexout/, null,super.getClassLoader());Classc=dcl.loadClass(com.package.MyClass);ObjectmyObj=c.newInstance();12年8月4日星期六.classActivity.getClassLoader()res/*Activity.getAssets()Activity.getResources()Activity.getTheme()年8月4日星期六DEMOFragmentLoader年8月4日星期六耦合12年8月4日星期六MVC•Model是信息的载体,也是流动性昀大的•利用类来表示Model会在产生代码耦合性•随着业务的复杂,Model的定义也会趋向复杂化12年8月4日星期六StrongTypeModelAPIDefinitionInterfaceurlreturntypeparams=intkeyword=stringsort=enumfileuser=stringpass=stringModelSearchResultSearchResultintStartIndexintNextStartIndexintTotalCountListShopListUserProfileUserProfileintUserIDstringNickNamestringAvatarintLevelstringWeibostringToken......12年8月4日星期六DefinitionModelDOMhtmlheadbodyh1divaaaJavascriptjQuery:$(a[href*='/content/gallery'])Browser12年8月4日星期六DefinitionModelJSON{“Name”:”小南国”,“ID”:434,“Coupon”:[{“Title”:”买⼀一送⼀一之类...”,“ID”:654,“Date”:”2012-01-01”},{“Title”:”买⼀一送二...”,“ID”:655,“Date”:”2012-06-01”}]}object{}{members}memberspairpair,memberspairstring:valuearray[][elements]elementsvaluevalue,elementsvaluestringnumberobjectarraytruefalsenullgetString(“Name”)getArray(“Coupon”)[0].getString(“Title”)getInt(“Coupon[0].ID”)12年8月4日星期六SystemFrameworkiOSUIKit,Android.jarApplicationFrameworkService,Model(DPObject),UtilsBusinessModulePage1BusinessModulePage2BusinessModulePage3BusinessModulePage4NavigationManage&URLMapping12年8月4日星期六Thanks12年8月4日星期六

1 / 38
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功