APK瘦身

401 阅读3分钟

瘦身优势

  1. 下载转化率。
  2. 渠道合作商要求。

Apk组成

  1. 代码相关:classes.dex
  2. 资源相关:res、asserts、resources.arsc
  3. So相关:lib

Apk分析

  • AndroidStudio analyse apk功能

    • 查看Apk组成、大小、占比
    • 查看Dex文件组成
    • 不同版本APK对比
  • nimbledroid.com/ App性能分析

    • 文件大小及排行
    • Dex方法数、SDK方法数
    • 启动时间、内存等
  • jadx 反编译

  • android-classyshark:二进制检查工具

Proguard代码混淆

  • Proguard介绍: Java类文件处理工具,优化字节码
    • 代码中元素名称改短,移除冗余代码
    • 增加代码反编译难度
  • Proguard使用
    • 配置minifyEnabled为true,debug下不要配置
    • proguard-rules中配置相应规则
android{
    buildTypes {    
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

三方库处理

  1. 基础库统一(图片加载等基础功能用一个库)
  2. 仅引入所需的部分代码:如Fresco的webp支持
  3. 选择更小的库,Android Methods Count 插件

冗余资源

  1. 启用shrinkResources,gradle在打包的时候会自动进行资源的清理。
android {
        buildTypes {
            release {
                minifyEnabled true //是否开启混淆
                shrinkResources true //压缩
                zipAlignEnabled true ////去掉无用的resourse文件
            }
        }
    }
  1. 右键,Refactor,Remove Unused Resource

这里需要注意,特别有使用第三方的SDK,有些代码是在jar包里面,但是资源独立拷贝进工程,这样也会被识别成无引用的资源。但是这类资源一般都有特定的命名格式。

图片压缩

  • PNG压缩优化
  • webp使用
    • 即使PNG已经过其他的优化,也能达到28%。
    • 缺点: 缺点,加载比PNG慢。
    • Android Studio自带了对WebP的转换支持。选中资源,右键Convert to WebP。
  • 图片格式选择
    • 如果是纯色的icon,那么用svg
    • 如果是两种以上颜色的icon,用webp
    • 如果webp无法达到效果,选择png
    • 如果图片没有alpha通道,可以考虑jpg

资源混淆

  • AndResGuard是一个帮助你缩小APK大小的工具,他的原理类似Java Proguard,但是只针对资源。他会将原本冗长的资源路径变短,例如将res/drawable/wechat变为r/d/a。
  • github.com/shwenzhang/…

So移除

  • 一般选择armeabi
  • so动态下载
  • 根据手机的cpu来引入so

注意:

  • 8月不支持 64 位,App 将无法上架 Google Play!
  • 如果用到了renderscript,那么你必须包含v7,否则会出现模糊异常的问题。
  • 如果用了RN,那么对于x86需要谨慎的保留,否则可能会出现用户找不到so而崩溃的情况。毕竟rn是一个全局的东西,稍有不慎就可能会出现开机崩的情况。

abiFilters:设置支持的So架构

defaultConfig {
    ...
    ndk {
        abiFilters "armeabi", "armeabi-v7a" ,"x86"
    }
}

参考: