移动产品迭代包袱重,大众点评讲述成功和失败经验:《如何创建更加灵活的App》| 大众点评 屠毅敏 | Android DevCamp
主题简介:Android和iOS原生应用的部署特性决定了其无法像Web开发那样灵活多变,同时造成了产品迭代速度缓慢,线上问题无法及时解决,旧版本的历史包袱越来越重等一系列的问题。在尽可能小的影响App体验的前提下如何创建出更加灵活多变的App,在应用上线后能够及时做出调整,是点评一直在努力尝试解决的问题。本次演讲将讲述点评近两年在远程配置、Native+HTML、脚本语言、动态加载等技术实现方案上的尝试及成功或失败的经验总结。
讲师简介:屠毅敏,点评网最早的手机应用开发之一,也是早期点评手机应用的主要开发者。07年底开始接触Android,08年开始iPhone应用开发。09年加入点评之前一直是个人开发者,目前在点评主要负责移动应用架构设计及新技术研发。
【幻灯片在线观看】*:
<iframe src="http://www.slideshare.net/slideshow/embed_code/13839889" width="597" height="486" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen=""> </iframe>
备注:* 因为炫姐姐对SlideShare这一平台的偏爱,尽管需要使点小技巧才能上传分享,但是炫姐姐还是坚持选择了这一功能强大却简洁好用的平台。一来对国外这些开发出优秀的工具和平台、造福于互联网和人类的团队表示致敬,二来则是对国内对于这些优秀的工具和平台的限制表示一下立场。读者如果不能正常浏览,那么需要像炫姐姐一样用点小技巧。而对于那些还是不知道炫姐姐在说什么的小白读者,可以移步到这里查询原因。
【幻灯片下载页面】: Android DevCamp幻灯片下载:如何创建更加灵活的App | 大众点评 屠毅敏-来自CSDN下载频道(不需要积分,自由下载)
【幻灯片内容刚要】:
- 1. Android DevCamp Produced by CSDN
- 2. 创建更加灵活的App
- 3. Why • 无法消灭旧版本,版本维护周期过长 • 基于版本的迭代速度缓慢 • 上线后无法调整 • Bug造成的影响无法即使消除 • 。。。
- 4. What Matters • 需求驱动 • 成本 与 收益
- 5. 案例 • 2010年,当时用户体验最好,用户数最多的地图类应 用是Google Maps • 但是Google Maps面临最大的问题是速度慢,经常被墙 • 国内的地图应用成为主流只是时间问题 • 如何在外部环境发生变化后及时调整?
- 6. 需求 • 避免弹出Pick Activity对话框,根据用户手机有没有安 装该地图应用决定默认打开哪款地图。优先级如下: Priority List: 1. Google Maps 2. Google Maps (Brut) 3. 百度地图 4. 图吧地图 5. Mini Map ... • 查看地图是⼀一个非常关键的功能点 ,优先级需要随时 调整,并在已发布的客户端也同时生效
- 7. 问题 • 每款地图应用都定义了自己的Intent调用方式 • 对于未知的地图应用,如何创建对应的Intent? • 是否需要针对地图应用的版本号来采取不同的优先级 策略?
- 8. 最初方案 • 把策略和创建Intent交给服务器端解决 • bla bla ...
- 9. 把精力放在解决80%的用户需求上
- 10. 最终方案 • 放弃支持未知地图应用 • 放弃支持版本号判断 • 把Priority List加入远程配置中 • 客户端负责顺序判断,并创建地图应用对应的
- 11. 配置 Remote http://api.myserver.com/config? client=myapp&version=1.0&... cached on local disk { ver:”20120701”, mapList: [ “Baidu”, “Google”, “Google(Brut)”, “Mapbar”, ... ]
- 12. 配置 Remote User http://api.myserver.com/config? SharedPreference client=myapp&version=1.0&... cached on local disk stored on local disk { ver:”20120701”, mapList: [ { “Baidu”, mapList: [ “Google”, “Baidu” “Google(Brut)”, ] “Mapbar”, } ... ]
- 13. 配置 Default Remote User MyApp.apk http://api.myserver.com/config? SharedPreference |-res client=myapp&version=1.0&... |-raw cached on local disk stored on local disk |-default { { ver: “20120101”, ver:”20120701”, mapList: [ mapList: [ { “Google”, “Baidu”, mapList: [ “Google(Brut)”, “Google”, “Baidu” “Baidu”, “Google(Brut)”, ] “Mapbar”, “Mapbar”, } ... ... ] ] } }
- 14. 配置 • 简单实用,可以满足大部分的简单需求 • 新版本提示 • 特定功能的开启或关闭 • 产品运营相关 • 等等
- 15. HTML5 Hybrid Application
- 16. PhoneGap 详见 http://phonegap.com
- 17. Why Not? • PhoneGap要做到和Native Activity的整合较困难 • 2010年的手机性能运行PhoneGap的界面流畅度不好 • 好的Web前端设计师太难招了 • 那个时候还没有PhoneGap
- 18. Activity Stack 首页 dianping://home 活动推广(HTML) http://dianping.com/a1.html 列表 dianping://list?ids=12,32,44 商户详情 dianping://info?id=12
- 19. URL Scheme • dianping://shopinfo?id=123456 <activity android:name="com.dianping.find.ui.activity.ShopInfoActivity" android:configChanges="orientation|keyboardHidden" android:label="商户信息" android:screenOrientation="nosensor" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host="shopinfo" android:scheme="dianping" /> </intent-filter> </activity>
- 20. URL Scheme • HTML <a href="dianping://shopinfo?id=123456">查看商户详情</a> • Intent Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("dianping://shopinfo?id=123456")); startActivity(i);
- 21. Simple is best • 概念简单,就跟打开网站⼀一样,很容易跟别人解释清 楚。 • 实现简单,几行代码就能实现。 • 跨平台,iOS和Android都可以采用。 • 微信、支付宝等程序间的交互。
- 22. 团购 • 需求变数多 • 主要业务由网站开发团队负责,移动只提供框架 • 用HTML开发,需要同时支持iOS和Android • HTML能够向Java代码获取信息,如用户账户等信息 • 能够指定在不同的Activity中打开不同的页面
- 23. 数据传递 • Android Javascript Bridge public void addJavascriptInterface(Object object, String name) • WebView URL Override (Android & iOS) public boolean shouldOverrideUrlLoading(WebView view, String url) http://myapp.com/checkout?user=!&token=! http://myapp.com/checkout?user=123&token=e3a12f54c123
- 24. Activity Stack管理 • URL Override • 支持压入堆栈和抛出堆栈 • 。。。
- 25. 出现问题 • 不同Android版本的WebView有不⼀一致的行为 • 列表页面高度逐渐增大,UI相应速度缓慢直至完全不 响应 • jQuery或MooTools当时没有为移动设备做优化,类库 太重,耗费资源严重。 • 在不同的Activity和WebView中打开网页导致严重依赖 Cookie,管理成本高。
- 26. 最终 • 用户普遍不认可HTML的开发方式,各种抱怨 • 浏览率低,订单转化率低,支付成功率低,各种低 • 损失的都是钱那
- 27. 惨痛的教训 • 用户体验通常是Native比HTML好 • Web开发和移动开发还是有显著区别的,沟通成本很 高 • 如果HTML只是临时方案,不要做过多的框架设计, 但是⼀一定要考虑今后迁移到Native的可行性 • 考虑成本和收益
- 28. 脚本语言 Lua & Python
- 29. 脚本语言的问题 • dalvik下无法创建新的类 • Java是静态类型,脚本语言调用需要指定类型,代码非常冗余 • 使用C/C++实现的Lua和Python解释器面临的问题 • 无法直接在Lua/Python中引用Java对象(内存地址变化) • 需要经过JNI来中转所有调用,中间层实现成本较高 Java JNI Lua/Python • 使用Java实现的Lua和Python解释器效率较低,且可靠性未知
- 30. 动态加载 Dalvik Executable File & Resources
- 31. DexClassLoader DexClassLoader dcl = new DexClassLoader( "/sdcard/dex.apk", "/sdcard/dexout/", null, super.getClassLoader()); Class c = dcl.loadClass("com.package.MyClass"); Object myObj = c.newInstance();
- 32. 定位项目需求 • 初步证明android.location.LocationManager存在优化空 间 • 进⼀一步的优化需要通过线上数据及反馈进行迭代 • 迭代周期为1~2周⼀一次 • 每次迭代都需要在线上环境做A/B Test以验证有效
- 33. 定位服务 dianping.apk dynamic.apk interface LocationService class LocationServiceImpl class DexLocationServiceWrapper implements LocationService implements LocationService { private LocationService mService; }
- 34. 上线后 • 完全摆脱了App上线周期和版本的限制 • 新老版本的App都运行着最新版本的定位服务 • 不同App运行着最新版本的定位服务,不需要再merge 了 • 团队可以独立运作 • 偶尔还可以帮忙解个线上Bug。。
- 35. 下⼀一步 • 所有代码都动态加载 • 如何动态加载⼀一个Activity?
- 36. 动态加载Activity Application mBase : ContextImpl mPackageInfo : LoadedApk mClassLoader : PathClassLoader
- 37. DEMO Activity Override
- 38. 缺陷 • 用了很多Hacking,不能保证未来系统的兼容性 • Activity必须要在AndroidManifest.xml中注册,所以无法 通过动态加载的方法新增Activity • Resources资源文件没有解决
- 39. 重新思考 • Activity继承自ContextWrapper,每个Activity都有能力 改变自己的上下文环境。 • Android 3.0 引入了救星Fragment。Fragment就是小⼀一 号的Activity,但也能够满足需求了。 • Activity作为Fragment运行的容器,提供ClassLoader和 Resources相关的环境。
- 40. 代码 资源 Activity.getAssets() Activity.getClassLoader() Activity.getResources() Activity.getTheme()
- 41. DEMO Fragment Loader
- 42. Resources重复问题 • Android的资源文件通过R.java来索引 • 手动分配不同的id,在不同层级的apk中通过res/values/ public.xml来分配 • 通过重载AssetManager中的隐藏函数来区分不同区段 的id,并返回对应apk包中的资源 • (需要特殊的编译方式)
- 43. 数据类型 • 采用Java类封装数据的方式过于繁重 • 建议采用松散数据类型在各个模块之间进行交互(类似 JSONObject)
- 44. 其他问题 • 模块粒度问题 • Intent如何表示 • 损失的Activity属性如何弥补
- 45. 优点 • 采用插件的模式,功能模块独立开发,独立上线 • 开发彻底解耦 • 解决了编译时间过长的问题 • 主程序apk包大小可以减小
- 46. HTML + Dex Javascript Bridge
- 47. Thanks
分享到:
相关推荐
移动产品迭代包袱重,大众点评讲述成功和失败经验:《如何创建更加灵活的App》| 大众点评 屠毅敏 | Android DevCamp 主题简介:Android和iOS原生应用的部署特性决定了其无法像Web开发那样灵活多变,同时造成了产品...
安卓应用实用功能的技术实现:《Android消息推送实现》 | Android DevCamp | 7月28日 北京 主题简介:作为移动应用开发的一个重要需求,微软和苹果公司分别为iOS和Windows Phone平台应用开发者提供了很好的消息推送...
电商应用开发实例分享:《凡客移动应用之Android + HTML5技术运用》 | Android DevCamp 主题简介:本演讲将结合凡客的Android客户端应用实例,详细介绍凡客应用的实现架构,阐述分析电商应用中的多线程的合理使用...
资深程序员多年代码实践总结:《和Android源代码一起工作》 | Android DevCamp 话题简介:本演讲将结合讲师多年的代码实践经验,主要介绍Android源代码以及相关内容,让应用开发者了解到如何利用Android源代码来...
安卓系统架构多年经验总结:《Android程序的编译,安装和运行》 | Android DevCamp 讲师简介:汪文俊,中国科技大学硕士,原IBM系统工程师,现为小米科技MIUI首席架构师,开源C编译器项目ucc的作者。 话题简介:...
安卓热点话题总结性剖析:《Android在多屏幕、多设备上的适配》 | Android DevCamp 话题简介:对于安卓多屏幕和多设备适配问题,早在2010年的Google IO大会,就有专门探讨过。这些年来,对于这个普遍存在的问题,...
再谈Android推送实现:《千万级并发在线推送系统架构解析》| 个信互动 叶新江 | Android DevCamp 主题简介: 移动短消息是大家所熟知的一种信息推送方式, 基于信令通道的推送在简单信息的体验方面已经被大家所...
安卓数据分享技术实现::《发现和建立多设备之间的数据通信》 | Android DevCamp 话题简介:随着移动应用越来越多的依赖于服务端,开发者对数据通信协议的需求慢慢增多。 而软件版本兼容性的不同、网络环境的不...
iOS DevCamp幻灯片分享:《Passbook实战详解》| 爱图腾 廉洁 话题简介:iOS6发布后最值得关注的一个特性即为Passbook。本演讲将结合爱图腾的实践,对iOS6中推出的Passbook应用及相关的开发细节进行讲解,详细说明...
本议题将以引擎移植者的身份清晰的讲解Cocos2D的结构,除此之外,还会分享App开发中的实际问题,例如灵活使用层,管理好触摸,整合使用Box2d物理引擎,Cocos2D与UIKit的整合等等开发中遇到的常见问题。 讲师简介:...
Siri语音识别系统详解》 | iOS DevCamp 话题简介:Siri是苹果公司发布的广受关注的iOS平台应用,它不仅仅是一套语音识别系统,更重要的是其用户意图分析与智能识别机制。本讲座将深入分析Siri的技术原理,讲解其...
逆向工程技术详解:《揭开IPA文件的灰沙 -- 通过静态分析工具了解IPA实现》 | iOS DevCamp 话题简介:在AppStore中经常会出现各种令人耳目一新的App,他们是如何实现那些效果的?他们又是使用哪些公共组件来完成...
主题简介:很多iPhone应用产品的开发,并没有多少技术亮点,而更多的是对各种iOS开发技术的灵活掌握和应用,以及经验的积累。本演讲将结合讲师这些年自学iPhone开发的历程,结合自己多个应用开发实践的案例,与大家...
应用重构:《从知乎 iPhone 端重构说开去:Web 为主的复杂社交产品的 iOS 端开发策略及实践》| 知乎 耿健桓 | iOS DevCamp 议题简介:当为知乎等以 Web 为主的复杂社交产品开发 iOS 端时,我们在开发上总会面临的...
话题简介:在AppStore中经常会出现各种令人耳目一新的App,他们是如何实现那些效果的?他们又是使用哪些公共组件来完成自己的功能的呢?在本次演讲中将对如何探索那些封藏在IPA文件后面的实现进行简单的分析,将会...
应用重构:《从知乎 iPhone 端重构说开去:Web 为主的复杂社交产品的 iOS 端开发策略及实践》| 知乎 耿健桓 | iOS DevCamp 议题简介:当为知乎等以 Web 为主的复杂社交产品开发 iOS 端时,我们在开发上总会面临的一...
利用团结和虚幻引擎:我在DevCamp 2018中的“利用Unity和虚幻引擎”演讲的幻灯片于2018年8月25日在万隆数字谷
devCamp
CSDN Share 是一款出色的Android阅读工具,阅读由 CSDN社区用户分享的技术文档。 通过CSDN Share可以在线阅读或离线下载CSDN 举办的各类技术活动的精彩讲义,以及来自CSDN下载社区由用户分享的技术文档。 马上下载...
CSDN Share 是一款出色的Android阅读工具,阅读由 CSDN社区用户分享的技术文档。 通过CSDN Share可以在线阅读或离线下载CSDN 举办的各类技术活动的精彩讲义,以及来自CSDN下载社区由用户分享的技术文档。 马上下载...