性能优化08-APK瘦身

性能优化08-APK瘦身

一、图片压缩

使用SVG和webp格式的图片,可以减小图片体积。使用tint着色器,可以减少图片数量。另外可以使用Typng工具压缩png图片。

### 1、SVG

SVG(Scalable Vector Graphics)可缩放矢量图。SVG不会像位图一样因为缩放而让图片质量下降。优点在于节约空间与内存。常用于简单小图标。

SVG是由xml定义的,标准svg根节点为<svg>,在Android中通过 Vector实现对svg的支持,根节点为<vector>

获得一张svg需要先进行转换才能在android当中使用,在Android Studio中打开工程,在res目录中点击右键Vector Asset

Android5.0(API 级别 21)及更高版本会提供矢量图支持。如果应用的最低 API 级别低于以上版本,就使用png生成:在app/build.gradle 中添加generatedDensities=['xhdpi','hdpi'],就会自动生成对应的png图片。

参考资料:https://developer.android.google.cn/studio/write/vector-asset-studio.html

3、webp

使用webp格式的图片,可以减少apk的体积。

获取单张webp格式的图片,可以在AndroidStudio上,选中图片,右键选择Converting Images to Webp来进行转换。

获取多张webp格式的图片,可以通过第三方插件来实现:

在项目的gradle文件中添加:

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath 'com.dongnao.optimizer:optimizer-picture:2.0.0'
    }
}

在module的gradle中添加:

apply plugin: 'com.dongnao.optimizer'

3、Tinypng

Tinypng是一个高效的png压缩工具,并且可以免费压缩一定数量的图片。

如果压缩数量少(20张以内),可以直接在官网上压缩;如果数量多,可以使用python脚本进行批量压缩。

4、tint着色器

tint能够实现图片变色,一个ImageView只需要设置一张图片,然后通过tint设置不同的颜色,就可以看到不同颜色的图片。原本需要多张相同图片不同颜色的情况,使用tint后,只需要一张图片,能够减少apk的体积。

二、删除无用资源

app中可能存在一些无用的资源,需要删除后,再打包。

1、资源打包配置

由于第三方库,如appcompat-v7的引入,库中包含了大量的国际化资源,根据情况通过配置删除。

在module的gradle中添加:

android {
    compileSdkVersion 26
    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        resConfigs 'en' //只保留英文资源
    }
 }

2、动态库打包配置

如果项目中包含第三方SDK或者自己使用了ndk,如果不进行配置会打包全cpu架构的动态库进入apk。对于真机,只需要保留一个armeabi(armeabi-v7a)就可以了。

android {
     defaultConfig {
         ndk {
               abiFilters "armeabi-v7a"
         }
     }
}

### 3、移除无用资源

1、一键移除

一键移除:右键项目,选择Refactor,选择Remove Unused Resources

如果出现使用动态id使用资源会出现问题,所以不建议使用一键移除。动态获取资源id是未使用R.xx.xx 的资源id。

2、使用Lint检查

步骤:右键项目,选择Analyze,选择Run Inspection By Name,输入Unused Resources

检查出的无用资源,自行进行排查手动删除。

三、开启Proguard

1、开启Proguard

开启Proguard,可以进行压缩(Shrink),优化(Optimize),混淆(Obfuscate),预检(Preveirfy)。

  1. 压缩(Shrink):在压缩处理这一步中,用于检测和删除没有使用的类,字段,方法和属性。
  2. 优化(Optimize):在优化处理这一步中,对字节码进行优化,并且移除无用指令。
  3. 混淆(Obfuscate):在混淆处理这一步中,使用a,b,c等无意义的名称,对类,字段和方法进行重命名。
  4. 预检(Preveirfy):在预检这一步中,主要是在Java平台上对处理后的代码进行预检。
android {
    buildTypes {
        release {
            shrinkResources true //压缩
            minifyEnabled true //混淆代码
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

2、混淆资源

resource.arsc提供资源ID到资源文件路径的映射关系,如R.layout.activity_main(ID:0x7f030000)到res/layout/activity_main.xml的映射关系,应用开发过程中所使用的资源ID使用0x7f030000查找资源。

android通过AssetManager和Resources获得一个图片或者xml等资源。其中,Resources类可以根据ID来查找资源,而AssetManager类根据文件名来查找资源。Resources类先根据ID来找到资源文件名称,然后再将该文件名称交给AssetManager类通过查找arsc文件(资源映射文件)来打开对应的文件的。

混淆就是修改映射表(resource.arsc文件),混淆步骤为:

  1. 解析arsc文件(主要为全局与资源名字符串池)
  2. 修改字符串池中字符串(以无意义的a/b替换)
  3. 修改apk中res目录资源文件名
  4. 打包(7zip)、对齐、签名。

解析参考资料:https://github.com/google/android-arscblamer

上一篇:性能优化07-进程保活

下一篇

猜你喜欢

转载自blog.csdn.net/dshdhsd/article/details/80041093