Android Apk瘦身

Android Apk瘦身

本文链接:https://blog.csdn.net/feather_wch/article/details/131673130

文章目录

  • Android Apk瘦身
    • 组成部分
    • 瘦身手段
      • Android Size Analyzer
      • shrinkResources
        • keep.xml
      • Lint
      • 备用资源
      • 动态库打包配置
      • productFlavor和splits
      • 矢量图
    • AndResGuard原理
    • AndResGuard的使用
      • 使用
    • Apk瘦身总结
  • Apk多渠道打包

组成部分

1、Apk内容

  1. dex文件
    1. debug有多个dex,方法数超过65535
    2. release可能就一个,开启了混淆会变少
  2. res:包含未编译到resources.arsc中的资源(图片、音视频)
  3. resources.arsc中的资源(图片、音视频) 映射文件, 帮助从ID找到资源文件

    ID = 0x7ffxxff,default = ‘res/drawable/xxx.xml’

  4. 第三方库文件:kotlin、okhttp3
  5. META-INF:签名文件CERT.RSA和CERT.SF(1.0签名版本才会有)、MANIFEST.MF清单文件
  6. AndroidManifest.xml - 都会经过aapt编译,记事本打开是乱码
  7. assets:资产目录,可以用AssetManager对象检索这些资源

2、只有AndroidManifest文件,没有dex和res文件都是合理合法的,只是没有意义

瘦身手段

Android Size Analyzer

3、插件 Android Size Analyzer 的使用

  1. install
  2. Analyze->Analyze App Size…
  3. 产生建议
    1. png -> webp // 图片右击convert to webp,减少66%大小
    2. enable proguard // 开启混淆,proguard-rules.pro写混淆规则,不混淆的keep
  4. x

shrinkResources

4、资源缩减

  1. 资源缩减:build.gradle中minifyEnabled+shrinkResources
andorid{
    buildType{
        release{
            minifyEnabled true // 资源优化 + 混淆
            shrinkResources true
        }
    }
}
  1. 把没用的资源变得非常小,删除了内容,可能几十Byte

keep.xml

5、自定义keep资源配置

  1. src/main/res/raw/keep.xml中keep列表和discard列表
  2. 指明需要保留的资源和需要优化的资源
  3. Lint工具也会读取keep.xml文件

Lint

6、Lint工具

  1. Analyze->Run Inspection by Name->unused resources
  2. 只会检查没有直接使用的资源,间接的没办法发现:反射
  3. 删除前全局搜索一下

备用资源

7、备用资源是什么?

  1. 不同语言都有各语言的资源
  2. 可以删除无用的语言的资源,string文件等等
  3. androidx.appcompat等包会引入很多语言的资源

8、移除无用的备用资源

defaultConfig{
    resConfig 'zh-rCN'
}
  1. 会保留zh、zh-rCN、default三种资源

动态库打包配置

  1. so放到jniLibs
  2. build.gradle中defaultConfig
ndk{
    abiFilters 'armeabi-v7a'
}
  1. 过滤掉无用的so

productFlavor和splits

1、根据市场打包出包含不同so的apk,分别交给应用商店

  1. 根据设备硬件,选择对应apk下载安装

2、splite干嘛的

矢量图

1、SVG的场景

  1. svg适合小图标,需要更多的时间去绘制。
  2. svg本身就小 png 1/2。
  3. 做点击变色效果,svg修改color就可以了。png需要两张。
  4. tint和svg配合效果更好,tint填充非透明部分,有些png效果不好

AndResGuard原理

3、AndResGuard的原理

  1. 主要是处理arsc文件,里面是映射关系。
  2. 混淆处理后apk没有res文件,只有r文件夹,看不到原来的资源文件
  3. arsc中存储的name混淆为res/a/b.xml后,体积更小
  4. AndResGuard实现步骤:
  5. ZipFile解压缩文件:
  6. 读取res文件,目录和文件改名,如r/a/a.png
  7. 处理arsc文件,从stream中读取成byte[],按照arsc格式要求处理【手把手解析resources.arsc】,将映射后的name改成 r/a/a.png实现混淆

4、怎么操作apk下面的文件:

  1. ZipFile+ZipEntry解压缩 apk,遍历

5、阿里debugItem优化方案

  1. dex中debugitem对运行没有影响,可以删除。
  2. 删除方案:

AndResGuard的使用

  1. 根目录build.gradle配置classpath
  2. module的build.gradle中apply plugin引入插件
  3. 配置andResGuard{各种开关}
    • whitelist:白名单不能混淆App图标,通知栏,桌面相关的图标,反射后资源不能混淆
  4. 右侧gradle会生成任务

使用

Apk瘦身总结

2、 apk瘦身总结:

  1. 依赖按需加载,加载精简版本依赖如protubuf-lite
  2. 开启r8/混淆
    3.不常见模块用插件化加载
    4.避免使用枚举,用@intdef
  3. 开启资源混淆 AndResGuard微信开元工具
    6.支付宝 删除 dex debugitem
    7.发布于谷歌的使用aab
    8.webp,svg
    9.去除资源
    10.so分开打包
    11.去除备用资源(国际语言)

Apk多渠道打包

你可能感兴趣的:(Android,android)