Android-APK瘦身技术 减小软件安装包体积

  1. 1. 辅助分析工具
  2. 2. apk的组成
  3. 3. 瘦身开始
    1. 3.1. 1. 开启minifyEnabled
      1. 3.1.1. 混淆规则proguard使用注意
    2. 3.2. 2. 开启shrinkResources
    3. 3.3. *3. 删除无用的语言资源

原文:https://blog.csdn.net/Peterpan1223/article/details/67653792

辅助分析工具

在线网站:https://nimbledroid.com/

能够得知app内存使用,网络使用,磁盘输入/输出,文件大小等一些数据

  • 无需翻墙,但是访问比较慢
  • 需要注册

apk的组成

  • classes.dex java源码编译后生成的java字节码文件
  • resources.arsc 编译后的布局文件
  • AndroidMainfest.xml
  • assets 目录,存放一些配置文件
  • lib 目录,子目录armebin存放的是一些so文件或者jar包
  • META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全
  • res apk图片资源

瘦身开始

1. 开启minifyEnabled

  • 开启混淆
  • 删除没用的类(文件)和方法
  • 代码压缩
1
2
3
4
5
6
7
buildTypes {
......
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

混淆规则proguard使用注意

  • 类型转换错误,使用Gson之类的需要注意

    1
    -keepattributes Signature
  • 忽略警告

    1
    -ignorewarnings
  • webview中js和本地代码有叫交互,保持“桥梁类”不被混淆

    1
    2
    3
    4
    -keepclassmembers  class  com.xxx.xxxx.xxxx.HuodongBeBindedToJS
    {
    public *;
    }
  • 第三方包不被混淆

    1
    2
    3
    #-libraryjars /libs/core.jar
    -dontwarn com.google.zxing.**
    -keep class com.google.zxing.** { *;}
  • 常见第三方包
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #zxing
    #-libraryjars /libs/core.jar
    -dontwarn com.google.zxing.**
    -keep class com.google.zxing.** { *;}

    #支付宝
    #-libraryjars /libs/alipay_sdk.jar
    -dontwarn com.alipay.android.app.**
    -keep class com.alipay.android.app.** {*;}
    #友盟
    #-libraryjars /libs/umeng_sdk.jar
    -dontwarn com.umeng.**
    -keep class com.umeng.** { *;}
    -keepclassmembers class * { public <init>(org.json.JSONObject); }
    -keep public class com.hyx.maizuo.main.R$*{ public static final int *; }
    -keep public class com.umeng.fb.ui.ThreadView { }


    #百度地图
    #-libraryjars /libs/baidumapapi.jar
    -dontwarn com.baidu.mapapi.**
    -keep class com.baidu.mapapi.** { *;}

    #fastJson
    #-libraryjars /libs/fastjson-1.1.20.jar
    -dontwarn com.alibaba.fastjson.**
    -keep class com.alibaba.fastjson.** { *;}


    #微信
    #-libraryjars /libs/libammsdk.jar
    -dontwarn com.tencent.mm.sdk.**
    -keep class com.tencent.mm.sdk.** {*;}
    示例 proguard-rules.pro文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    # Add project specific ProGuard rules here.
    # By default, the flags in this file are appended to flags specified
    # in D:\ProgramFiles\Android\sdk/tools/proguard/proguard-android.txt
    # You can edit the include path and order by changing the proguardFiles
    # directive in build.gradle.
    #
    # For more details, see
    # http://developer.android.com/guide/developing/tools/proguard.html

    # Add any project specific keep options here:

    # js调用android方法:window.映射字符串.callPhone(参数)

    # If your project uses WebView with JS, uncomment the following
    # and specify the fully qualified class name to the JavaScript interface
    # class:
    #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
    # public *;
    #}

    # 配置代码混淆 默认生成
    -optimizationpasses 5 # 指定代码的压缩级别
    -dontusemixedcaseclassnames # 是否使用大小写混合
    -dontpreverify # 混淆时是否做预校验
    -verbose # 混淆时是否记录日志

    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法

    -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.app.backup.BackupAgentHelper # 保持哪些类不被混淆
    -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);
    }
    -keepclassmembers enum * { # 保持枚举 enum 类不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
    }
    -keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
    public static final android.os.Parcelable$Creator *;
    }

    #忽略警告
    -ignorewarnings

    # 保持属性不管
    -keepattributes Signature

    # 第三方jar包不混淆
    #zxing
    -dontwarn com.google.zxing.**
    -keep class com.google.zxing.** { *;}


    #gson
    -dontwarn com.google.gson.**
    -keep class com.google.gson.** { *;}

    #xutils
    -dontwarn com.lidroid.xutils.**
    -keep class com.lidroid.xutils.** { *;}

    #v4
    -dontwarn android.support.v4.**
    -keep class android.support.v4.** { *;}

    #v7
    -dontwarn android.support.v7.**
    -keep class android.support.v7.** { *;}

    #annotation
    -dontwarn android.support.annotation.**
    -keep class android.support.annotation.** { *;}

    -dontwarn android.net.**
    -keep class android.net.** { *;}

    # tencent
    -dontwarn com.tencent.**
    -keep class com.tencent.** {*;}

    # umeng
    -dontwarn com.umeng.socialize.**
    -keep class com.umeng.socialize.** {*;}

    -dontwarn org.apache.**
    -keep class org.apache.** { *;}

    -dontwarn com.android.internal.http.multipart.**
    -keep class com.android.internal.http.multipart.** { *;}

    # java bean不能混淆
    -keep class com.xiangmu.wyxw.Bean.** {*;}

2. 开启shrinkResources

去除无用的资源,包括工程中临时展示的图片

1
2
3
4
5
debug {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
}

*3. 删除无用的语言资源

1
2
3
4
5
defaultConfig {
...
resConfigs "zh"
...
}