Android APK瘦身

  随着项目不断地完善,资源不断地增多,导致apk大小越来越大,编译以及安装等待时间越来越长,虽然对应用使用并没有影响,但是用户会越不愿意下载。还有特别是在使用移动网络的时候,用户更不会浪费流量去下载,所以我们得尽量缩小apk大小。

安装包主要由7部分组成:

assets:存放一些配置文件、资源文件,assets不会自动生成对应的 ID,而是通过 AssetManager 类的接口获取。
res: 是 resource 的缩写,这个目录存放资源文件,会自动生成对应的 ID 并映射到 .R 文件中,访问直接使用资源 ID。
AndroidManifest.xml:这个文件用来描述 Android 应用的配置信息,一些组件的注册信息、可使用权限等。
META-INF:保存应用的签名信息,签名信息可以验证 APK 文件的完整性。

resources.arsc:记录着资源文件和资源 ID 之间的映射关系,用来根据资源 ID 寻找资源。

classes.dex:Dalvik 字节码程序,让 Dalvik 虚拟机可执行,一般情况下,Android 应用在打包时通过 Android SDK 中的 dx 工具将 Java 字节码转换为 Dalvik 字节码。

lib:程序依赖的库,包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。

目前我的Apk大在3个方面

重复的第三方库(so.jar等)

assets文件太大(含有多余资源)

res太大(含有多余资源,资源图片太大)
解决办法

1.三方库优化

避免引用重复库以及清除冗余库。一般引用so库都需要适应各个so架构("armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi"),每个文件里都会放重复的so文件,当so文件一旦过大,占用的空间会很大。这就要考虑apk使用机型范围了,因为市面大多都是Android 5.0 -Android 7.1之间的系统,具备浮点运算的硬件指令集,所以直接用"armeabi-v7a"可以提高app的浮点运算性能,同时能兼容大多数安卓设备,如果机型不支持v7a那么就尽量把so替换成其他更小的so文件或者是自己重新编译。

2、res优化

移除无用的资源,可以手动删掉,也可以一键清除(不建议,容易误删出现动态id使用资源问题)

推荐使用lint检查, Android Lint Tool 是 Android Sutido 集成的一个代码规范提示工具,不仅让你及时发现代码种隐藏的一些问题,更能让你养成良好的代码风格。可以使用 Lint 检测代码、布局文件、去除多余资源。

  • 尽量使用统一一套资源,各个分辨率都一套资源太浪费。
  • 图片可以使用小点的图片或者 PNG优化工具(tinypng) 对图片做压缩处理,会使图片收缩50% - 70%,如果机型在4.0以上可以使用Webp,这样会更小。(使用方法:右键图片)
  • 尽量别使用帧动画,一个动画就十几张图片占用空间太大。
  • 背景能使用shape的就尽量别使用图片背景

3、assets优化 

这里面一般存的都是软件自带的一些配置文件,以及资源。如果是单机版不能连网的手机那这是不可避免的,只能尽量删除一下不必要的资源。如果能连网那么就不需要这个文件了,应该在第一次启动时网上下载配置文件,这样更方便。

4、插件化热修复

能连网的前提下,把功能模块以及资源放在服务器上,按需下载。

5、代码混淆

在build.gradle中使用minifyEnabled 混淆代码

buildTypes {
        release {
            // 源代码混淆开启
            minifyEnabled true
        }
    }

6、开启资源压缩

在build.gradle中使用shrinkResources压缩资源(据说会有bug,我目前还未遇到)。

buildTypes {
        release {
            // 启动资源压缩
            shrinkResources true
        }
    }

7、资源混淆和7zip压缩

资源混淆配合7zip压缩减小apk大小,并且增加了破解难度。

通过resoure.arsc文件格式混淆 步骤为:

  • 解析arsc文件(主要为全局与资源名字符串池)
  • 修改字符串池中,以无意义的abcd等代替
  • 修改apk中res目录资源文件名
  • 7zip打包对齐签名
发布了40 篇原创文章 · 获赞 70 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/weixin_35959554/article/details/102459661