mm编译将so打包进apk_程序性能优化之APK大小优化(六)上

本文介绍了APK大小优化的实践方法,重点关注so文件的瘦身处理和res、assets文件的优化。通过分析APK结构,发现so文件是主要占用空间的部分。通过修改lib配置,减少不必要的处理器架构支持,APK大小显著减少。同时,通过压缩图片资源、减少无用资源,以及优化classes.dex文件,进一步减小了APK体积。
摘要由CSDN通过智能技术生成

0080ce7ea6e5c86ca09b5d362aa05ab7.png

11/12号文档资料已全面更新!;《【阿里P7】移动互联网架构师高级教程+BAT面试题》,点击下方链接前往领取:

【阿里P7】Android高级教程+BAT面试题​shimo.im

本篇文章将继续从APK瘦身来介绍APK大小优化:
文章主要内容从理论出发,再做实际操作。分为下面几个方面:1. 结构分析, 2.具体实操 3. 总结

1. 结构分析

首先上传一张瘦身前通过Analyze app分析出来的图片(打开方式:Android Studio下 ——> Build——> Analyze app):

112cb04c4c7d7eb600ab8b5dd5b340bd.png

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格式。

通过分析图可以知道,目前app主要是so文件占比比较大,占了31.7M,占了整个应用是38.2%。其次是assets目录,整个目录占了32M,第三就是资源文件res目录了。所以接下来我们处理步骤就是按这个顺序来处理。(简单说下图中的Raw File Size(磁盘解压后的大小)和DownLoad Size(从应用商店下载的大小),如果想了解更多关于Analyaer分析的知识,可以参考这篇文章使用APK Analyzer分析你的APK),分析了包结构组成之后,我们可以开始瘦身操作了。

2.具体实操

2.1. 对lib目录下的文件进行瘦身处理

2.1.1 修改lib配置:
参考资料
so文件的优化:通常我们在使用NDK开发的时候,我们经常会有如下这么一段代码:

ndk {
            //设置支持的so库架构
            abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi"
        }

最后我的修改代码如下:

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,那么会在性能上造成一定的影响。
参考文章:安卓app打包的时候还需要兼容armeabi么?

好了,我们再打一次包试试。

9b1fd8f6b0d5b30384cc69ca828e4c00.png

确实有点震惊,一下子包小了这么多,从87.1M到51.9M,容我好好算算少了多少M.赶快让测试帮忙测一下。基于之前的理论知识,心里还是有点底。果然,测试效果和之前是一样的。心里的石头先落下罗。

2.1.2 重新编译so文件,用更小的库代替
相信很多开发者都有这种苦恼,很多第三方我们导入进来只用到其中很小一部分功能,大部分功能都是我们用不上的。这时候我们找到源代码,将我们需要的那部分代码提取出来,重新编译成新的so文件,再导入到我们项目中。当然,如果之前没有编译过so文件,这部分建议做最后的优化去处理。不然你会遇到很多问题。上一波处理后的效果图:

6154f78a9e68793a11a2347c24e13160.png

这里说下,因为项目中有使用到ffmpeg库,之前导入的第三方的放在assets文件夹下,重写编写后的so库文件放在lib文件夹下,所以lib文件夹反而大了。从51.9M到35.6M,效果还是蛮不错的。

对了,别问我为什么assets文件夹下为什么还有12.6M资源,因为很多.mp3都是第三方的人脸识别必备配置文件,我也很无奈。

c57a6db0ecab6b923218da00649a01c9.png

2.2 优化res,assets文件大小

1. 手动lint检查,手动删除无用资源
在Android Studio中打开“Analyze” 然后选择"Inspect Code…",范围选择整个项目,然后点击"OK"。配置如下:

6154f78a9e68793a11a2347c24e13160.png

2. 使用tinypng等图片压缩工具对图片进行压缩。
打开网址,将大图片导入到tinypng,替换之前的图片资源。

3. 大部分图片使用Webp格式代替。
可以给UI提要求,让他们将图片资源设置为Webp格式,这样的话图片资源会小很多。如果想了解更多关于webp,请点击这里webp,当然,如果对图片颜色通道要求不高,可以考虑转jpg,最好用webp,因为效果更佳。

4. 尽量不要在项目中使用帧动画
一个帧动画几十张图片,再怎么压缩都还是占很大内存比重的。所以建议是让UI去搞,这里可以参考使用lottie-android,如果项目中动画效果多的话效果更加明显。当然这就要辛苦我们UI设计师大大了。

5. 使用gradle开启shrinkResources
移除无用资源文件,下面是我的配置:

buildTypes {
        release {
            // 不显示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"
            //混淆
            minifyEnabled true
            // 移除无用的resource文件
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

通过上述步骤操作,apk效果如下:

818f5d5a2a9b7a48b30cb4f18044537a.png

又优化了将近5M,别问我为什么还有7.5M,里面大量的gif和webp格式的动图,都是UI丢给我的,一个2.7M.后面再慢慢和他细究这个问题。后面要做的两部分,一部分是将资源文件下的所有gif图放后台下载处理,第二个是和UI讨论下如何减小webp 动图的大小(我看其他平台只有100K的样子,给我的就2.7M?)。

2.3. 减少chasses.dex大小

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

尽量减少第三方库的引用,这个在上面我们已经做过优化了。
避免使用枚举,这里特别去网上查了一下,具体可以参考下这篇文章Android 中的 Enum 到底占多少内存?该如何用?,得出的结论是,可能几十个枚举的内存占有量才相当一张图片这样子,优化效果也不会特别明显。当然,如果你是个追求极致的人,我不反对你用静态常量替代枚举。
如果你的dex文件太大,检查是否引入了重复功能的第三方库(图片加载库,glide,picasso,fresco,image_loader,如果不是你一个人单独开发完成的很容易出现这种情况),尽量做到一个功能点一个库解决。
关于classes.dex文件大小分析可以参考这篇译文使用 APK Analyzer 分析你的 APK

2.4. 其他

删除无用的语7zip代替
删除翻译资源,只保留中英文
尝试将andorid support库彻底踢出你的项目。
尝试使用动态加载so库文件,插件化开发。
将大资源文件放到服务端,启动后自动下载使用。

3. 总结

好了,说道这里基本上就结束了,apk包从87.1M减小到了23.1M(优化了73%,不要说我标题党)已经差不多了,关于第四部其他部分的优化我是没有进行再操作的。因为公司运营觉得二三十M的包比较真实,太小了就太假了。所以我暂时就不进行优化了。如果再上面提到的部分通过所有将所有非启动页面首页之外的所有资源,so库放服务端,理论上apk包大小能在10M以内这样子。当然我们有做到就不多加评价了。最后,如果对插件化开发感兴趣的话可以参考下这篇文章Android全面插件化方案-RePlugin踩坑。
原文链接https://blog.csdn.net/qq_32175491/article/details/80071987#4__133

四、最后

我们今年整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括腾讯,以及字节跳动,华为,小米,等一线互联网公司主流架构技术。如果你有需要,尽管拿走好了。

以下为我们整理的资料免费分享;【阿里P7】Android高级教程+BAT面试题

1.Android高级技术脑图

2.P7级Android高级架构视频教程

3.Android核心高级技术PDF文档+BAT大厂面试真题解析

4.Android思维脑图(技能树)

1.Android高级技术脑图;

查漏补缺,体系化深入学习提升

ba6867d463a341083867552cee2d46c2.png

2.【Android高级架构视频教程】;

51a21e810b6f6af2860b5d9214a52022.png

全套部分展示;

java与Android内核进阶专题视频与源码

c18c7be6ee6faf8a0fda3bd0cde2590c.png

d25edbc8030a709c1250cfdc2b7149d5.png

阿里P7级全套高级学习视频;

6e45fcdf5ae345b89c6e46f240bf7138.png

3.Android核心高级技术PDF文档,BAT大厂面试真题解析

a368df89d431dd23ed66e8b4b9b65184.png

08488890695e7ed7083b9d14faef2ff7.png

4.Android思维脑图(技能树)

e92f923a6e08efa85f7c9ae2fd11946e.png

免费分享

在评论区留言或者私信我,视频教程,BAT面试真题解析文档,我看到都会回复的


也可以点击下方链接前往领取:

【阿里P7】Android高级教程+BAT面试题​shimo.im
31ef708d514d68682b14821980aad68a.png

为什么免费分享?

很多开发人员工作几年,技术薪资均没有提升。
程序开发是吃青春饭的工作,有很多志在学习提升,却又苦于找不到学习方向和路线的开发人员。
希望大家通过我分享的这套高级架构资料,结合自身不足、重点学习、系统学习、早日进阶成为Android高级架构师。实现个人理想和创造更多价值。
不负青春对我们的期待,不负时代对我们鞭策。

Android架构师之路很漫长,一起共勉吧!喜欢的话别忘记点击关注和赞哦

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值