Android Apk瘦身实践

Android Apk瘦身实践

App增加新功能的时,打出apk文件,对比上一个版本,总是会发现增加了不少的体积。有时增加的比较多,就需要考虑给apk减少体积。下面就介绍如何减少apk的体积。

第一条:开启minifyEnabled混淆

在module的build.gradle文件中,开始混淆代码(开启混淆是减少字节最直接的方式,同时也能保护代码被剽窃)。如:

android {
    defaultConfig {
        minifyEnabled true
        ...
    }
}
第二条:开启shrinkResources去除无用资源

因为有多个版本的迭代,可能会导致项目中会有不用的资源文件,因为时间的原因也不能一一找出去除,这是可以使用如下代码,过滤不使用的资源,减少apk的体积。

android {
    defaultConfig {
        ...
        shrinkResources true
    }
}

开启shrinkResources压缩资源后,如果反射获取某个资源时,会导致异常。如果需要保持这个资源可以在res/raw/目录下创建一个keep.xml文件,如:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="safe"
    tools:discard="@layout/dialog_*,@drawable/close"
    tools:keep="@layout/activity_*,@layout/fragment_*,@drawable/close" />

keep.xml中有3个属性,分别是:
- shrinkMode:压缩模式,分为safe , strick
- discard:丢弃(移除)资源,中间使用逗号隔开。
- keep:保留资源,中间使用逗号隔开

第三条:过滤不需要使用的语言资源

在有些lib项目中可能会包含多语言的资源,而module项目不需要使用这些资源,那么可以使用如下代码:

android {
    defaultConfig {
        ...
        resConfigs "en","zh"    //只使用en和zh资源
    }
}
第四条:过滤不需要打包的屏幕分辨率下的资源

在module项目中,有多个drawable目录,但是我们的用户的分辨率是xhdpi级以上的,我们可以过滤低分辨率的资源(有时UI会每个分辨率都给,然后就不自觉的放进去了)。

android {
    defaultConfig {
        ...
        resConfigs "xhdpi","xxhdpi" //只支持xhdpi和xxhdpi屏幕的资源
    }
}
第五条:过滤不需要的so文件
  • 引用第三方的lib库或aar,lib库中包含各种so文件,然而我们的APP只支持arm架构的so,那么我们可以通过下面代码过滤:

    android {
        //剔除aar包多余的依赖,保留arm的so
        packagingOptions {
            exclude 'lib/x86/*'
            exclude 'lib/x86_64/*'
            exclude 'lib/mips/*'
            exclude 'lib/mips64/*'
        }
    }
  • 当项目中使用jni代码,我们只需要arm架构的so,我们可以:

    android{
        defaultConfig {
            ndk{
                moduleName "module_name"
                ldLibs "log", "z", "m", "jnigraphics", "android"
                abiFilters "armeabi"    // "x86","mips"
                cFlags "-std=c++11 -fexceptions"
                stl "gnustl_static"
            }
        }
    }
    
    
第六条:使用provided编译

provided依赖的库是在编译时期引用,是不会真正打包到apk中的,从而可以控制apk的大小。

第七条:避免使用重复的库
compile('com.facebook.android:audience-network-sdk:4.23.0', {
    exclude group: 'com.android.support', module: 'appcompat-v7'// 因为项目引用了v7包,这里排除第三方库的v7包,避免重复
})
compile('com.google.firebase:firebase-ads:9.6.1', {
    exclude group: 'com.android.support' // 因为项目引用了v7包,这里排除第三方库的v7包,避免重复
})
第八条:使用shape资源和layer-list的xml文件来推掉图片资源

Shape的使用

android中layer-list标签

第九条:使用压缩图片的工具tinypng压缩png图片

Tinypng使用智能有损压缩技术,以尽量少的失真换来图片大小的锐减,效果非常好,强烈推荐。

Tinypng的官方网站

第十条:可以使用jpg格式图片,减少apk体积。

对于引导页面的图片,尺寸是比较大的,这是我们可以使用jpg的图片来替代,减少apk的体积。

第十一条:使用多个小图来替代大图

相信各位都非常清楚,大的图片是多么的令人头疼,不仅仅是让apk的体积增大,还容易导致OOM的问题。所以如果能拆成多个小图使用布局拼接,尽量采取这种方式。

第十二条:使用微信资源压缩打包工具

微信资源压缩打包工具通过短资源名称,采用7zip对APP进行极致压缩实现减小APP的目标,效果非常的好。

详情参考:Android资源混淆工具使用说明

除此之外,代码的复用性也非常重要。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值