APK优化小结

APK瘦身

减少apk大小主要从代码、图片、so库、其他资源等方面进行优化;

  • 首先我们可以通过Gradle配置

    • 开启代码混淆(minifyEnabled)和资源压缩(shrinkResources)功能;这个配置可以在打包时将项目中无用的代码和资源删除,所谓的删除不是真正的删除,而是将资源内容清空

    • 然后可以将不需要的平台so库以及语言资源通过配置不打进apk包中

      • ndk{ abiFilters “armeabi-v7a”}

      • resConfigs “en”

      • splits:打特定包

  • 在图片方面:

    • 我们可以使用占用空间更小的图片格式,比如webp、svg等

    • 非必要的图片不要内置app,而是通过网络下载到本地后再显示

    • 对于不同屏幕分辨率的设备,只适配主流分辨率

  • so库我们也可以通过远程下载到本地再进行动态加载

    • so库动态加载方案主要有两种,一种是像Tinker那样启动时优先加载so库下载目录,如果不存在才去加载apk内的;另一种是通过反射修改DexClassLoader中的DexPathList的属性中存放so路径的List,将下载的so路径添加到列表最前面

APK打包流程

AndroidStudio作为UI工具->通过Gradle命令执行打包流程->Gradle通过build-tool等各种命令进行打包

  • 使用aapt命令打包资源文件并生成生成R.java文件

  • 使用aidl命令将aidl文件转成java文件

  • 使用javac命令将所有java文件编译成class文件

  • 使用dex命令将所有class文件打包成dex文件

  • 使用apkBuilder命令将所有资源文件打包成apk文件

  • 使用jarsign命令对apk文件进行签名

  • 使用zipalign命令对apk文件进行4k对其

APK签名

了解各个版本APK签名原理的意义在于往apk中写入渠道信息,完成批量多渠道打包任务

  • V1:对apk里的的每一个文件记录它的唯一值(SHA-256)防止被修改,并保存到MEFT-INFO文件夹下的签名信息文件(MANIFEST.MF)中,但是验证签名时对于MEFT-INFO文件夹下的文件却不会校验;所以可以批量打包时往apk文件的MEFT-INFO文件夹下添加渠道信息文件

  • V2:在V2版本中,为了避免V1中存在的问题,它对整个apk包进行校验,并把校验信息存放到存放压缩包信息的地方,开辟了一块空间;这块空间时以键值对的形式存放数据;所以我们也可以通过读取这块区域信息,以键值对的形式插入我们的渠道信息

  • V3:整体方案还是跟V2一样,它支持在修改签名文件后也能覆盖安装旧版app;实现原理就是签名信息里会存放旧版的签名信息,只要apk安装时检测到旧版签名信息跟v3里记录的旧版签名信息一致就可以覆盖安装

你可能感兴趣的:(Android,性能优化,java,android,gradle)