Apk极限压缩

849 阅读5分钟

简介 随着项目的不断迭代,代码量跟资源文件不断增多。那么就会出现打包后的 APK 文件越来越大,今天就让我总结下对apk瘦身的理解与实践。 优化 APK 体积八大步

  1. 将图片转换为 webp 格式Webp 概念WebP 是一种同时提供了有损压缩与无损压缩的图片文件格式,派生自视频编码格式 VP8。WebP 最初在2010年发布,目标是减少文件大小,但达到和JEPG格式相同的图片质量,希望能够减少图片档在网络上的发送时间。2011年11月8日,Google 开始让 WebP 支持无损压缩和透明色的功能。 根据 Google 较早的测试,WebP 的无损压缩比网络上找到的 PNG 档少了 45% 的文件大小,即使这些 PNG 档在使用 PNGCRUSH 和 PNGOUT 处理过,WebP 还是可以减少 28% 的文件大小。就目前而言,Webp 可以让图片大小平均减少 70% 。WebP 是未来图片格式的发展趋势。

Android Studio可以将PNG、JPG、BMP或静态GIF图像转换为WebP格式。

  1. 右键单击一个图像文件或包含许多图像文件的文件夹,然后单击Convert to WebP。
  2. 会弹出图像转换为WebP对话框。
    • 默认设置取决于当前模块的minSdkVersion设置。
    • 在这里由于我这个项目的minSdkVersion = 15。所以系统给我默认选择是有损的webp图像设置。
  3. 选择有损或无损编码。在这里我们选择有损的。 注意:点9图(.9.png)格式的文件,不能转换为WebP图像。转换工具总是自动跳过9个补丁的图像 如果您的minSdkVersion设置为18或更高,则只能使用无损编码。如果选择有损编码,则设置编码质量,并在保存之前选择是否查看每个转换图像的预览。 您还可以选择跳过转换任何文件,这些文件的编码版本将大于原始版本,或者任何具有透明或alpha通道的文件。 由于Android Studio只允许您创建透明的WebP图像,如果您的minSdkVersion设置为18或更高,那么如果您的minSdkVersion低于18,则自动选择透明/ alpha通道复选框的跳过图像。
  4. 如果您选择无损的,单击OK开始转换。如果您正在转换多个图像,那么转换是一个单步,并且可以撤消,以恢复您一次性转换的所有图像。
  5. 如果您选择上面的无损转换,那么转换将立即发生。你的图像在原来的位置被转换。如果选择了有损转换,则继续下一步。
  6. 质量设置为100%。您也可以选择默认的75%看一下效果,这两个图像几乎没有差别。

+++++webp图片转化就介绍到这++++++

2另外一个关于图片瘦身操作小图标尽量使用svg图片 SVG(Scalable Vector Graphics),可缩放矢量图。SVG不会像位图一样因为缩放而让图片质量下降。优点在于可以减小APK的尺寸。常用于简单小图标。 svg是由xml定义的,标准svg根节点为。 Android中只支持 ,我们可以通过 vector 将svg 的根节点 转换为 。 在Android Studio中打开工程,在res目录中点击右键

2.1SVG批量转换 如果有多个svg需要转换为android的vector,则可以通过第三方工具 svg2vector 进行批量转换。 执行转换命令:

java -jar svg2vector-cli-1.0.1.jar -d . -o a -h 20 -w 20 
-d 指定svg文件所在目录
-o 输出android vector图像目录
-h 设置转换后svg的高
-w 设置转换后svg的宽

2.2支持库 在 build.gradle 中配置如下,适用于 Gradle 插件2.0及以上版本: android{ // Gradle Plugin 2.0+ defaultConfig{ // 利用支持库中的 VectorDrawableCompat 类,可实现 2.1 版本及更高版本中支持 VectorDrawable vectorDrawables.useSupportLibrary = true } }

2.2使用矢量图 必须使用 app:srcCompat 属性,而不是 android:src,如下:

2.3Tint着色器 虽然我们前面说了,可以直接在 xml 文件中修改矢量图的颜色,但是并不建议直接修改,我们一般让矢量图为黑色,然后用 Tint 着色器去修改矢量图的颜色。
2.4Tint着色器--点击变色 创建两个选择器,然后正常使用即可

  1. 去除多语言 虽然可能我们项目里没有引用,但依赖的第三方或许有 所以如下设置 在 app/build.gradle 添加

    android{

     ...
     defaultConfig{
     ...
      //只保留英语
      resConfigs "en"
    

    } }

  2. 去除不必要 so 库通过反编译 Android 微信版本 得知,微信也只适配了 armeabi-v7a 架构,那么我们删掉其它库的支持吧。

      android{
     ...
      defaultConfig{
     ...
       ndk {
      //设置支持的SO库架构
      abiFilters "armeabi-v7a"
            }
        }
     }
    
  3. 去除无用资源 Link 检查(谨慎删除) 概念Lint 是 Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构 / 质量问题,同时提供一些解决方案,而且这个过程不需要我们手写测试用例。代码迭代版本一多,很容易会遗留一些无用的代码、资源文件,我们可以使用 Lint 进行清除。

怎么使用 Link 检查打开 AS 工具,找到 Analyze > Run Inspection By Name > unused resources

  1. 开启混淆

  2. 移除无用资源

shinkResource开启 shinkResource = true

buildTypes {
release {
minifyEnabled true
shrinkResources = true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
 debug {
shrinkResources = true
minifyEnabled true
 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
   }
}

7压缩资源 如果你有想要保留或舍弃的特定资源,则可以创建如下的 xml 文件,然后在 tools:keep 属性中指定每个要保留的资源,在 tools:discard 属性中指定每个要舍弃的资源。

8什么是 AndResGuardAndResGuard 是一个缩小APK大小的工具,它的原理类似JavaProguard,但是只针对资源。它会将原本冗长的资源路径变短,例如将 res/drawable/wechat 变为r/d/a。为什么使用AndResGuard在以往的开发中,我们通常只混淆了代码,资源文件却暴露在他人面前,res 文件夹下所有文件名的可读性过强。使用后的效果

AndResGuard 集成方式 github.com/shwenzhang/…

复制代码在 app 模块下的 build.gradle 文件添加apply from: 'and_res_guard.gradle' 复制代码打包完之后效果图