业务功能开发完之后,就需要对App打包了。
有时候明明功能不多,但是包体很大,一是影响上架,二是就几个功能但是很大心里会膈应,于是包体有时候也需要进行优化。同类型的竞品只要40m,你要200M,那我肯定愿意先试试40M的。
Android应用程序包(英语:Android application package,APK)是Android操作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件。一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,然后被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是“APK”。 一个APK文件内包含被编译的代码文件(.dex 文件),文件资源(resources), assets,证书(certificates),和清单文件(manifest file)。、
包体分析
在Android Studio工具栏里,打开build–>Analyze APK, 选择要分析的APK包。
优化方法:
1.干掉不需要的文件
有些图片或者资源、代码在实际运用中其实可能并没有用到,这时候可以把他给删除掉,IDE会把未使用到的区块灰色展示,也可以通过lint工具来帮助我们识别到。这个功能在menu中的Analyze的`Run inpection by name`输入`unused xx`。甚至是在编译过程中,我们也可以通过混淆配置来做到,比方说常见的Log删除。(tips:删除代码记得有些代码通过反射获取的,不要删除)
2.此外一些没用到的依赖库也可以给干掉
3.资源优化
图片在App应用中会大量的使用到,尤其一些图片还特别的大。
- 我们可以选择体积更小的图片,比方说webp格式。要注意的是,webp在4.3以下有一些兼容问题,选择需谨慎。而对于png也可以采用有损或无损压缩图片,常见工具有tinypng或imageoptim等。经常png会有一些空白边距,这些部分也可以删除掉,通过代码或xml来实现边距。
- 小的icon也可以使用svg格式。一些特定效果也可以通过XML自定义实现。新手常常有个误区,就是做.9图片的原图依旧很大,既然已经让程序帮我们拉伸了,原图实际上可以保持很小的体积。
- 经常在适配屏幕时,开发会使用多套图片。实际上大部分时候一套图片就可以搞定了,系统会自动帮我们处理图片缩放。
- 而在适配不同API时,打包过程也会自动生成多个目录。适当选择最低API格式有好处的,更高版本意味着开发效率更高,同时兼容设备变少,需要同业务一起考虑。
- 打包过程也会生成一个resource.arsc文件,里面是资源ID的映射关系。这个部分也可以通过混淆资源id来优化,可以有效减少体积。
- 最后同样的,不需要的资源一定要删掉。同样使用lint工具可以帮我们自动删除。模块化也需要当心不同模块出现同样的图片。
- 删除无用的语言资源;在app的build.gradle下配置(很多时候其实用不到多语言配置)
-
android {defaultConfig {resConfigs "zh"}}
-
4.SO文件优化
在使用了SO库的时候优先保留v7版本的SO库,删掉其他版本的SO库。原因是在2018年,v7版本的SO库可以满足市面上绝大多数的要求,可能八九年前的手机满足不了,但我们也没必要去适配老掉牙的手机。实际开发中减少apk体积的效果是十分显著的,如果你使用了很多SO库,比方说一个版本的SO库一共10M,那么只保留v7版本,删掉armeabi和v8版本的SO库,一共可以减少20M的体积。当然,测试的时候,记得使用不同的手机进行测试仪检测是否能正常使用。
5.assets资源优化
(1)音频文件最好使用有损压缩的格式,比如采用opus、mp3等格式,但是最好不要使用无损压缩的音乐格式
(2)对ttf字体文件压缩,可以采用FontCreator工具只提取出你需要的文字。比如在做日期显示时,其实只需要数字字体,但是使用原有的字体库可能需要10MB大小,如果只是把你需要的字体提取出来生成的字体文件只有10KB
6.其余常见优化
-
使用proGuard 代码混淆器工具,它包括压缩、优化、混淆等功能。
-
android {buildTypes {release {minifyEnabled trueshrinkResources true}} }
tips:
-
为什么代码混淆可以让apk变小?
1)可以删除注释和不用的代码。
2)将java文件名改成短名
3)将方法名改成短名
-
-
插件化开发
-
热更新等等,可将功能模块放服务器,需要用时再加载。