Android APK 瘦身 - JOOX Music项目实战

2024-03-23 18:48

本文主要是介绍Android APK 瘦身 - JOOX Music项目实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导语

JOOX Music是腾讯海外布局的一个音乐产品,2014年发布以来已经成为5个国家和地区排名第一的音乐App。东南亚是JOOX Music的主要发行地区,由于JOOX Music所面对的市场存在很多的低端机型,并且这些市场的网络环境相对来说是比较差的,为了提升下载转化率,对JOOX Music进行APK瘦身是必不可免的。

JOOX Music版本大小变化

JOOX Music(后面简称JOOX)现在已经在进行V3.8版本的开发了,不过,在这之前JOOX经历了从V2.1版本的18M暴涨到V3.1版本的51M,再到V3.7版本的36M暴瘦,在这涨幅33M到跌幅15M的期间(JOOX Android端是往GP上放的,不过为了方便,这里说的Size就指APK的大小而不是Download Size),它到底经历过了什么呢?接下来让我们细细品味~

JOOX裁包过程经历V3.5, V3.6, V3.7三个版本,并不是一次性‘水到渠成’的哦。本文主要介绍JOOX产品在Android端的APK大小裁剪所用到的方法,主要从理论,实践以及可持续化三个主要的方面进行介绍。

一,理论知识

首先,先上一下理论知识,毕竟任何事情都是先有理论然后再去实践的嘛。JOOX的减包主要通过一下几方面进行的:

  1. 图片资源
  2. 代码方面(JAR包,so库等等)
  3. 资源混淆

这里会根据上面三个方面进行理论介绍。不过,在这之前需要先给大家介绍一个Android Studio2.2提供的神器:Analyze APK。

如图,我们只需要将要分析的APK拖入到Android Studio中,通过该工具我们可以清楚的观察到我们的APK中各个部分所占的比重是多少,而且通过目录索引我们可以快速定位出导致APK变大的是哪些文件从而加快我们的APK瘦身速度。想要了解更多可以查看如下文章:

《使用 APK Analyzer 分析你的 APK》

1. 图片资源方面

图片资源基本上都是APP中占比重最大的一块,而且对于图片资源的优化对比于其他的方式来说是最简单的,一般也是最容易看到效果的。所以,我们先从图片资源方面入手。

对于大多数APP来说,基本上图片资源主要都是由PNG和JPG来组成的,PNG和JPG是最常见的图片格式了,这里我就不做过多的介绍了。一般来说,对于图片资源减包这方面,主流的做法都是采取一下方式进行的:

  1. 删除无用资源
  2. 压缩PNG图片,并将能转成JPG的图片进行转换
  3. 压缩JPG图片

以上是我们最常见的做法,也是最有效的方式,不过对于JOOX来说,这里面多加了一项做法,那就是把图片向WebP进行转换。


盗图一张~

WebP是Google在2010年发布的,现在WebP包含有损压缩,无损压缩,以及透明通道的有损压缩,上图是WebP和PNG的比较。根据官方给出的数据,基本上对于PNG进行无损压缩能有效减小30%的大小,对比于JPG格式转换成WebP基本上也是30%左右,而如果将图片进行有损WebP化的话,基本上就只有原图的1/3大小了,所以WebP的压缩比例显而易见。最重要的是,最新的数据显示,WebP在解码方面基本上和PNG差不多,甚至有时候比PNG快!如果想对WebP有更多的了解可以看看这篇文章:

《WebP原理和Android支持现状介绍》

基本上,对于Android4.0的手机就有对WebP的支持了,不过根据相关的数据显示,对于Android 4.1才开始对WebP有了比较稳定的部分支持(即大多数只支持不含alpha通道的WebP图片),Android 4.2才基本完全支持WebP。

所以,这里总结一下JOOX为什么要使用WebP的理由:

  1. WebP图片相对于PNG和JPG占用的空间更小

  2. WebP在解码方面基本上和PNG差不多,甚至有时候比PNG快

  3. JOOX目前最低支持的Android系统为4.1,而Android 4.1对WebP有了初步的支持

2. 代码方面

为了方便大家阅读这一节,我下面用A,B,C英文字母标注了一下。

a)

这篇关于Android APK 瘦身 - JOOX Music项目实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

Python项目打包部署到服务器的实现

《Python项目打包部署到服务器的实现》本文主要介绍了PyCharm和Ubuntu服务器部署Python项目,包括打包、上传、安装和设置自启动服务的步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录一、准备工作二、项目打包三、部署到服务器四、设置服务自启动一、准备工作开发环境:本文以PyChar

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(