Android APP 瘦身优化

1.APK组成

1.1 APK组成部分

  • 如下所示
    • res:包含未编译到的资源 resources.arsc,主要有图片资源文件;
    • classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类;
    • assets:包含应用可以使用AssetManager对象检索的应用资源;
    • lib/:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多数情况下我们可以只用一种armeabi-v7a,后面会讲到原因;
    • resources.arsc:包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像;
    • META-INF/:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件;
    • AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。
  • 实际开发中
    • image

2.如何压缩优化apk

2.1 资源方面

  • 1.删除无用资源

    • 通过lint或resource shinking等删除无用资源。需要注意,别删错了!
  • 2.压缩图片

    • 1)无透明度的png转成jpg
    • 2)通过tinypng, tinyjpg等进行有损压缩,或通过ImageOptim进行无损压缩
    • 3)在不影响质量的提前下将大图转换成webp
  • 3.压缩动画

    • 压缩loading等gif动画,及其它较大的资源,如mp3
  • 4.动态加载

    • 对动态表情等特定业务场景才使用的动画等资源做动态加载,app启动后在线下载,不随apk发包。
  • 5.使用微信资源压缩方案

  • 6.glide配置

    1
    2
    3
    4
    5
    6
    7
    buildTypes {
    release {
    minifyEnabled true //是否开启混淆
    shrinkResources true //压缩
    zipAlignEnabled true ////去掉无用的resourse文件
    }
    }

2.2 代码方面

  • 1.开启proguard
    • proguard不仅能够混淆,而且能够优化代码,可以大大减小dex文件的大小。
    • 但需要对被反射引用的类需要做好keep
  • 2.动态加载
    • 对ocr(身份证识别)等较大的库做动态加载,app启动后在线下载,不随apk发包。
  • 3.插件化
    • 将相对独立的业务做成插件,app启动后在线下载,不随apk发包。
  • 4.删除非必要的so库
    • 很多app为了支持x86,apk至少包含arm和x86 2个ABI,甚至包括arm其实x86构架的手机也支持arm,可以删除x86 so,只保留arm。
    • 有人认为x86手机以兼容模式运行arm so会影响效率,其实效率上的影响对用户并没有直接的感知。
    • 删除x86 so可以大大减少apk size,特别是app集成了很多第三方so库的情况下,如fresco,rn等。
    • 关于so的介绍详见Android 动态链接库加载原理及 HotFix 方案介绍
  • 5.Facebook字节码优化方案redex

3.其他操作

3.1 lint检查

3.2 如何检测哪些图片未被使用

  • 点击菜单栏 Analyze -> Run Inspection by Name -> unused resources -> Moudule ‘app’ -> OK,这样会搜出来哪些未被使用到未使用到xml和图片,如下:

3.3 如何检测哪些无效代码

  • 使用Android Studio的Lint,步骤:点击菜单栏 Analyze -> Run Inspection by Name -> unused declaration -> Moudule ‘app’ -> OK
    • image