Android-APK极限压缩

  • webp
  • 解码耗时对比
  • 编码耗时对比
  • 极限压缩
  • 原始APK大小
  • 21.6 MB
  • 第一步:图片转webp
  • 21.4MB,小了一点
  • 第二步:减少国际化(去除多种语言)
  • 21.3MB
  • 第三步:减少CPU架构平台
  • 9.92MB
  • 第四步:移除无用资源
  • 可以用这一种:Lint检查
  • 9.82MB
  • 第五步:开启混淆
  • 8.02MB
  • 第六步:开启删除无用资源(与Lint不同)
  • 7.68MB
  • 第七步:微信和科技(AndResGuard)
  • 6.72MB


webp

WebP最初在2010年发布,目标是减少文件大小,但达到和JPEG格式相同的图片质量,希望能够减少图片档在网络上的发送时间,是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式;
AndroidStudio支持将图片转换成webp格式;
下面来看看怎么操作~~

1、图片上右键,选择

android 高压缩_System


2、点击OK

android 高压缩_System_02


3、可以看到转换前图片大小、转换后的图片大小,点击Finish

android 高压缩_安卓_03


4、生成webp图片

android 高压缩_System_04


1、需要注意的是,原图就不见了,记得先备份下原图,是不是大大的减少了很多~~

2、还有个需要注意的点:不支持SDK18以前的…如果需要支持需要用其他库

解码耗时对比

也就是去读图片

//        webp   解码速度   编码速度
        long l = System.currentTimeMillis();
        BitmapFactory.decodeResource(getResources(), R.drawable.splash_bg_webp);
        Log.e(TAG, "解码webp图片耗时:" + (System.currentTimeMillis() - l));
        l = System.currentTimeMillis();
        BitmapFactory.decodeResource(getResources(), R.drawable.splash_bg_jpeg);
        Log.e(TAG, "解码jpeg图片耗时:" + (System.currentTimeMillis() - l));
        l = System.currentTimeMillis();
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.splash_bg_png);
        Log.e(TAG, "解码png图片耗时:" + (System.currentTimeMillis() - l));

看打印

解码耗时上,和其他两种图片格式几乎一样,没啥差别

kaizi: 解码webp图片耗时:30
kaizi: 解码jpeg图片耗时:37
kaizi: 解码png图片耗时:29

编码耗时对比

也就是压缩成图片,比对耗时

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.splash_bg_png);
        l = System.currentTimeMillis();
        compressBitmap(bitmap, Bitmap.CompressFormat.PNG, Environment
                .getExternalStorageDirectory() + "/test.png");
        Log.e(TAG, "------->编码png图片耗时:" + (System.currentTimeMillis() - l));

        l = System.currentTimeMillis();
        compressBitmap(bitmap, Bitmap.CompressFormat.JPEG, Environment
                .getExternalStorageDirectory() + "/test.jpeg");
        Log.e(TAG, "------->编码jpeg图片耗时:" + (System.currentTimeMillis() - l));
//------------------webp-------------------------------------
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.splash_bg_png);
        l = System.currentTimeMillis();
        compressBitmap(bitmap, Bitmap.CompressFormat.WEBP, Environment
                .getExternalStorageDirectory() + "/test.webp");
        Log.e(TAG, "------->编码webp图片耗时:" + (System.currentTimeMillis() - l));


	private void compressBitmap(Bitmap bitmap, Bitmap.CompressFormat format, String file) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        bitmap.compress(format, 75, fos);
        if (null != fos) {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

看打印

kaizi: ------->编码png图片耗时:526
kaizi: ------->编码jpeg图片耗时:39
kaizi: ------->编码webp图片耗时:350

webp就到着了,我们只看看这种图片格式压缩率的效果,下面的apk极限压缩我们需要用到~~

极限压缩

瘦身之旅开始之前,我用开源中国里面下载下来有一个仿微信的Android项目,我们来进行压缩看看效果;~~

原始APK大小

21.6 MB

android 高压缩_System_05

第一步:图片转webp

android 高压缩_安卓_06


android 高压缩_android_07


有些图片本身就很小了,会转换不了~还有.9图也会跳过

android 高压缩_安卓_08


看看大小对比

21.4MB,小了一点

android 高压缩_安卓_09

第二步:减少国际化(去除多种语言)

因为系统中V7包继承了国际化,所以这类我们减少国际化。只留下英文的 和 默认的

apply plugin: 'com.android.application'
apply from: 'and_res_guard.gradle.gradle'
android {
    .......
    defaultConfig {
        ......
        //只保留英文资源
        resConfig 'en'
    }
}

看看对比大小

21.3MB

减少的虽然很小,但是那也是我们挤的牙膏,哈哈哈哈哈哈

android 高压缩_android_10

第三步:减少CPU架构平台

so:减少cpu平台,只保留适配 armeabi-v7a,现在支持这一种就可以了,基本都可以适配现在市面上手机了;

apply plugin: 'com.android.application'
apply from: 'and_res_guard.gradle.gradle'
android {
    .......
    defaultConfig {
        ......
        //只保留英文资源
        resConfig 'en'
        ndk {
            //设置支持的SO库架构
            abiFilters "armeabi-v7a"
        }
    }
}

看看对比大小

9.92MB

这一下效果是不是很明显了?~~

android 高压缩_Android_11

第四步:移除无用资源

我们经常是不是会有些资源(布局xml等等)换一下,可能就没用到了,但是又忘记删除了,这个时候我们如果需要删除的话,AndroidStudio能帮我们一键移除;

注意

谨慎使用,这里是会移除我们没有引用的资源,但是反射用到的资源,也会被移除,我们最好提前备份好,防止找不回来了…

android 高压缩_android 高压缩_12


上面这种一键移除不太建议使用…

可以用这一种:Lint检查

Lint 是Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量问题,同时提供一些解决方案,而且这个过程不需要我们手写测试用例。

代码迭代版本一多,很容易会遗留一些无用的代码、资源文件,我们可以使用 Lint 进行清除。

这个会给我们提供参考价值方案,告诉我们哪些没有被使用,建议我们手动删除~~

android 高压缩_安卓_13


注意:
如果某个java类没有使用到,但是里面引用了资源文件,这个资源文件就不会出现在方案中…

看看对比大小

9.82MB

还行吧。。。如果大项目,很多都没有用到的话,去掉就效果很明显了…

android 高压缩_android_14

第五步:开启混淆

minifyEnabled true 开启混淆

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

Android代码混淆,又称Android混淆,是一种Android APP保护技术,用于保护APP不被破解和逆向分析。

ProGuard的三大作用
1、压缩
移除未被使用的类、属性、方法等,并且会在优化动作执行之后再次执行(因为优化后可能会再次暴露一些未被使用的类和成员。
2、优化
优化字节码,并删除未使用的结构。
3、混淆
将类名、属性名、方法名混淆为难以读懂的字母

看看对比大小

8.02MB

一下又减小了不少~~

android 高压缩_安卓_15

第六步:开启删除无用资源(与Lint不同)

shrinkResources true 开启删除无用资源;
需要配合混淆 mififyEnable 一起来使用;

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

shrinkResources 用来开启压缩无用资源,也就是没有被引用的文件(实际并不是彻底删除,而是保留文件名,但是没有内容,等等),但是因为需要知道是否被引用所以需要配合mififyEnable使用,只有当两者都为true的时候才会起到真正的删除无效代码和无引用资源的目的;

这个布局没有被使用到,里面是由布局的;

android 高压缩_android 高压缩_16


开启删除无用资源后,看看apk里面的这个布局~

android 高压缩_安卓_17


看看对比大小

7.68MB

苍蝇再小也是rou。。。。

android 高压缩_System_18

第七步:微信和科技(AndResGuard)

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

classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.15'

 

6.72MB

android 高压缩_android_19