android app性能优化_Android性能优化之Apk 瘦身优化

00fcb49074a7a210bb01b5a4265127f7.png

瘦身

  1. 主要是下载转换率提高
  2. 头部App都有Lite版本
  3. 渠道合作产商要求

APK 分析工具

ApkTool 反编译工具

官网:https://ibotpeaches.github.io/ApkTool apktool d students.apk

Analyze apk

Android studio 2.2之后使用 - 查看apk组成大小,各资源占比 - 查看dex文件组成 - 可以进行apk对比

通过Analyze app分析(打开方式:Android Studio下 ——> Build——> Analyze app

classyshark 二进制检查工具

https://github.com/google/android-classyshark 支持多种格式:apk,jar,class,so

nimbledroid app 性能指标系统

https://nimbledroid.com/ 可以通过上传apk得知: - 文件大小及排行 - Dex方法数、SDK方法数 - 启动时间、内存等

APK 组成

APK包结构如下:

  • lib/:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多数情况下我们可以只用一种armeabi-v7a。
  • assets/:包含应用可以使用AssetManager对象检索的应用资源。
  • res/:包含未编译到的资源 resources.arsc,主要有图片资源文件。
  • META-INF/:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件。
  • resources.arsc:包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像。
  • classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。
  • AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。

对lib文件目录进行瘦身

往往进行NDK开发的时候,so文件都比较大,将ndk修改为如下:

ndk{//设置支持的so库架构abiFilters "armeabi-v7a"}

armeabi-v7主要不支持ARMv5(1998年诞生)和ARMv6(2001年诞生).

而许多基于 x86 的设备也可运行 armeabi-v7a 和 armeabi NDK 二进制文件。对于这些设备,主要 ABI 将是 x86,辅助 ABI 是 armeabi-v7a

如果适配版本高于4.1版本,可以直接上面这样写,当然,如果armeabi-v7a不是设备主要ABI,那么会在性能上造成一定的影响。

优化res,assets文件

手动lint检查,手动删除无用资源

Android Studio中打开“Analyze” 然后选择"Inspect Code...",范围选择整个项目,然后点击"OK"。

使用tinypng等图片压缩工具对图片进行压缩。

打开网址,将大图片导入到tinypng,替换之前的图片资源。

大部分图片使用Webp格式代替。

可以给UI提要求,让他们将图片资源设置为Webp格式,这样的话图片资源会小很多。当然,如果对图片颜色通道要求不高,可以考虑转jpg,最好用webp,因为效果更佳。

尽量不要在项目中使用帧动画

一个帧动画几十张图片,再怎么压缩都还是占很大内存比重的。所以建议是让UI去搞,这里可以参考使用lottie-android,如果项目中动画效果多的话效果更加明显。

使用gradle开启shrinkResources

每1000行代码在apk当中才会占用5kb的空间

设置shrinkResources true移除无用资源文件

要通过 ProGuard 启用代码压缩,请在 build.gradle 文件内相应的构建类型中添加 minifyEnabled true:对无用的代码进行删除

  • minifyEnabled 这个是用来开启删除无用代码,比如没有引用到的代码
  • shrinkResources 用来开启删除无用资源,也就是没有被引用的文件(经过实测是drawable,layout,实际并不是彻底删除,而是保留文件名,但是没有内容,等等),但是因为需要知道是否被引用所以需要配合mififyEnable使用,只有当两者都为true的时候才会起到真正的删除无效代码和无引用资源的目的

同样的资源代码测试

  • 只有minififyEnable false或者 minififyEnable false && shrinkResources true

APK大小为1.39M 资源文件和layout都存在且是有内容的

  • 只有minifyEnable true

866K 资源文件和layout都存在且是有内容的

  • minifyEnable true && shrinkResources true

资源文件在但是没有内容大小都变成67字节,layout文件内容被清空

减少chasses.dex大小

classes.dex中包含了所有的java代码,当你打包时,gradle会将所有模板力的.class文件转换成classes.dex文件,当然,如果方法数超过64K,将要新增其他文件进行存储。可以通过multidexing分多个文件,比如这里的classes2.dex。换句话说,就是减少代码量。我们可以通过以下方法来实现:

  • 尽量减少第三方库的引用,这个在上面我们已经做过优化了。
  • 避免使用枚举,可能几十个枚举的内存占有量才相当一张图片这样子,优化效果也不会特别明显。当然,如果你是个追求极致的人,我不反对你用静态常量替代枚举。
  • 如果你的dex文件太大,检查是否引入了重复功能的第三方库(图片加载库,glide,picasso,fresco,image_loader,如果不是你一个人单独开发完成的很容易出现这种情况),尽量做到一个功能点一个库解决。

第三方库处理

  • 基础库统一
  • 选择更小的库,Android Methods Count
  • 仅引入需要的部分代码:Fresco的webp支持

图片压缩

  • https://tinyjpg.com/
  • TinyPngPlugin
  • 选择不同的图片格式

其他

  • 7zip代替压缩资源。
  • 删除翻译资源,只保留中英文
  • 尝试将andorid support库彻底踢出你的项目。
  • 尝试使用动态加载so库文件,插件化开发。
  • 将大资源文件放到服务端,启动后自动下载使用。
  • Facebook的redex优化字节码 redexfacebook发布的一款android字节码的优化工具,需要按照说明文档自行配置一下。

redex input.apk -o output.apk --sign -s <KEYSTORE> -a <KEYALIAS> -p <KEYPASS>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java类的属性

在 Java 中类的成员变量定义了类的属性。例如&#xff0c;一个学生类中一般需要有姓名、性别和年龄等属性&#xff0c;这时就需要定义姓名、性别和年龄 3 个属性。声明成员变量的语法如下&#xff1a; [public|protected|private][static][final]<type><variable_nam…

vue 拖动 datatransfer 问题_electron-vue跨平台桌面应用开发实战教程(四)——窗口样式amp;打开新窗口...

&#xfeff;> 本文我们讲解下怎么修改窗口样式&#xff0c;系统默认的窗口非常普通&#xff0c;通常与设计不符&#xff0c;所以我们要自定义&#xff0c;接下来我们讲解下怎么去掉原有样式&#xff0c;怎么实现实现窗口的最小化&#xff0c;最大化和关闭按钮。还有怎么打开…

string 包含_一文搞懂String常见面试题,从基础到实战,到原理分析和源码解析...

01 string基础1.1 Java String 类字符串广泛应用 在 Java 编程中&#xff0c;在 Java 中字符串属于对象&#xff0c;Java 提供了 String 类来创建和操作字符串。1.2 创建字符串创建字符串最简单的方式如下:String greeting "菜鸟教程";在代码中遇到字符串常量时&…

RPN网络在图像处理中的应用

RPN&#xff08;Region Proposal Network&#xff0c;区域建议网络&#xff09;是深度学习中用于目标检测的关键组件之一&#xff0c;它通常与后续的目标检测网络&#xff08;如Fast R-CNN、Faster R-CNN等&#xff09;结合使用。RPN的主要作用是生成候选目标区域&#xff0c;从…

Java创建一个学生类

创建一个表示学生的实体类 Student&#xff0c;其中有学生姓名、性别和年龄信息。要求使用属性来表示学生信息&#xff0c;最终编写测试代码。 首先定义一个名为 Student 的类&#xff0c;代码如下&#xff1a; public class Student {// 学生类 }在类中通过属性定义学生、性…

pythonwhile爬虫教程_Python 爬虫从入门到进阶之路(十一)

之前的文章我们介绍了一下 Xpath 模块&#xff0c;接下来我们就利用 Xpath 模块爬取《糗事百科》的糗事。之前我们已经利用 re 模块爬取过一次糗百&#xff0c;我们只需要在其基础上做一些修改就可以了&#xff0c;为了保证项目的完整性&#xff0c;我们重新再来一遍。我们通过…

python中fd是什么意思_python里fd是什么意思

文件描述字(file descriptor&#xff0c;fd)是系统中用来唯一记录当前已经打开的文件的标识号&#xff0c;fd是一个整数。除了file对象外&#xff0c;Python还提供对fd的操作&#xff0c;对fd的操作更加底层&#xff0c;fd和Python中的file对象是不同的概念。在介绍file对象时已…

show index mysql_MySQL SHOW INDEX语法的实际应用

以下的文章主要描述的是MySQL SHOW INDEX语法的实际操作用法以及其实际查看索引状态(语法)的具体内容的描述&#xff0c;如果你对这一技术&#xff0c;心存好奇的话&#xff0c;以下的文章将会揭开它的神秘面纱。SHOW INDEX FROM tbl_name [FROM db_name]MySQL SHOW INDEX会返回…

阿联酋esma认证怎么做_百度爱采购企业认证是怎么做的?这些你要知道!

入驻百度爱采购的企业可以获得认证标识&#xff0c;这个标识是企业品牌树立的重要表现&#xff0c;在产品展示页面和百度首页搜索企业名称都有企业信息的醒目展示&#xff0c;并且可以直接跳转到企业店铺&#xff0c;为企业带来流量的同时&#xff0c;还能进行品牌的宣传。百度…

Java this关键字详解

this 关键字是 Java 常用的关键字&#xff0c;可用于任何实例方法内指向当前对象&#xff0c;也可指向对其调用当前方法的对象&#xff0c;或者在需要当前类型对象引用时使用。 this.属性名 大部分时候&#xff0c;普通方法访问其他方法、成员变量时无须使用 this 前缀&#…

zabbixdocker里的mysql_基于Docker安装与部署Zabbix

今天测试了一天的Zabbix-Docker&#xff0c;部署起来确实方便&#xff0c;就需要在安装了Docker的linux系统中输入以下命令就可以了。1.安装MysqL数据库,启动一个空的MysqL服务器实例docker run Cname zabbix-DB -t \-e MysqL_DATABASE”zabbix” \-e MysqL_USER”zabbix” \-e…

Java创建对象详解

对象是对类的实例化。对象具有状态和行为&#xff0c;变量用来表明对象的状态&#xff0c;方法表明对象所具有的行为。Java 对象的生命周期包括创建、使用和清除, Java 语言中创建对象分显式创建与隐含创建两种情况。 显式创建对象 对象的显式创建方式有 4 种。 1. 使用 new …

python matplotlib模块教程_Python中的Matplotlib模块入门教程

1 关于 Matplotlib 模块Matplotlib 是一个由 John Hunter 等开发的&#xff0c;用以绘制二维图形的 Python 模块。它利用了 Python 下的数值计算模块 Numeric 及 Numarray&#xff0c;克隆了许多 Matlab 中的函数&#xff0c; 用以帮助用户轻松地获得高质量的二维图形。Matplot…

人脸离线识别模块_人脸消费机离线刷脸如何实现?

随着越来越多刷卡刷脸一卡通的设备出现。大家在享受一卡通的便利的同时。也在考虑人脸消费机的基本功能和安全属性&#xff0c;人脸消费机&#xff0c;是指人脸在消费访客管理方面的相关。在人脸刷脸进行消费的时候是一下几个阶段1.人脸特征提取首先得先让人脸消费机看到你的脸…

Java匿名对象

创建对象的格式如下&#xff1a; 类名称 对象名 new 类名称();每次 new 都相当于开辟了一个新的对象&#xff0c;并开辟了一个新的物理内存空间。如果一个对象只需要使用唯一的一次&#xff0c;就可以使用匿名对象&#xff0c;匿名对象还可以作为实际参数传递。 匿名对象就是…

mysql中的钱null_MySQL数据库中null的知识点总结

在mysql数据库中&#xff0c;null是一个经常出现的情况&#xff0c;关于mysql中的null&#xff0c;有哪些注意事项呢&#xff1f;下面简单总结归纳下&#xff0c;后续会不断补充。1. is null首先判断数据库中某一列的值是否为null&#xff0c;不能用等于来判断&#xff0c;必须…

Java访问对象的属性和行为

每个对象都有自己的属性和行为&#xff0c;这些属性和行为在类中体现为成员变量和成员方法&#xff0c;其中成员变量对应对象的属性&#xff0c;成员方法对应对象的行为。 在 Java 中&#xff0c;要引用对象的属性和行为&#xff0c;需要使用点&#xff08;.&#xff09;操作符…

junit版本_Junit-jupiter-api 和 junit-jupiter-engine 的区别是什么

我们都知道 JUnit 是用于进行单元测试的。但是 Junit 5 和 Junit 4 的区别比较大。 很多时候你可能会遇到 Junit 引擎配置错误导致测试无法进行。junit-jupiter-api JUnit 5 Jupiter API 的测试&#xff0c;你需要使用这个 API 来写测试和进行扩展。junit-jupiter-engine JUnit…

Java对象的销毁

对象使用完之后需要对其进行清除。对象的清除是指释放对象占用的内存。在创建对象时&#xff0c;用户必须使用 new 操作符为对象分配内存。不过&#xff0c;在清除对象时&#xff0c;由系统自动进行内存回收&#xff0c;不需要用户额外处理。 Java 语言的内存自动回收称为垃圾…