当前位置: 首页 > news >正文

Android性能优化之应用瘦身(APK瘦身)

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。

目录

  • 一、导读
  • 二、概览
    • 2.1 apk组成
  • 三、优化方向
    • 3.1 源代码
      • 3.1.1 代码混淆
      • 3.1.2 移除无用代码
      • 3.1.3 三方库的处理
    • 3.2 资源文件
      • 3.2.1 方式一 Inspect Code
      • 3.2.2 方式二
      • 3.2.3 方式三 腾讯的 Matrix
    • 3.2.4 资源混淆
    • 3.3 so瘦身
  • 四、 推荐阅读

在这里插入图片描述

一、导读

我们继续总结学习Android 知识,温故知新。

lint检查代码

二、概览

APK瘦身优化的优先级相对来说是比较低的,因为优化后也并不能明显的看到有什么好处,这一块主要影响转换率,应用越小,
可能用户下载的意愿就越高,另外在进行预装时,也有大小的要求。

一般来说我们可以通过下面几种方式来进行优化:

  • 资源文件:压缩;动态下载。
  • so文件:动态so;不同的架构支持(v7a、v8a)。
  • 源代码:用代码分析工具,去除不再使用的代码;插件化。
  • assets:动态下载;压缩。
  • proguard 混淆代码

2.1 apk组成

直接将apk 拖到android studio窗口,或者我们把apk解压后,能看到下面这些文件

文件描述
classes(有多个).dexJava Class,被DEX编译后可供Dalvik/ART虚拟机所理解的文件格式
lib存放so文件,可能有多种架构
assets程序资源,使用AssetManager来调用
res资源文件,如:drawable、layout
AndroidManifestAndroidManifest
resources.arsc编译后的二进制资源文件
META-INF包含了APK中所有文件的签名摘要等信息

三、优化方向

我们的优化方案,就对应这apk的组成

3.1 源代码

3.1.1 代码混淆

3.1.2 移除无用代码

  1. studio 自带的工具
    在这里插入图片描述

  2. 使用CPD/PMD工具
    PMD是一个源代码分析器。它发现常见的编程缺陷,如未使用的变量、空的catch块、不必要的对象创建,等等.
    PMD 网站
    PMD GUI网站:

  3. 使用切面编程的方式进行统计(AOP),确认无用代码。

3.1.3 三方库的处理

统一基础库
统一三方调用的库等等

原则是同样的功能,不要出现多套代码。

3.2 资源文件

  1. 删除冗余资源

  2. 资源混淆

  3. 资源压缩

    • jpg:采取压缩算法,不支持透明通道
    • png:无损压缩,支持透明度
    • webp:无损压缩图像格式,与JPG相比,可大幅减少文件体积

虽然png是无损压缩。但是也有一些网站可以对png图片进行有损压缩,比如tinypng网站

  1. 资源在线化,动态下载
    对于一些比较大,又不是很及时要用的图片,可以考虑从服务端下载。

可以使用下面三种方式找出无用的资源

3.2.1 方式一 Inspect Code

  1. 通过Android Studio 菜单栏 → code → Inspect Code
  2. 在弹出的框框中选择 configure (在右下键)
  3. 在弹出的框框中输入 unused resources(在左上角),勾选对应的选项
  4. 点击开始

如下图
在这里插入图片描述

这里的选项实在是很多,我们只找出未使用的资源文件,最好先将其他的选择全取消,然后在勾选 unused resources
在这里插入图片描述

这时候就开始分析项目了,我们耐心等待一会
在这里插入图片描述

3.2.2 方式二

菜单栏 → Refactor → Remove Unused Resources
在这里插入图片描述

这样直接就开始删了,当然要检查下,不要误删。

3.2.3 方式三 腾讯的 Matrix

Matrix是微信终端自研和正在使用的一套APM(Application Performance Management)系统。
Matrix-ApkChecker 作为Matrix系统的一部分,是针对android安装包的分析检测工具,根据一系列设定好的规则检测apk是否存在特定的问题,
并输出较为详细的检测结果报告,用于分析排查问题以及版本追踪。Matrix-ApkChecker以一个jar包的形式提供使用,
通过命令行执行 java -jar ApkChecker.jar 即可运行。

也可以配置一下

java -jar matrix-apk-canary-2.1.0.jar --config CONFIG-FILE-PATH

matrix git 搜索APK Checker,这里有个下载链接,点击下载jar包。

Matrix apkchecker 文档

CONFIG.json文件,也可以之间用官网的,最终会生成两个文件,之间查看即可

{"--apk":"E:\\release.apk","--mappingTxt":"E:\\mapping.txt","--output":"E:\\","--format":"mm.html,mm.json","--formatConfig":[{"name":"-countMethod","group":[{"name":"Android System","package":"android"},{"name":"java system","package":"java"},{"name":"com.tencent.test.$","package":"com.tencent.test.$"}]}],"options": [{"name":"-manifest"},{"name":"-fileSize","--min":"10","--order":"desc","--suffix":"png, jpg, jpeg, gif, arsc"},{"name":"-countMethod","--group":"package"},{"name":"-checkResProguard"},{"name":"-findNonAlphaPng","--min":"10"},{"name":"-checkMultiLibrary"},{"name":"-uncompressedFile","--suffix":"png, jpg, jpeg, gif, arsc"},{"name":"-countR"},{"name":"-duplicatedFile"},{"name":"-unusedResources","--rTxt":"E:\\R.txt","--ignoreResources":["R.raw.*","R.style.*","R.attr.*","R.id.*","R.string.ignore_*","R.dimen.*","R.string.*","R.color.*"]},{"name":"-unusedAssets","--ignoreAssets":["*.so" ]}]
}

通过这种方式,我们回得到一个html分析的结果表格,但是我们看到的都是混淆过到资源文件,这时 可以使用 aapt2 来输出apk资源表的内容(resources.arsc文件):

aapt2 dump resources xxx.apk > logx.txt

3.2.4 资源混淆

3.3 so瘦身

动态so;
指定架构支持(如v7a、v8a);

另外还可以只保留一个cpu架构,别的cpu架构自动适配,程序运行过程中,通过判断cpu架构选择合适的so

if(v7a) {xxx
} else {xxx
}

还有就是插件化,这个是一个专题,我们在另外的文章里面讲。

四、 推荐阅读

Java 专栏

SQL 专栏

数据结构与算法

Android学习专栏

ddd

http://www.lryc.cn/news/165641.html

相关文章:

  • C语言数组和指针笔试题(二)(一定要看)
  • uniapp——实现在线选座功能——技能提升
  • 领域驱动设计:微服务的各种边界
  • MySQL之数据类型
  • 词法作用域改变词法作用域
  • 关于C++的隐藏 (hidden),重载(overload),重写(override)小结。
  • 算法通关村18关 | 透析回溯的模板
  • 【论文阅读】Untargeted Backdoor Attack Against Object Detection(针对目标检测的无目标后门攻击)
  • 分库分表---理论
  • [golang 流媒体在线直播系统] 2.搭建基于golang的流媒体服务器实现拉流推流,以及Html客户端拉取hls类型的流
  • 9月12日作业
  • React框架下如何集成H.265网页流媒体视频播放器EasyPlayer.js?
  • 《向量数据库》——向量数据库的使用场景有哪些?
  • Java 中 List 集合取补集
  • 我的个人网站——宏夏Coding上线啦
  • 【机器视觉】喇叭的外圆以及金属内圆的同心度视觉检测--康耐德智能
  • STM32WB55开发(2)----修改蓝牙地址
  • 【1++的C++进阶】之C++11(二)
  • 【VS2022】调试
  • python:使用RESTful API(flask)调用python程序传递参数,实现Web端调用python程序
  • 贪心算法(Greedy Algorithm)
  • 论文阅读 - Outlier detection in social networks leveraging community structure
  • 【操作系统】进程控制
  • Linux命令200例:expr一个用于进行数值表达式求值的工具
  • 当你的公司突然开始大量的裁员,被留下的你,真的准备好面对以后了吗?
  • 预约陪诊就诊小程序源码多城市开发版
  • upload-labs文件上传靶场实操
  • leetcode分类刷题:队列(Queue)(二、优先队列解决TopK简单问题)
  • 【排障记录】扩展坞USB 3.0能用而2.0不能用
  • 01-从JDK源码级别剖析JVM类加载机制