参考:
apk组成
APK文件由一个ZIP存档组成,其中包含组成应用程序的所有文件。这些文件包括Java类文件,资源文件和包含编译资源的文件。
APK包含以下目录:
META-INF/:
包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件。
assets/:
包含应用可以使用AssetManager对象检索的应用资源。
res/:
包含未编译到的资源 resources.arsc。
lib/:
包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。
resources.arsc:
包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。
打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。
此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像。
classes.dex:
包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。
AndroidManifest.xml:
包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。
打开抖音的apk查看:
一般来讲APK结构中比较大的部分一般是classes.dex、lib、res、assets这些文件或者目录。
瘦身方法:
-
使用统一的一套资源:对于大对数APP来言,只需要一套设计图就足够了。鉴于现在分辨率的趋势,建议取720p的资源,放在xhdpi目录。
-
开启代码混淆:在build.gradle中使用minifyEnabled true 进行Proguard混淆配置。
-
开启去除无用资源:在build.gradle中使用shrinkResources去除无用资源。
-
删除无用语言资源:国内的APP只需要使用中文就够了
-
使用webp格式:webp支持透明度,压缩比比jpg更高但显示效果却不输于jpg,官方评测quality参数等于75均衡最佳。
-
覆盖第三方库的大图:有的第三方库使用的图片资源,你可能使用不到,因此可以用小图进行覆盖
-
删除armable-v7包下的so:armable的so是兼容armable-v7的
-
使用微信资源压缩打包工具:微信资源压缩打包工具通过短资源名称,采用7zip对APP进行极致压缩实现减小APP的大小。
-
矢量图:矢量图是由点与线组成,而且使用矢量图也能够更好进行适配,同时比位图节约百分之三十至四十的空间,矢量图也契合谷歌推崇的扁平化方式。
-
使用shape背景:很多纯色的渐变的圆角的图片都可以用shape实现,节省了背景图片资源。
-
使用着色方案:相信工程里面一般会有很多selector文件,也有很多相似的图片,通过着色方案我们能减轻工作量,减少类似的这样的文件。
-
避免重复库:避免重复库是一定要排查的,但是有的库总是藏的很深,所以当你引用的第三方库的时候,要仔细的排,最好能够阅读源码,这样既能提高自己,也可以避免引入重复的库
-
清理第三方库和冗余代码:版本迭代过程中,经常有冗余代码和第三方库留下,这样会或多或少的增加APK的大小,这种情况没有捷径,只有每个文件一一查找。
-
支持插件化:插件化支持动态的加载代码和加载资源,目的是把APP的一部分分离出来了,对于业务庞大的项目来说非常有用,极大的减小了APK的大小。