Android apk 瘦身
开发过程中apk不可避免的会越来越臃肿,在升级更新时会消耗越多的流量,占用用户更多的存储空间,影响产品的转化率,所以很有必要对apk进行瘦身。网上有很多关于apk瘦身的优秀文章,这里只是简单做个记录。
使用Android studio分析apk大小
点击Build–>Analyze APK,选择要分析的apk文件,可以看到apk中不同资源所占比例大小。接下来就可以针对性的对apk进行瘦身了
APK瘦身
去除一些第三方库
由于项目中用到百度导航,融云等第三方服务,导入这些资源后,发现apk变的很大,出于减少apk大小的目的,只保留armeabi一个目录。这里如果只保留一个目录,注意依赖的module中的对应目录也要去除。查找并清除无用资源
使用Android studio自带的lint工具查找无用资源,有以下两种方式:
a. Analyze–>Inspecting Code,选择是对整个工程查找,还是对module查找。
b. Analyze–>Run Inspection by Name,搜索Unused resouces
对于Android Lint分析出来的结果,确认无用后,直接删除即可。在删除图片时,运行时出现报错,发现是在无用的布局文件中用到,删除无用布局文件后正常。
使用tinyPng对图片进行压缩处理
tinyPng官网地址:https://tinypng.com/每个apk中都会用到很多图片,图片往往在apk包中占有很大的空间,对图片的压缩处理变的很必要了。tinyPng支持对png/jpg/.9图片的压缩,在图片不失真的情况下可以多次压缩。
可以看到压缩比例还是挺大的,而且和原图相比看不出什么区别。
使用WEBP,SVG图片资源格式
WebP是Google在2010年发布的一种新型图片格式,支持无损和有损压缩。在无损压缩方面,同质量的WebP图片比PNG的体积小26%,而在有损压缩方面,同质量的WebP图片比JPEG小25-34%。WebP在不降低图片质量的同时,减少了约三分之一的体积。这里提供一个在线转换webp工具:http://zhitu.isux.us/
对代码进行混淆
在app下的build.gradle文件中添加如下代码:
buildTypes {
release {
minifyEnabled true
// 混淆文件的位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
在proguard-rules.pro文件中编写自定义混淆代码:
#-----------------混淆配置设定------------------------------------------------------------------------
-optimizationpasses 5 #指定代码压缩级别
-dontusemixedcaseclassnames #混淆时不会产生形形色色的类名
-dontskipnonpubliclibraryclasses #指定不忽略非公共类库
-dontpreverify #不预校验,如果需要预校验,是-dontoptimize
-ignorewarnings #屏蔽警告
-verbose #混淆时记录日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #混淆时所采用的算法
#-----------------不需要混淆第三方类库---------------------------------------------------------------
-dontwarn android.support.v4.** #去掉警告
-keep class android.support.v4.** { *; } #过滤android.support.v4
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment
#-----------------不需要混淆系统组件等----------------------------------------------------------------
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * { #保持native方法不被混淆
native <methods>;
}
-keepclasseswithmembers class * { #保持自定义控件类不被混淆
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * { #保持自定义控件类不被混淆
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity { #保持自定义控件类不被混淆
public void *(android.view.View);
}
对apk的瘦身暂时写到这里,当然还有很多其他方式,以后会慢慢研究使用。
路漫漫其修远兮,吾将上下而求索!