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、图片上右键,选择
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'
6.72MB