Android Apk瘦身优化

Android Apk瘦身优化

第一步:

使用svg转vector

可缩放矢量图形,SVG不会像位图一样因为缩放而让图片质量下降。节约空间与内存,常用于简单小图标。

<vector xmlns:android="http://schemas.android.com/apk/res/android"
     android:name="triangle"//定义矢量图的名称
     android:height="64dp"//drawable的固定高度,支持所有的尺寸单位,一般使用dp
     android:width="64dp"//drawable的固定宽度,支持所有的尺寸单位,一般使用dp
     android:viewportHeight="600"//视图的高度,可以理解为画布的高度
     android:viewportWidth="600" >//视图的宽度,下面的pathData中的内容便会在600宽高的画布内操作
     <group //定义一个组,可以包含path 及子group, 同时可以定义转换信息,如旋转,伸缩,位移
         android:name="rotationGroup"//组名
         android:pivotX="300.0"//X坐标中心点,默认为0
         android:pivotY="300.0"//Y坐标中心点,默认为0
         android:rotation="45.0" >//旋转角度,顺时针
         <path
             android:name="v"//路径的名称
             android:fillColor="#000000"//填充颜色
             android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />//路径的数据
     </group>
 </vector>

img

img

第二步:

使用着色器Tint

1.实现目的:

  • 一张矢量图适配所有颜色
  • 更优雅的selector实现方式

2.实现selector

  • XML实现:效果不好,Android6.0下不兼容。
  • 代码实现:Android6.0下兼容。

第三步:

资源打包配置

当应用不需要支持几十种语言时,通过配置 resConfigs 去除无用的语言资源。可以减少apk体积100k左右。

    //只保留默认的资源和指定的资源:中文、英文
    resConfigs "zh-rCN", "en-rUS"

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

第四步:

动态库的打包配置(定制化设备除外)
当引入so库的时候,modle的build.gradle:

//将so库打包到apk内

sourceSets{
    main{
        jniLibs.srcDirs=['libs']
    }
}

在modle的build.gradle中defaultConfig配置so库架构,减小apk体积

//配置so库架构(真机:arm 模拟器:x86)

ndk {
    abiFilters('armeabi', 'armeabi-v7a')
}

只适配了armeabi-v7a,那如果APP装在其他架构的手机上,如arm64-v8a上,不会崩,但是反过来会。
因为armeabi-v7a和arm64-v8a会向下兼容:

  • 只适配armeabi的APP可以跑在armeabi,x86,x86_64,armeabi-v7a,arm64-v8上
  • 只适配armeabi-v7a可以运行在armeabi-v7a和arm64-v8a
  • 只适配arm64-v8a 可以运行在arm64-v8a上

那我们该如何适配呢?给出如下几个方案:
方案一:只适配armeabi

优点:基本上适配了全部CPU架构(除了淘汰的mips和mips_64)
缺点:性能低,相当于在绝大多数手机上都是需要辅助ABI或动态转码来兼容

方案二:只适配 armeabi-v7a
同理方案一,只是又筛掉了一部分老旧设备,在性能和兼容二者中比较平衡
方案三: 只适配 arm64-v8

优点: 性能最佳
缺点: 只能运行在arm64-v8上,要放弃部分老旧设备用户

这三种方案都是可以的,现在的大厂APP适配中,这三种都有,大部分是前2种方案。具体选哪一种就看自己的考量了,以性能换兼容就arm64-v8,以兼容换性能armeabi,二者稍微平衡一点的就armeabi-v7a。

在这里插入图片描述

只适配armeabi-v7a

在这里插入图片描述

第五步:

在AS的Refactor里面有Remove Unuse Resources(不建议用)
因为如果出现使用动态id使用资源会出现问题(比如反射)
在AS的Analyze下有Run Inspection by name
输入Unused Resource 会显示可删除的资源 可自行选择

在这里插入图片描述

在这里插入图片描述

推荐在物理上的删除,移除无用的资源(Lint)
通过Android Studio中:Refactor–>Remove Unused Resources…快速删除(慎用)

在这里插入图片描述

通过Android Studio中:Analyze–>Run Inspection by Name–>unused resources

第六步:

开启代码混淆

在modle的build.gradle中buildTypes配置

buildTypes {
        release {
            // 开启混淆(反编译)
            minifyEnabled true
            // 移除无用的resource文件
            shrinkResources false
            debuggable false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
}

注:将所需要的混淆都加进去,发现哪个class混淆有问题就将其keep,重复的删掉:
为保持第三方库中的类而不乱,-dontwarn和-keep 结合使用,意思是保持com.xx.bbb.**这个包里面的所有类和所有方法而不混淆,接着还叫ProGuard不要警告找不到com.xx.bbb.**这个包里面的类的相关引用。

-dontwarn com.xx.bbb.**
-keep class com.xx.bbb.** { *;}

第七步:

启用资源缩减

在第五步中有介绍,在modle的build.gradle中buildTypes配置,移除无用资源:

buildTypes {
    release {
        // 移除无用的resource文件
        shrinkResources true
    }
}

注:打包时会删除没有用到的资源。若是动态获取资源id,在打包时也会将其删除。

使我们保留了代码文件,只是不打包进入apk,如果没有动态获取资源id,打包没有问题的话,请开启。因为总是会因为各种需求的变化,我们的项目中留有暂时没有用到的资源。

注:混淆文件proguard-rules.pro里,添加以下命令,启用资源缩减无效。

-dontshrink

在这里插入图片描述

第八步:

将png格式大图转webp格式

WebP是一种同时提供了有损压缩与无损压缩的图片文件格式,这种图片格式相比png或者jpg格式的图片损失的质量几乎可以忽略不计,但是压缩后的体积却比png和jpg要小很多。

在Android Studio中进行转换:右键png图片,选择Convert to WebP 进行批量转换:

**iSparta,**可以将png批量转换成webp格式、生成APNG、图片无损压缩、png有损压缩。

猜你喜欢

转载自blog.csdn.net/zhangshiwen11/article/details/119208065