APK如何瘦身?
(1)使用到的资源尽可能小
(2)可以删除不用的多语言
(3)删除多余的so文件
(4)删除不用的资源
(5)开启混淆
(6)开启严格模式
(7)使用微信资源混淆工具
1、使用到的资源尽可能小
(1)mipmap和drawable中的图片资源尽可能要小;
(2)在打包的时候,assert目录的下文件也会被一起打入包中,这个文件夹中的文件尽可能要小;
(3)Android Studio支持将png转成webp,webp大多数情况下比png更小,所以项目中的图片应该是png和webp混用;
下面简单说明下webp:
(1)webp使用VP8视频编码方式对关键帧压缩;
(2)webp编码是通过预测技术对图片压缩, 它将图片划分为两个8x8色度像素宏块和一个16x16亮度像素宏块。
在每个宏块内,编码器基于之前处理的宏块来预测荣誉动作和颜色信息,通过图像关键帧运算,
使用宏块中已解码的像素来绘制图像中未知部分,通过预测模式去除冗余数据,实现更高效的压缩。
(3)Android Studio自带一个webp转换功能,可以将png图片转换成webp格式
鼠标放在图片目录或者某个图片上,右击,Convert to WebP...
可以有损压缩,也可以无损压缩。
2、可以删除不用的多语言
当项目需要国际化的时候,需要对多种语言进行翻译。
如果项目并不需要国际化,但是由于第三方的库引入,比如appcompat引入,那些依赖中可能存在大量的国际化资源。
使用resConfigs强制限定哪些语言,如下代码:
defaultConfig {
...
resConfigs 'en','zh'
}
在打包的时候,国际化资源只保留英文和中文。
如果项目本身就是需要国际化,那么请忽视上述方法。
3、删除多余的so文件
有很多CPU架构,armeabi-v7a几乎支持所有的Android设备,Android中的so文件只需要保留armeabi-v7a即可。
4、删除不用的资源
(1)一键移除未被使用的资源
Android Studio的操作是:Refactor --> Remove Unused Resourses...
但是这种方式容易造成误删,当动态获取资源id,未直接使用R.xx.xx时,使用该方式资源会被误删。
int indetifier = getResources().getIdentifier("img_bubble_receive", "drawable", getPackageName());
getResources().getDrawable(indetifier);
另外,当使用反射获取图片资源时,也会被误删。
(2)Link检查
Android Studio的操作是:Analyze --> Run Inspection by Name... --> Unsed resources
Lint 是Android Studio 提供的代码扫描分析工具,它可以帮助我们发现代码结构/质量问题,同时提供一些解决方案,
而且这个过程不需要我们手写测试用例。
代码迭代版本一多,很容易会遗留一些无用的代码、资源文件,我们可以使用 Lint 进行清除。
5、开启混淆
Android代码混淆,又称Android混淆,是一种Android APP保护技术,用于保护APP不被破解和逆向分析。
ProGuard的三大作用:
(1)压缩
移除未被使用的类、属性、方法等,并且会在优化动作执行之后再次执行(因为优化后可能会再次暴露一些未被使用的类和成员。
(2)优化
优化字节码,并删除未使用的结构。
(3)混淆
将类名、属性名、方法名混淆为难以读懂的字母
android {
...
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
6、shrinkResources删除无用资源
android {
...
buildTypes {
release {
//资源缩减
shrinkResources true
//源代码混淆 true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
//资源缩减
shrinkResources true
//源代码混淆 true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
shrinkResources用来开启压缩无用资源,也就是没有被引用的文件;
打包之后,没有使用的资源(drawable和layout)会被清除,文件还在,但是里面的内容被清除了;
但是因为需要知道是否被引用所以需要配合mififyEnable使用,只有当两者都为true的时候才会起作用。
Android开启混淆之后,如果不需要混淆某个类,那么可以在proguardFiles指定的混淆文件中keep掉这个类。
shrinkResources同样可以使用同样的方法将不需要删除的资源keep住,代码如下:
路径:res---raw---keep.xml
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:discard="@color/selector_tint_color"
tools:keep="@layout/activity_test1,@layout/activity_test2"
tools:shrinkMode="strict"/>
<!--discard:做严格检查-->
<!--keep :不做严格检查-->
<!--shrinkMode="strict" :该模式只保留在代码或者资源文件中明确引用的资源-->
<!--shrinkMode="safe" :该模式会保留所有明确引用的资源以及可能被 Resources.getIdentifier() 动态引用的资源-->
或
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="[http://schemas.android.com/tools](http://schemas.android.com/tools)"
tools:keep="@layout/base_*"
tools:discard="@layout/unused2" />
7、使用微信资源混淆工具
AndResGuard是一个缩小APK大小的工具,它的原理类似Java Proguard,但是只针对资源。
它会将原本冗长的资源路径变短,例如将res/drawable/wechat变为r/d/a。
在以往的开发中,我们通常只混淆了代码,资源文件却暴露在他人面前,res文件夹下所有文件名的可读性过强。
AndResGuard 7zip压缩正好解决这种问题,对资源进行混淆,保护res资源文件的可读性,同时,可以减少APP的大小。
被AndResGuard 工具混淆之后,根本无法知道哪个文件夹是存放布局文件的,哪些文件夹是存放图片的,
即使找到存放xml文件的文件夹,xml名字被混淆,从文件名也难以知道这些xml是干嘛用的。
[本章完...]
网友评论