【Andoroid】之【APK瘦身】

news2024/11/26 8:33:31

一、如何查看 APK 的组成

如果要优化 APK 的大小,我们首先需要知道我们编译出来的 APK 都包含哪些东西,然后针对占用大的做裁剪,或者删除不需要的东西,从而达到瘦身的目的。

查看 APK 的内容占用情况很简单,打开 AS ,把 APK 拖到 AS 里面就可以查看 APK 包含的内容了。

通过Android Studio自带的Analyzer进行APK的分析。使用方法:

1、将一个apk拖动到Android Studio的编辑器窗口
2、在Project窗口中,双击build/output/apks/目录下的apk
3、在菜单栏中选择选择Build > Analyze APK,然后选择要分析的apk

在这里插入图片描述

分析问题,发掘优化点

从上图Analyzer可以发现,一个APK主要包含如下目录:

  • lib:包含了一些区分于处理器的编译代码,主要是SO文件,一般里面包含很多子目录,例如armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, and mips。

  • res:包含了一些不会被编译到resources.arsc的资源文件。如drawable文件、layout文件等。

  • assets:包含了一些通过AssetManager能够检索到的资源。如MP3、字体、webp等资源文件。

  • META-INF:包含了CERT.SF和CERT.RSA签名文件,还有MANIFEST.MF文件。
    除此之外,还包含了如下的文件:

  • resources.arsc:包括了所有可以被编译的位于res/values/目录下的XML资源。打包工具在打包过程中会把XML的内容编译成二进制的形式,亦或者把相关资源的引用路径编译成二进制,然后整合到该文件里面。例如string文件、layout的路径、图片的路径等。

  • classes.dex:包含了所有的Java文件编译后的class文件,class文件最终转化成该dex文件。一般文件都比较大,有的App有几个dex文件,这是因为单个DEX文件限制方法数在65536,所以当代码量过大时,就需要通过multiDex进行分包,拆分成多个dex文件,解决这个问题。

  • AndroidManifest.xml:整合了多个module的AndroidMainifest文件的权限、声明等配置到该文件。

知道了APK的组成部分,那么我们就可以针对这些文件/文件夹进行针对性的优化,每个App都不一样,但是方法都是大同小异,本文讲述瘦身策略也是针对这些目录和文件进行优化,这样可以显得更加有条理性。可以看出占大头的是 res 代码等,所以瘦身可以从这三个方面来考虑。

1)资源:无用资源删除、资源混淆。
2)So:只保留 Armeabi、更优方案。
3)代码:Proguard、统一三方库、无用代码删除。

二、如何减少 res 资源大小

① 删除冗余的资源

一般随着项目的迭代,部分图片等资源不再使用了,但是可能仍然被编译到了 apk 里面,所以可以删除这部分不再使用的资源,可以使用 lint 工具来搜索项目中不再使用的图片等资源。

② 重复资源的优化

除了有冗余资源,还有些是文件名不一样,但是内容一样的图片,可以通过比较 md5 值来判断是不是一样的资源,然后编辑 resources.arsc 来重定向。

③ 图片压缩

未压缩的图片文件占用空间较大,可以考虑压缩未压缩过的图片来瘦身。常用的工具是 tinypng 网站。同时也可以借助 TinyPngPlugin 等插件或者其他开源工具来帮助压缩图片。

④ 使用lint删除无用资源

在多人开发过程中,通常都会有漏删无用资源的问题,图片资源也不例外,例如需要删除一个模块的代码时,很容易就会漏删资源文件,所以可以定期使用lint检测出无用的资源文件,原理这里不作介绍,使用方法非常简单,可以直接在AS里面使用,如下图所示。注意:lint检查出来的资源都是无直接引用的,所以如果我们通过getIdentifier()方法引用文件时,lint也会标记为无引用,所以删除时注意不要删除通过getIdentifier()引用的资源。

Analyze -> Run Inspection by Name -> 输入:Unused resources -> 跳出弹框选择范围即可

⑤ Proguard代码混淆

Proguard是一款免费的Java类文件压缩器、优化器和混淆器,Android Studio已经集成了这个工具,只要经过简单的配置,即可完成,如下代码所示,在build.gradle里面设置minifyEnabled 为ture,同时在proguardFiles指向proguard的规则文件即可。

android {
    buildTypes{
        minifyEnabled true
        proguardFiles 'proguard.cfg'
    }
}

⑥ 打开shrinkResources

shrinkResources是在编译过程中用来检测并删除无用资源文件,也就是没有引用的资源,minifyEnabled 这个是用来开启删除无用代码,比如没有引用到的代码,所以如果需要知道资源是否被引用就要配合minifyEnabled使用,只有两者都为true时才会起到真正的删除无效代码和无引用资源的目的。打开方式也是非常简单,在build.gralde文件里面打开即可:

android {
    buildTypes{
        minifyEnabled true
        shrinkResources true
    }
}

⑦ 使用AndResGuard压缩

通过将资源路径 res/drawable/wechat 变为 r/d/a 的方式来减少 apk 的大小,当 apk 有较多资源项的时候,效果比较明显,这是一款微信开源的工具,他的原理类似Java Proguard。详细使用方法参照Github,详细地址是:AndResGuard

⑧ 指定语言

如果没有特殊的需求的话,可以只编译中文,因为其他的语言用不上,如果用不上的语言编译了,会在 resource 的表里面占用大量的空间,故

android {
    defaultConfig {
        ...
        // 仅支持 中文
        resConfigs "zh" 
    }
}

三、如何减少 so 库资源大小

① 自己编译的 so

release 包的 so 中移除调试符号。可以使用 Android NDK 中提供的 arm-eabi-strip 工具从原生库中移除不必要的调试符号。
如果是 cmake 来编译的话,可以再编辑脚本添加如下代码

set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")

② 别人编译的 so

联系作者修改,一般很难联系到。

③ 动态下发 so

可以通过服务器下发 so , 下载完后再进入应用,但是体验不好,但是是一个思路。

④ 只编译指定平台的 so

一般我们都是给 arm 平台的机器开发,如果没有特殊情况,我们一般只需要考虑 arm 平台的。具体的方法是 app 下的 build.gradle 添加如下代码

android {
    defaultConfig {
        ndk {
            abiFilter "armeabi"
        }
    }
}

各个平台的差别如下:

平台说明
armeabi-v7aarm 第 7 代及以上的处理器,2011 年后的设备基本都是
arm64-v8aarm 第 8 代 64 位处理器设备
armeabiarm 第 5、6 代处理器,早期的机器都是这个平台
x86x86 32 位平台,平板和模拟器用的多
x86_64x86 64 位平台

四、如何减少代码资源大小

① 一个功能尽量用一个库

比如加载图片库,不要 glide 和 fresco 混用,因为功能是类似的,只是使用的方法不一样,用了多个库来做类似的事情,代码肯定就变多了。

② 混淆

混淆的话,减少了生成的 class 大小,这样积少成多,也可以从一定层度减少 apk 的大小。

③ R 文件内联

通过把 R 文件里面的资源内联到代码中,从而减少 R 文件的大小。
可以使用 shrink-r-plugin 工具来做 R 文件的内联

五、参考文档

  • APK瘦身-是时候给App进行减负了

  • Android apk包瘦身的几种方式

  • Android 性能优化总结

  • 深入探索 Android 包体积优化(匠心制作-上)

  • 深入探索 Android 包体积优化(匠心制作-下)

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

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

相关文章

进程间通信,有名管道(pipe)与无名管道(fifo)的解析与运用,以及代码实现

🎊【进程通信与并发】专题正在持续更新中,进程,线程,IPC,线程池等的创建原理与运用✨,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列…

API网关:开源Apinto网关-应用管理篇

需求痛点 在这互联网高速发展的时代,企业业务系统多、渠道广,如何管理内外部调用端系统具有极大的挑战。 数量方面:API网关需要对各端应用统一管理,例如对企业自身很多的前端应用,包括不限于web应用、移动APP、小程序&…

AI边缘计算智能分析网关灭火器缺失检测与告警的实现过程

AI智能分析网关基于边缘智能,部署了多种AI深度学习算法,可对接入的多路视频流进行智能检测、智能识别等,包括人脸检测与识别、车辆检测与识别、车牌识别、烟火识别、安全帽识别、区域入侵检测等。今天我们来介绍下关于灭火器缺失检测与告警的…

基于Yolov5/Yolov7的DRConv动态区域感知卷积,即插即用,涨点显著!

1.Dynamic Region-Aware Convolution 论文:https://arxiv.org/pdf/2003.12243.pdf 本文提出了一种新的卷积算法,称为动态区域卷积算法(DRConv) ,该算法能够自动将滤波器分配到相应的空间区域,因此,DRConv具有强大的语义表示能力,并完美地保持了平移不变性。 DRConv的…

在IIS7下使用ASP连接ACCESS数据库时提示如下错误的处理方法

“/”应用程序中的服务器错误。 未在本地计算机上注册“microsoft.jet.oledb.4.0”提供程序。 这是由于使用的Win2008系统是64位的,以前Win2003是32位。有以下两种解决方法: 1、修改连接数据库的代码: 如原代码是 DataPath "App_Data…

Eclipse代码提示突然失灵的解决方案

不知道改动了啥,突然间Eclipse的代码提示就失效了,发现缺少后极不方便。 使用快捷键:Alt/ 提示 No Default Proposals 为什么使用快捷键:Alt/ 会提示“No Default Proposals。”呢? 网上提示可能是热键冲突 但是一套…

可调直动差压卸荷阀DDRV-100、DBRV-100

优点: 及时响应压力变化。 低压升。 潜在调节(抗震动)。 调整位置可锁定。 铝制操作手柄和填料压盖。 坚硬化处理。 可调直动式卸荷阀 ZRV-63 0类 可调直动式卸荷阀 DRV2-080 系列8 可调直动式卸荷阀 DRV-080_*_H 系列8 直动可调式…

微服务架构详解(一)

目录 1.微服务简介 2.微服务技术选型 3.微服务核心组件 3.1.注册中心 3.1.1.注册中心对比 3.2.服务网关 3.2.1.主流API网关对比 3.3.分布式配置中心 3.4.服务容错(服务熔断) 3.5.负载均衡 3.5.1.负载均衡有好几种实现策略, 3…

读取配置文件(properties、yaml)的八种方法

基础&#xff1a; 一、通过普通的I/O流读取配置文件(BufferedReader) 1、properties文件 2、测试类 public class TestReadProperties {Testpublic void IOReadProperties() throws IOException {// 把配置文件的内容封装进mapMap<String, Object> map new HashMap&l…

视频可视化搭建项目,通过简单拖拽方式快速生产一个短视频

一、开源项目简介 《视搭》是一个视频可视化搭建项目。您可以通过简单的拖拽方式快速生产一个短视频&#xff0c;使用方式就像易企秀或百度 H5 等 h5 搭建工具一样的简单。目前行业内罕有关于视频可视化搭建的开源项目&#xff0c;《视搭》是一个相对比较完整的开源项目&#…

矿井下无人值守变电所电力监控系统的探讨与产品选型

摘要&#xff1a;为了探讨井下无人值守变电所的电力监控系统技术&#xff0c;以西山煤电马兰矿为背景&#xff0c;详细阐述了井下无人值守变电所电力监控系统技术的各项基本参数&#xff0c;如额定工作电压及整机输入视在功率、交换机或监控分站的传输口、高压配电装置的传输口…

(二)ElasticSearch 辅助工具 Kibana 介绍与安装

1、什么是 kibana &#xff1f; Kibana 是一个针对Elasticsearch的开源分析及可视化平台&#xff0c;用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana&#xff0c;可以通过各种图表进行高级数据分析及展示。 Kibana让海量数据更容易理解。它操作简单&#xff…

怎么使用chatgpt,GPT的使用方式解析

怎么使用Chatgpt&#xff1f;这是很多人心中的疑惑&#xff0c;更多的人只是听说过chatgpt的大名&#xff0c;但是具体连见都没见过gpt&#xff0c;那么接下来小编就来给大家详细的介绍一下吧。 一.了解chatgpt ChatGPT是一个由人工智能和自然语言处理技术构建的聊天机器人。通…

[pytorch]FixMatch代码详解-数据加载

原文 FixMatch: Simplifying Semi-Supervised Learning with Consistency and Confidence. 这里还有一个译制版的很方便阅读 FixMatch&#xff1a;通过一致性和置信度简化半监督学习 代码 pytorch的代码有很多版本&#xff0c;我选择了比较简单的一个&#xff1a; unoffi…

记一次某应用虚拟化系统远程代码执行

漏洞简介 微步在线漏洞团队通过“X漏洞奖励计划”获取到瑞友天翼应用虚拟化系统远程代码执行漏洞情报(0day)&#xff0c;攻击者可以通过该漏洞执行任意代码&#xff0c;导致系统被攻击与控制。瑞友天翼应用虚拟化系统是基于服务器计算架构的应用虚拟化平台&#xff0c;它将用户…

xxl-job 7.32版本 安装部署

文章目录 前言xxl-job 7.32版本 安装部署1. xxl-job 是什么2. 特性3. xxl-job 部署安装3.1. 下载源码3.2. 部署:3.2.1. 初始化调度数据库3.2.2. 配置调度中心 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作…

GDOUCTF2023-部分re复现

目录 [GDOUCTF 2023]Check_Your_Luck [GDOUCTF 2023]Tea [GDOUCTF 2023]doublegame [GDOUCTF 2023]Check_Your_Luck 打开题目是一串代码&#xff0c;明显的z3约束器求解 直接上脚本 import z3 from z3 import Reals z3.Solver() vReal(v) xReal(x) yReal(y) wReal(w) zRea…

cocosLua 之文本相关

Text 用于创建系统或ttf文本&#xff0c; 类结构&#xff1a; #mermaid-svg-bMIqhf5X7M9uF2Ba {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bMIqhf5X7M9uF2Ba .error-icon{fill:#552222;}#mermaid-svg-bMIqhf5X7…

走进社区客户端测试 | 得物技术

0.引言 社区 C 端质量体系建设思考&#xff1f; 询问一下 ChatGPT 1、关于社区客户端 1.1 社区端上功能 得物首页 搜索、发布、关注流、推荐流、沉浸式单列流、活动 tab、其他二级频道 tab 动态详情页 图文、视频、专栏、点评 私域 个人/他人主页、通讯录好友、微博好友…

不得不用ChatGPT的100个理由……

❝ 最近无论在哪&#xff0c;很多人都在吹ChatGPT无所不能&#xff0c;动不动就是AI要颠覆人类&#xff0c;很多人害怕有一天AI会取代自己&#xff0c;我认为明显是多虑了…… ❝ 当然&#xff0c;也有很多小白试用了ChatGPT之后&#xff0c;并没有感觉到他很强大&#xff0c;主…