Android apk 瘦身

来源:互联网 发布:知乎帖子怎么删除 编辑:程序博客网 时间:2024/05/17 22:21

Android apk 瘦身

开发过程中apk不可避免的会越来越臃肿,在升级更新时会消耗越多的流量,占用用户更多的存储空间,影响产品的转化率,所以很有必要对apk进行瘦身。网上有很多关于apk瘦身的优秀文章,这里只是简单做个记录。

使用Android studio分析apk大小

点击Build–>Analyze APK,选择要分析的apk文件,可以看到apk中不同资源所占比例大小。接下来就可以针对性的对apk进行瘦身了
这里写图片描述

APK瘦身

  1. 去除一些第三方库
    由于项目中用到百度导航,融云等第三方服务,导入这些资源后,发现apk变的很大,出于减少apk大小的目的,只保留armeabi一个目录。这里如果只保留一个目录,注意依赖的module中的对应目录也要去除。

  2. 查找并清除无用资源
    使用Android studio自带的lint工具查找无用资源,有以下两种方式:
    a. Analyze–>Inspecting Code,选择是对整个工程查找,还是对module查找。
    这里写图片描述

    这里写图片描述

    b. Analyze–>Run Inspection by Name,搜索Unused resouces
    这里写图片描述

    对于Android Lint分析出来的结果,确认无用后,直接删除即可。在删除图片时,运行时出现报错,发现是在无用的布局文件中用到,删除无用布局文件后正常。

  3. 使用tinyPng对图片进行压缩处理
    tinyPng官网地址:https://tinypng.com/

    每个apk中都会用到很多图片,图片往往在apk包中占有很大的空间,对图片的压缩处理变的很必要了。tinyPng支持对png/jpg/.9图片的压缩,在图片不失真的情况下可以多次压缩。
    这里写图片描述

    可以看到压缩比例还是挺大的,而且和原图相比看不出什么区别。

  4. 使用WEBP,SVG图片资源格式
    WebP是Google在2010年发布的一种新型图片格式,支持无损和有损压缩。在无损压缩方面,同质量的WebP图片比PNG的体积小26%,而在有损压缩方面,同质量的WebP图片比JPEG小25-34%。WebP在不降低图片质量的同时,减少了约三分之一的体积。

    这里提供一个在线转换webp工具:http://zhitu.isux.us/

  5. 对代码进行混淆

在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的瘦身暂时写到这里,当然还有很多其他方式,以后会慢慢研究使用。

路漫漫其修远兮,吾将上下而求索!