扇贝张志博--APK瘦身的实践与演进

2023-10-15 03:59

本文主要是介绍扇贝张志博--APK瘦身的实践与演进,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【51CTO.com原创稿件】扇贝是一个全面有效提升英语的移动互联网学习平台,有包括单词、听力、口语、新闻、阅读、炼句在内的六大应用,是目前国内唯一能让用户在移动端完成英语学习整个一套闭环的学习系统。

为什么要做APK瘦身?

一个很现实的事情是,到上个月底有23.49%用户使用移动网络使用App,其中有4.09%用户还在使用2G网络,这是一个很可怕的数字,因为到今天为止仍在使用Android2.3的用户已经是1%甚至连1%都不到的在网用户量,然而使用2G网络用户还有4.09%。因为现在用户使用移动网络时有一个比较高的成本,大致如果要超了套餐1M在0.1元左右,如果做一次App更新或者一个新用户安装用户成本是多少?现在国内应用市场还是劣币驱逐良币的环境,没有一家市场能够做到50%以上的量,意味着很多市场还是属于不是Sister map,带来最大的问题是并没有一个进网安装权限,一旦如果涉及到应用更新,没有办法做到用户无感知进行更新,用户会很烦这件事,有一些第三方市场会用Work round,比如做自动点击,这不是很好的解决方案。在升级成本本身除了费用上的成本,还有用户操作成本的情况下,结合这两者就带来了一个结果,用户对APK大小非常敏感,这里指的是Android用户。APK大小会带来两个附加影响,分别是安装时间,很好理解,当可视性文件跟so文件,变大安装时间一定会有影响,不管是在安装5.0之前,从DEX到ODEX的优化,还是安装5.0之后从DEX到OAT文件的预编译,时间肯定是正常的。还有一个问题是安装成功率,为什么APK大小对安装成功率有影响?比如1.0版本是10M,1.1版本变成了100M,用户只有50M空间,这当然是个极端例子,类似这样的问题就会导致如果APK大小突然变大,也有可能导致下发出现问题。

APK瘦身

APK瘦身只有一个大小的概念,谈到APK瘦身涉及到四个不同大小。首先是Raw APK Size,APK文件大小。除此之外还有三个不同的,Download Size,为什么跟Raw APK Size不一样?最早是国外做,但现在已经有很多国内市场也会做,在下发时会做一层,最简单可以做把APK本身在传输时做一层封装。第三点是在安装时,因为需要对DEX文件和so文件做相应操作,so文件跟DEX文件不一样,so文件需要拷贝出来,本身占用的体积一定跟APK Size不一样。最后一个是Update Size,为什么跟APK文件本身大小不一样?因为现在大部分应用市场已经做了这点,如果好一些可能会有自研的东西,可以做到一点,更新一个App,下载的并不是一个完整的APK,而是下载一个diff文件,本地合成完整的APK,从而减少用户在网络传输流量上的压力。

这四个Size当中,作为应用开发者最关心的应该是第一个和第三个,能控制的是第一个和第三个,不是说第二个和第四个没有办法控制,国内炒得非常热的插件化和Hotfix,就能够部分意义上解决第二个和第四个在应用开发者这一侧的控制问题。

简单看一下APK文件的生命周期。在前两行是APK文件生成和打包过程,从Source Code到class,到Dex文件。Resources和Native Code,在后面会插进来,Resources本身的流程当中会有一个简单的优化,APK会做,就现在的时间点来说比较傻,甚至还会有把Resources文件越压越大的问题。因为需要做不管是Dex到Odex的优化,还是要做Dex到OAT文件的预编译,这边一定会产生文件大小上的影响,会变大。Native code都是黄线,往下走时直到今天,Google在处理Native code还是使用了比较原始的方案,会把相应版本以so文件拷贝出来。

音频文件,是时候该放弃mp3了,如果App中包含了音频文件,建议大家直接选择aac,在任何意义上都比mp3好得多,在同样的编码率下可以平均能够减少20%的Size。图片文件都可以脚本化做,不应该由人工做这件事。首先要把meta data删掉,第二步要做无损压缩,格式选定时也可以用一些简单标准做一个判断,

最后要做的,App本身有做这样的优化,在这样的情况下手动做这些优化App是不知道的,做了这样的优化,把App本身比较笨的优化关掉,否则会发现好不容易压下来的东西会被App重压过以后变大了。


本文作者:刘晓旭

来源:51CTO

这篇关于扇贝张志博--APK瘦身的实践与演进的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/215191

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更