淘一淘七载征途 技术深耕守本初

本系列为 Android 技术职场题材虚构小说,所有登场人物、公司名称、组织架构及相关情节均为创作所需虚构而来,若有雷同,纯属偶然。书中涉及的技术知识经专业梳理,仅供参考。

八)淘一淘七载征途 技术深耕守本初

第二天一早,小安踩着上班铃冲到了老杨工位前,身后的发束随着跑动轻快地扫过肩头,手里还攥着半杯没喝完的豆浆,语气里满是急切:"老杨老杨,昨天你讲到在淘一淘解决了商品列表等很多问题,后来呢?你在淘一淘还经历了啥?后来为啥来我们公司了?"

老杨刚打开电脑,正在加载开发环境,闻言抬眼笑了笑,故意调侃道:"这都上班点了,你不先去忙自己的事?没工作吗?"

小安把豆浆往桌角一放,眨了眨眼,理直气壮地说:"工作哪有听你讲职场经历、吃技术大牛的瓜重要!快说快说。"

老杨被她逗乐了,指了指旁边的空位:"行吧,先坐下来,别急。"

小安连忙拉过椅子坐下,眼神里满是期待。晓雅和阿泽、博文也陆续走到工位,听到两人的对话,纷纷围了过来------昨天老杨讲的职场经历,让这几个实习生都听得入了迷。

老杨指尖在桌面上轻轻敲击,像是在梳理那些在淘一淘跨越七年的技术印记,缓缓开口:"列表优化只是起点,真正的成长,是在一次又一次的项目迭代里熬出来的。"

......

2016年,老杨入职淘一淘的第一年。

......

当时淘一淘正面临一个棘手的问题:随着功能迭代,APP 的 APK 体积从最初的18M飙升到了90M,很多低内存机型用户反馈下载慢、安装后占用空间过大,卸载率居高不下。

技术总监王哥把优化 APK 体积的任务交给了老杨所在的小组,明确要求"在不削减核心功能的前提下,把体积压缩到60M以内"。

"这可不是简单删几个文件就能解决的。"小组开会时,组长敲着桌子强调,"大家先把 APK 包解压缩,分析清楚体积增长的根源。"

老杨主动承担了资源分析的工作。

他用 Android Studio 的分析工具拆解 APK,发现问题主要出在三个地方:一是未优化的图片资源占了近16M,二是引入的第三方库存在大量未使用的代码,三是包含了适配所有 CPU 架构的原生库。

"我有个思路。"老杨在第二次小组会上拿出了详细方案,"首先用 WebP 格式替换所有 PNGJPEG 图片,这种格式压缩率比 PNG 高不少,而且画质损失很小;然后启用代码压缩工具,移除未使用的类和方法;最后通过 abiFilters 配置,配合应用市场分包策略,让用户只下载和自己机器 CPU 架构相关的安装包,剔除其他小众架构的原生库,进一步减小用户实际下载体积。"

方案得到了一致认可,但执行过程中却遇到了阻碍:第三方库中的部分代码通过反射调用,直接用 ProGuard 压缩会导致功能异常。

老杨熬夜研究 ProGuard 规则,逐一排查反射调用的类和方法,在配置文件中用 -keep 规则显式保留这些类和方法,终于解决了问题。

经过一个月的优化,APK 体积成功压缩到60.8M,下载转化率提升了17%。

王哥在部门例会上特意表扬了老杨:"优化不是蛮干,要精准定位问题,用对技术工具,这一点老杨做得很到位。"

这次优化让老杨对 Android 构建流程和资源管理有了深刻理解,也让他养成了"开发即优化"的习惯------后续开发新功能时,他总会提前考虑资源占用,避免再出现体积臃肿的问题。

16年末,团队做 Android 5.0 系统适配已过去一年多,项目虽早已落地收尾,但老杨发现不少同事对 ARTDalvik 两种运行时的差异仍一知半解,后续开发中还时不时冒出适配相关的小问题。

为彻底打通这个技术堵点,帮团队夯实基础,部门专门组织了一场专题技术分享会。凭借扎实的适配经验和对运行时原理的深入研究,老杨主动接下了这次分享任务。

分享会上,老杨结合提前备好的流程图,把核心区别讲得条理清晰。

"Dalvik 用的是 JIT 即时编译,运行时才把字节码转成机器码,这种方式启动快,但运行效率不稳定;ART 则是 AOT 预编译,安装时就完成转换,虽然首次安装费点时间,但后续运行更流畅、功耗也更低。"

他还结合淘一淘 APP 的真实运行数据,拆解两种运行时对性能的实际影响,讲解得通俗易懂,让在场同事都能听明白。

分享一结束,王哥率先起身鼓掌,赞许道:"老杨把复杂的底层逻辑讲得明明白白,还贴紧咱们的业务场景,这趟分享全是干货!"

这场分享也让老杨在部门内的技术话语权更扎实了。

时间一晃来到2017年,入职淘一淘两年的老杨已能独立承接核心任务。

这一年,淘一淘计划推出"离线缓存"功能,用户可在 WiFi 环境下缓存商品数据,离线时也能查看,这个功能的核心难点是文件系统的安全与高效管理,老杨再次挑起重担。

"用户缓存的商品数据包含价格、详情等敏感信息,必须保证安全,同时要考虑不同设备的存储情况,避免占用过多空间。"老杨在需求评审会上说道。

他深入研究了 Android 文件系统的分区结构,最终决定将缓存数据存储在 /data 分区的应用私有目录下------这里的文件只有当前应用可访问,符合安全要求,更关键的是,应用私有目录无需申请任何存储权限,这对开发来说是极大利好,能避免权限申请被用户拒绝的问题。

同时,他设计了一套针对内存缓存的管理策略:通过 ActivityManager 监控设备内存状态,低内存时自动清理过期缓存;限制单个用户的缓存上限,超过上限则按"最近最少使用"原则删除数据。

"离线缓存"功能上线后广受好评,用户离线使用时长提升了25%,更重要的是,由于采用了严格的文件安全策略,没有出现任何数据泄露问题。这次项目让老杨对 Android 文件系统的权限控制和安全模型有了更深入的理解。

2018年,淘一淘的用户量突破1亿,多进程管理成为制约体验的技术瓶颈------当时应用的多个组件运行在同一个进程中,导致内存占用过高,在低配置机型上频繁被系统杀死。

老杨主导了多进程优化项目,他在 AndroidManifest.xml 中通过 android:process 属性,将后台下载服务、推送服务等组件分配到独立进程中:"这样一来,不同功能模块的进程相互隔离,即使后台服务进程被杀死,也不会影响前台 UI 的正常运行。"

但多进程也带来了新的问题:进程间的通信和数据共享变得复杂。

老杨调研后,选择用 ContentProvider 实现进程间的数据共享,这是 Android 系统提供的跨进程通信组件,支持对集中式数据库的读写,安全性和稳定性都有保障,很适合当前的应用场景。

同时,他还优化了进程优先级管理:通过提升前台 UI 进程的优先级,确保用户交互时不被系统杀死;对后台进程设置合理的保活策略,既保证核心功能正常,又不占用过多系统资源。

多进程优化后,淘一淘 APP 的内存占用降低了15%,后台服务的稳定性提升了60%。

此时的老杨,已经成长为淘一淘技术部的资深工程师,能够独立主导核心项目的技术方案设计。

时间推进到2021年8月,距离老杨2016年入职淘一淘已经六年。

这一年,行业内迎来了一项关键政策调整:Google 正式发布强制要求,所有新上架 Google Play 的应用必须采用 AAB 格式提交,不再接受传统 APK 上传;即便已上架的存量应用,后续更新也会逐步收紧限制,最终全面切换到 AAB格式。

作为需要出海布局的电商平台,淘一淘必须紧跟政策要求完成格式迁移,老杨主动牵头推进淘一淘 APP 从 APKAAB 的迁移。

他带领团队梳理应用的模块结构,将不同配置的资源和代码拆分成独立的 bundle,并针对非 Google 应用商店的分发场景,制定了"双格式并行"的方案------Google Play 分发 AAB ,其他渠道仍保留优化后的 APK

迁移过程中,他们遇到了资源拆分不彻底、部分模块兼容性差等问题,老杨带领团队逐一攻克,最终成功完成迁移。

迁移后,用户通过 Google Play 下载的淘一淘 APP 平均体积减小了28%,下载转化率也因此再次提升。

"这近六年,就像跟着 Android 系统和行业规则一起成长。"

老杨的思绪拉回现实,语气中满是感慨,"从2015年刚入职时优化列表项性能,2016年钻研 APK 优化起步,之后又陆续跟进了一系列技术迭代项目,最后响应 Google 政策推进 AAB 迁移。这一路遇到了不少挑战,但每一次攻克难题,都是一次扎实的成长。"

博文恍然大悟:"杨哥,原来你说的'技术不是孤立的'是这个意思!优化 APK 体积要结合资源优化和代码压缩,做多进程优化还得懂跨进程通信组件的选型,这些知识点都是相互关联的。"

"没错。"老杨点点头,"这也是我把经验文档发给你们的原因,里面不仅记录了我踩过的坑,更梳理了每个技术点的关联逻辑。"

就在这时,老杨的Q书响了,是林卓发来的消息:"老杨,多谢你的指导和鼓励,我一定可以!"

老杨笑着回复:"哈哈,你成长了!遇到问题随时沟通。"

回复完消息,老杨看向眼前的实习生们:"技术成长没有捷径,都是在一次又一次的项目实践中积累起来的。你们现在多学多练,把基础打牢,以后遇到复杂问题自然能从容应对。"

话音刚落,小安忽然想起昨天没问完的问题,眼神亮晶晶地追问:"杨哥,你在淘一淘待了六年,从新人成长为资深工程师,按理说发展得顺风顺水,怎么最后会跳槽来我们公司呀?"

听到这个问题,老杨的思绪瞬间被拉回2021年 AAB 迁移完成后的那段日子,那些关于技术与业务的挣扎和矛盾清晰浮现。

他的眼神暗了暗,指尖无意识地摩挲着搪瓷杯的杯壁,沉默了几秒才缓缓开口:"主要是后期淘一淘的发展方向,和我对技术的追求越来越相悖了。"

"2021年顺利完成 AAB 迁移后,凭借这些年在核心项目中的突出贡献,22年初我正式晋升为 Android 客户端架构师。"

本以为能有更大权限推动技术优化,没想到公司的重心却在这之后彻底偏向了业务流,尤其是疯狂叠加各类引导消费者消费的功能。这些功能看似能快速提升营收,却让我带领团队亲手优化到流畅的 App 变得越来越臃肿,之前耗费大量心血的性能优化成果,几乎被消耗殆尽。

一旁的阿泽好奇地追问:"引导消费具体是怎么实现的呀?跟之前学到的有关系吗?"

"当然相关,而且很多就依托在之前做的多进程架构里。"老杨点头,语气里带着几分无奈。

"等用户打开 App 搜索购物时,系统就会根据这份个人画像,在搜索结果里插入一部分推荐商品。这些商品根本不是用户原本想要搜索的品类,却会被算法包装得格外吸引人------比如用大幅优惠标签、'千人千面专属推荐'的话术,再配上高清的宣传图,就是为了让用户忍不住点进去。"

"这些推荐商品的商家,会给公司支付高额的广告费,排名越靠前,费用越高。为了多赚广告费,后期插入的推荐商品越来越多,有时候用户搜一件商品,前半页全是推荐,真正需要的结果反而被压到了后面。"

晓雅皱了皱眉:"这样一来,用户体验不就变差了吗?而且后台一直运行个人画像服务,肯定会增加内存占用和功耗吧?"

"你说的没错。"老杨叹了口气,"我当时就提出,要控制推荐商品的数量,还要优化个人画像服务的运行策略,避免过度占用资源。但领导根本不听,还说我'只懂技术不懂业务',让我只管保证功能正常运行,不用管优化的事。"

"那段时间,公司还在不停地加新的营销功能,一会儿加弹窗式优惠券提醒,一会儿加限时秒杀的倒计时悬浮窗,还有各种分享助力的弹窗。这些功能大多是紧急上线,代码写得很粗糙,还要求必须常驻前台,根本没有优化的空间。"

"我做了六年的性能优化,就是想让 App 跑得更流畅、用户用得更舒服。可看着自己亲手优化的架构,被这些臃肿的营销功能一点点拖垮,用户反馈的卡顿、闪退问题越来越多,我心里特别难受。"

"最后一次争吵,是因为一个'全域弹窗推送'的功能。领导要求不管用户在使用哪个页面,只要符合营销条件,就必须弹出推送窗口。我坚决反对,说这个功能会严重影响用户体验,还可能导致支付流程中断,引发用户投诉。"

"但领导根本不考虑这些,只盯着 KPI 和广告费,还说我'阻碍公司发展'。我和他吵得很凶,我说'技术应该服务于用户,而不是成为收割用户的工具'。吵完之后我就想通了,在那里继续待下去,根本实现不了我的技术追求,所以第二天就提交了辞职申请。"

老杨话音毕,众人安静了好一会儿。

阿泽忍不住小声感叹:"老杨你也太刚了吧!敢直接跟领导这么硬刚,换我肯定没这个勇气。"

博文也点点头:"是啊,为了坚持技术初心放弃稳定的架构师岗位,太佩服了。"

小安身后的发束轻轻晃了晃,眼神里满是敬佩,随即又带着好奇追问:"那老杨,你跳槽来咱们 ByteFlow 之后,感觉咋样呀?会不会比在淘一淘舒服些?"

提到现在的工作,老杨紧绷的神色柔和了些,嘴角泛起一丝浅笑:"感觉还好,ByteFlow 的氛围更务实,不会为了短期营收牺牲用户体验,技术决策也更尊重工程师的专业意见,没那么不近人情。"

说着,他话锋一转,看向几个实习生认真叮嘱:"不过你们可别学我当初那样冲动辞职。我当时也是年轻气盛,脑子一热就提交了辞职申请,现在回想起来其实挺危险的------裸辞之后的职业空窗期、新工作的不确定性,都是要承担的风险。"

"认真想想,当初的问题未必没有更好的解决方案。比如我可以试着找领导做更详细的利弊分析,用数据证明过度营销会导致用户流失;也可以联合团队里有相同想法的同事一起推动改变,而不是一味硬碰硬。冲动辞职,其实是不负责任,也是最冒险的选择。"

"比如我可以试着找领导做更详细的利弊分析,用数据证明过度营销会导致用户流失;也可以联合团队里有相同想法的同事一起推动改变,而不是一味硬碰硬。冲动辞职,其实是不负责任且最冒险的选择。"

阳光透过落地窗洒在几人的身上,将他们的身影拉得很长。办公区的键盘敲击声渐渐密集起来,新的技术故事,正在这里悄悄开启。

而另一边,刚收到老杨鼓励的林卓,正对着电脑屏幕上复杂的项目需求眉头紧锁------一场属于他的技术挑战,已悄然拉开序幕。

相关推荐
我命由我123456 小时前
Android Jetpack Compose - Compose 重组、AlertDialog、LazyColumn、Column 与 Row
android·java·java-ee·kotlin·android studio·android jetpack·android-studio
愤怒的代码7 小时前
在 Android 中执行 View.invalidate() 方法后经历了什么
android·java·kotlin
PoppyBu8 小时前
Ubuntu20.04版本上安装最新版本的scrcpy工具
android·ubuntu
执念、坚持9 小时前
Property Service源码分析
android
用户41659673693559 小时前
在 ViewPager2 + Fragment 架构中玩转 Jetpack Compose
android
GoldenPlayer9 小时前
Gradle脚本执行
android
用户74589002079549 小时前
Android进程模型基础
android
we1less9 小时前
[audio] Audio debug
android
Jomurphys9 小时前
AndroidStudio - TOML
android
有位神秘人9 小时前
Android最新动态权限申请工具
android