Android-APK极限压缩

webp

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

1、图片上右键,选择
在这里插入图片描述
2、点击OK
在这里插入图片描述
3、可以看到转换前图片大小、转换后的图片大小,点击Finish
在这里插入图片描述
4、生成webp图片
在这里插入图片描述
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

在这里插入图片描述

第一步:图片转webp

在这里插入图片描述
在这里插入图片描述
有些图片本身就很小了,会转换不了~还有.9图也会跳过
在这里插入图片描述
看看大小对比

21.4MB,小了一点

在这里插入图片描述

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

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

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

看看对比大小

21.3MB

减少的虽然很小,但是那也是我们挤的牙膏,哈哈哈哈哈哈
在这里插入图片描述

第三步:减少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

这一下效果是不是很明显了?~~
在这里插入图片描述

第四步:移除无用资源

我们经常是不是会有些资源(布局xml等等)换一下,可能就没用到了,但是又忘记删除了,这个时候我们如果需要删除的话,AndroidStudio能帮我们一键移除;
注意
谨慎使用,这里是会移除我们没有引用的资源,但是反射用到的资源,也会被移除,我们最好提前备份好,防止找不回来了…
在这里插入图片描述
上面这种一键移除不太建议使用…

可以用这一种:Lint检查

Lint 是Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量问题,同时提供一些解决方案,而且这个过程不需要我们手写测试用例。
代码迭代版本一多,很容易会遗留一些无用的代码、资源文件,我们可以使用 Lint 进行清除。
这个会给我们提供参考价值方案,告诉我们哪些没有被使用,建议我们手动删除~~
在这里插入图片描述
注意:
如果某个java类没有使用到,但是里面引用了资源文件,这个资源文件就不会出现在方案中…

看看对比大小

9.82MB

还行吧。。。如果大项目,很多都没有用到的话,去掉就效果很明显了…
在这里插入图片描述

第五步:开启混淆

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

一下又减小了不少~~
在这里插入图片描述

第六步:开启删除无用资源(与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的时候才会起到真正的删除无效代码和无引用资源的目的;

这个布局没有被使用到,里面是由布局的;
原布局
开启删除无用资源后,看看apk里面的这个布局~
在这里插入图片描述
看看对比大小

7.68MB

苍蝇再小也是rou。。。。
在这里插入图片描述

第七步:微信和科技(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'

具体使用去看看:AndResGuard-github
看看对比效果

6.72MB

在这里插入图片描述
最终我们从21.6MB----》6.72MB,这压缩率还是可以的吧~~哈哈

辛苦各位童鞋观看到最后,如果博客中有不对的地方望指出,大神勿喷,谢谢~~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值