APK怎么从18M减小到9M
背景
一开始由于业务的增加,导致APK的体积也与日俱增,已经增加到了18M,这对整个产品的推广的成本会受到影响,所以需要通过一系列的优化将APK降下来,经过了几个方面的优化之后,成功的使得apk降低了9-10M之多;
Lint审查–减少300-600K
Android Studio —>Analyze —>Inspect Code通过lint检查可以筛选出没有用到的资源(图片、layout)、项目当中可能存在的BUG、代码书写的不规范
不懂lint代码可以看另一篇文档 Android Lint 优化
图片压缩和图片转换为webP 可以减少6M
tinypng图片压缩神器
这是一个针对png或者jpg的图片压缩网站,我们都知道在Android打包的时候会自动针对图片进行无损压缩,但是如果对于图像画质要求不高的app(游戏、设计类的APP除外)可以使用tinypng进行75%(官方推荐)的压缩;
webP格式转换
WebP(发音 weppy,项目主页),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8。根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使这些 PNG 文件经过其他压缩工具压缩之后,WebP 还是可以减少 28% 的文件大小。
WebP 的优势体现在它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都非常优秀、稳定和统一。
webP格式转换工具
Android 当中利用webP
在Android4.0之后,Android已经原生支持webP的使用,使用方法和以前使用png的图片一样(R.drawable.ic_launcher或者是R.mipmap.ic_launcher),但是需要注意的是如果图片有透明度(Alpha) 是在4.0.0的上如果使用webP的话会把Alpha给取消,知道Android4.2.+以上才会避免这个问题;所以如果你还有4.0.0到4.2之间的用户时请注意webP图片的使用限制;
如果在4.0.0以下的系统也是有办法支持webP的格式的,不过需要增加so和jar包,但是增加jar包和so包同样会增大apk的体积,在这里需要开发者自己衡量是否需要去使用;
通过Proguard混淆 可以减少1-2M
AS当中开启混淆
buildTypes {
release {
//签名
signingConfig signingConfigs.release
//是否可debug调试
debuggable false
//混淆
minifyEnabled true
//Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
//加载默认混淆配置文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
proguard混淆规则
-keep class 保持这条规则下的内容不被混淆
-dontwarn 不需要理会 warn
#保存 native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
#View的构造函数
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class com.example.wisdomoperating.activity.WidelyWebViewActivity{
public *;
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
#枚举类
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#实现Parcelable的类
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
一些常用的第三方类的混淆
# 友盟
-dontwarn com.umeng.**
-dontnote com.umeng.**
-keep public class * extends com.umeng.**
-keep class com.umeng.** {*;}
# 友盟
# 腾讯
-dontwarn com.tencent.**
-dontnote com.tencent.**
-keep class com.tencent.** { *;}
# 腾讯
# 百度地图
-dontwarn com.baidu.**
-dontnote com.baidu.**
-keep class com.baidu.** { *;}
# 百度地图
# OKHttp
-keep class com.google.android.gms.** {*;}
-dontwarn com.google.android.gms.**
-dontnote com.google.android.gms.**
-keep class com.squareup.okhttp.**$* {*;}
-keep class com.squareup.picasso.**$* {*;}
-dontwarn com.squareup.okhttp.**$*
-dontwarn com.squareup.okhttp.**
-dontnote com.squareup.okhttp.**
-keep class com.parse.** {*;}
-dontnote com.parse.**
-dontnote com.parse.**$*
-dontwarn com.parse.**$*
-keep class okio.** {*;}
# OKHttp
注解 js不被混淆<br/>
-keepattributes *Annotation*
-keepattributes *JavascriptInterface*
微信资源压缩1-2M
微信资源压缩是微信2014年推出res资源混淆工具,现已经提供AS插件andresguard github地址
基本使用方法,官方文档已经给出,在这里要提醒大家需要注意的一点就是 whitelist 白名单;如果你的资源文件有通过resource反射获取的话,那必须要在白名单中写上,还有如果用了一些第三方的sdk,例如umeng或者sharesdk,这个时候也要把其string或者drawable放入白名单当中;还有一个需要注意的就是最后取包是去7zip压缩之后的包,因为这个apk压缩的更小,同样推荐在linux上进行压缩,apk会比windows小100-300k之间;
忽略其他语言版本
大部分应用其实并不需要支持几十种语言的国际化支持。还好强大的gradle支持语言的配置,比如国内应用只支持中文:
android {
defaultConfig {
resConfigs "zh"
}
}
使用一套资源
对于绝大对数APP来说,只需要取一套设计图就足够了。鉴于现在分辨率的趋势放到xxhdpi目录。
相对于多套资源,在视觉上差别不大,很多大公司的产品也是如此,但却能显著的减少资源占用大小,顺便也能减轻设计师的出图工作量了。
注意,这里不是说把不是xxhdpi的目录都删除,而是强调保留一套设计资源就够了。
删除armable-v7包和x86包下的so
基本上armable的so也是兼容armable-v7的,armable-v7a的库会对图形渲染方面有很大的改进,如果没有这方面的要求,可以精简。
这里不排除有极少数设备会Crash,可能和不同的so有一定的关系,请大家务必测试周全后再发布。