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,一经查实,立即删除!

相关文章

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;从…

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

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

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

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

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

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

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…

mysql数据库基础简介_MySql数据库基础之数据库简介及安装

MySql数据库简介&#xff1a;众所周知&#xff0c;MySql数据库是一款开源的关系型数据库&#xff0c;在Web应用方面&#xff0c;MySql是最好的、最流行的RDBMS(Relational Database Management System,关系型数据库管理系统)应用软件。MySql的4大特点&#xff1a;1.MySql是开源…

Java访问控制修饰符详解

在 Java 语言中提供了多个作用域修饰符&#xff0c;其中常用的有 public、private、protected、final、abstract、static、transient 和 volatile&#xff0c;这些修饰符有类修饰符、变量修饰符和方法修饰符。 在实际生活中&#xff0c;如果要获取某件物品&#xff0c;与其直接…

为资产分类定义折旧范围_RFID固定资产管理系统方案

项目介绍随着经济的不断发展&#xff0c;企业的规模日益壮大&#xff0c;固定资产管理作为企业资产管理最要的一部分&#xff0c;一直是企业关注的难题。由于固定资产具有价值高&#xff0c;使用周期长、使用地点分散的特点、相关责任人员多&#xff0c;在实际工作中不容易做到…

ssh中c3p0连接mysql_JSP+SSH+Mysql+C3P0实现的传智播客网上商城

项目简介本系统是传智播客授课时的开发案例&#xff0c;基于JSPSSHMysql的简单网上商城。在当代开发中&#xff0c;SSH的使用已经逐渐被SSM取代&#xff0c;但不代表我们不需要学习SSH&#xff0c;该系统简单&#xff0c;但功能齐全可以作为SSH框架初学者的入门项目。难度等级&…

zabbix配置mysql监控_【zabbix】zabbix配置MySQL监控

说明&#xff1a;除最后的测试步骤之外&#xff0c;以下操作均在zabbix的agent端(被监控端)执行一、环境准备&#xff1a;1、操作系统&#xff1a;CentOS 5.6 (zabbix server端)CentOS 5.6 (zabbix agent端)2、数据库&#xff1a;MySQL 5.6 (安装在agent端的数据库)3、软件&…

北信源管理网页卸载密码_Homebrew: 一行代码实现mac软件管理

Homebrew是一款帮助我们管理软件的软件。任何开源软件都可以通过Homebrew的一行代码完成软件的下载、升级或卸载等。目前Homebrew主要适用macOS或Linux系统。(Windows系统下的类似软件叫Chocolatey&#xff0c;功能相近&#xff0c;使用方法类似。详情请见https://chocolatey.o…

java集合基础_java常用集合基础知识

【纯出自个人笔记&#xff0c;如有错误&#xff0c;望改正&#xff0c;谢谢哈!学习~】一、Java集合1、集合类&#xff1a;容器类 装对象的(不能存放基本数据类型&#xff0c;但是里面看到的其实是包装类型)java.util包ArrayList底层是一个对象数组----------------------------…

java cookie安全_cookie的安全性问题

HTTP协议&#xff1a;(1)请求组成部分&#xff1a;请求行&#xff1a;(get或者post请求&#xff1b;请求路径(不包括主机) &#xff1b;http1.1)请求头&#xff1a;请求头是浏览器交给服务器的一些信息(比较cookie啥的)请求体&#xff1a;只有post请求有请求体&#xff0c;get请…

java幻灯片播放代码_简单常用的幻灯片播放实现代码

幻灯片自动播放图片是当前网站比较流行的一个展示方式。在网上我们能找到各种特效丰富的幻灯片插件和代码。这里项目需要&#xff0c;我自己做了一个简单的&#xff0c;就不详细讲解了&#xff0c;代码很简单。直接看效果图和代码吧。所有代码 ppt.html&#xff0c;需要提供相应…

ssms没有弹出服务器验证_powerbi报表服务器搭建链接

作品展示​www.chinapowerbi.com安装 Power BI 报表服务器所要满足的硬件和软件要求 - Power BI​docs.microsoft.comDownload 用于基于 x64 的系统的 Windows 8.1 更新程序 (KB2919442) from Official Microsoft Download Center​www.microsoft.comDownload Windows Server 2…

groovy java_在java中使用groovy怎么搞

临摹微笑一种基于Java虚拟机的动态语言&#xff0c;可以和java无缝集成&#xff0c;正是这个特性&#xff0c;很多时候把二者同时使用&#xff0c;把groovy作为java的有效补充。对于Java程序员来说&#xff0c;学习成本几乎为零。同时支持DSL和其他简介的语法(例如闭包)&#x…

mysql 类似wm concat_oracle的wm_concat()和mysql的group_concat()合并同列变成一行的用法以及和concat()合并不同列的区别...

前言标题几乎已经说的很清楚了&#xff0c;在oracle中&#xff0c;concat()函数和 “ || ” 这个的作用是一样的&#xff0c;是将不同列拼接在一起&#xff1b;那么wm_concat()是将同属于一个组的(group by)同一个字段拼接在一起变成一行。mysql是一样的&#xff0c;只不过mysq…

试图将驱动程序添加到存储区_基于容器的块存储使用

什么是块存储&#xff1f;分布式存储系统&#xff0c;为业务与数据在集群内漂移提供了自由保障&#xff0c;满足企业对于不受约束的系统环境要求。同时&#xff0c;平台仅保存迁移被改动的数据&#xff0c;而非整体增加数据量&#xff0c;实现增量备份。魔方云块存储的功能&…