性能优化(七):APK瘦身优化

2022-02-19  本文已影响0人  w达不溜w

APK基础知识

1.APK结构

AS > Build > Analyze APK

2.APK打包流程

1、打包资源文件,生产R文件
aapt打包res资源文件,生成R.java、resources.arsc和res文件

2、处理aidl文件,生成相应的Java文件(没有aidl则跳过)

3、编译源代码,生产class文件
所有的java代码(包含R.java和aidl文件),由javac编译成.class文件(目录:bin/classes)

4、处理.class文件,生成classes.dex文件
dx工具将.class文件处理生成classes.dex文件

5、打包生成apk文件

6、对APK文件进行签名

7、对签名后的APK文件进行对齐处理
将apk包中的所有资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。

APK瘦身

1.混淆和资源压缩
buildTypes {
  release {
    //混淆
    minifyEnabled true
    //资源压缩
    shrinkResources true
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    signingConfig signingConfigs.config
  }
}
2.Lint检查

Lint 是AS提供的静态代码分析工具,他能帮助我们发现代码结构和质量问题,并提供一些解决方案。

Android studio > Analyze > Run inspection By Name > 搜索 Unused resources 然后删除⽆⽤的资源

3.配置打包资源
android {
  defaultConfig {
    //配置只打包默认和简体中文资源
    resConfigs "zh-rCN"
  }
}

打包apk资源文件会映射到resources.arsc,通过AS来查看该文件中的string文件,可以看到少了很多国家的语言

4.so库配置
android {
  defaultConfig {
    ndk{
      abiFilters "armeabi-v7a"
    }
  }
}

对于一些第三方服务会提供全平台的cpu架构,进行上面配置后,只会把armeabi-v7a 打进apk。

对于arm64架构的设备,使用arm64的so性能会更好,也可以多渠道的方式打包(主流应用市场会要求32位和64位的包)

android {
  defaultConfig {
    flavorDimensions ""
  }
  productFlavors{
    arm32{
      ndk { abiFilters 'armeabi-v7a' }
    }
    arm64{
      ndk { abiFilters 'arm64-v8a' }
    }
  }
}
5.图片相关
5.1 png压缩

https://tinypng.com

5.2 使用webp格式

webp格式相比png和jpg格式的图片体积小很多,并且图片质量损失很小。

AS提供了Convert to WebP功能,右键一个图片文件或图片文件夹,然后Convert to WebP,瘦身效果非常明显。

5.3 使用SVG

矢量图可以创建与分辨率无关的图标,不会降低图片的质量。

矢量图在Android中以vector为标签的xml文件来使用。不过,系统渲染VectorDrawable对象需要花费大量的时间,较大的图片需要更多的时间显示到屏幕上,因此建议仅在小图标时使用,新工程默认icon就是矢量图。

AS提供了相应工具:右键res文件夹 > New > Vector Asset

5.4 重用资源

如上下三角按钮,可以用一张图旋转

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_thumb_up"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="180" />

同一图像着色不同,可以使用Tint着色器处理

6.其它

资源混淆:https://github.com/shwenzhang/AndResGuard

解析resources.arsc , 混淆资源ID长度(替换为a/b等无意义字符),利用7zip深度压缩,减少包体积,同时提升反破解难度。

上一篇 下一篇

猜你喜欢

热点阅读