apk瘦身

1. 一套资源
Android在适配图片资源的时候,如果只有一套资源,低密度手机会缩放图片,高密度手机会拉伸图片。我们利用这个特性,存放一套资源图就可以供所有密度的手机使用。


综合考虑图片清晰度,静态大小和内存占用情况,一般采用xhdpi下的资源图片。


2.重复资源
很多时候,随着工程的增大,以及开发人员的变动,有些资源文件名字不同,但是内容却完全相同。我们可以通过扫描文件的MD5值,找出名字不同,内容相同的图片并删除,做到图片不重复。


3. 通过Lint工具扫描工程资源
当Lint工具扫描发现无用资源的时候,会输出如下的信息,就可以删除这种资源。


res/layout/preferences.xml: Warning: The resource R.layout.preferences appears
    to be unused [UnusedResources]


需要特别注意的是,需要确保不存在反射,资源拼接等访问这些资源,才可以安全的删除掉这些资源,从而减小资源个数。


4. 通过Gradle参数配置
如果工程比较大,由主工程和多个子工程组成的话,子工程里面也可能包含很多的无用资源。可以通过设置shrinkResources=true让Gradle移走无用的资源,否则默认情况下,Gradle编译只会移除无用代码,而不会关心无用资源。


android {
    // Other settings
 
    buildTypes {
            release {
                    minifyEnabled true
                    shrinkResources true
                    proguardFiles
getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}


需要特别注意的是shrinkResources依赖于minifyEnabled,必须和minifyEnabled一起用,即打开shrinkResources也必须打开minifyEnabled。


5. 通过开源扫描工具
大家可能会发现Lint不是非常好用,当工程里面存在反射,过滤结果非常麻烦。


所以我们实现了一个资源扫描的工具
(https://github.com/zhuzhumouse/ScanUnusedResouce ),
可以过滤掉通过反射调用的资源。


原理就是把所有java和xml文件以字符串扫描到内存,然后拿到资源文件(xml,png,jpg等)名称做匹配查找,如果没有匹配到,该资源就是无用资源,可以直接删除。


该扫描工具可以解决反射调用的问题,但是不能解决资源拼接的问题,还有就是不能处理存在很多资源前缀相同的情况。


6. png图片压缩


可以通过使用图片压缩工具对png图片进行压缩,压缩效果比较好的工具有:
pngcrush,pngquant,zopflipng等,
可以在保持图片质量的前提下,缩减图片的大小。


还可以通过网站对图片进行压缩,如比较有名的www.tinypng.com,该网站对上传的图片自动选择合适的压缩算法,压缩比比较高,但是只支持500张免费图片,更多图片处理是要收费的。


7.优化库中资源


通常在大型的项目中,都会引入很多系统库和第三方的库。


比如低版本兼容库V4、V7、网络请求库、图片处理库等,如果库中包含一些大图,而我们并不会用到,就可以采用1x1的透明图片替代,达到既能编译通过,又可以缩小库体积的目的。


8.Lottie动画库的使用


动画,尤其是帧动画,一直都是相当占用资源的。现在可以通过Airbnb公司开源的Lottie动画库,直接用json文件来描述动画,然后直接加载绘制出来。


具体使用参考:
https://github.com/airbnb/lottie-android


9.大背景图处理


对清晰度要求高的大图片,采用单纯的压缩方法就不能满足UE的要求了,需要找到一种非压缩方式来解决这个问题。


纯色图+后台下载的方式很好的解决了这个问题,客户端先使用纯色图片,然后大图从后端下载,这样只是启动的前几次使用纯色图,以后都会使用大图。


10.其它资源策略


a.首先考虑能否不用图片,比如使用shape代码实现。


b.其次如果用图片的话,能否优先使用.9图来简化图片。


c.采用svg矢量图和VectorDrawable类来替换传统的图片。


d.如果图片只是旋转角度或者颜色不同,可以用代码实现变换


11.代码混淆
在gradle使用minifyEnabled
进行Proguard混淆的配置,
可大大减小APP大小:
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles('proguard.cfg')
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }


 }


 12.无用代码扫描


 同无用资源扫描方式一样,可以针对无用的代码进行扫描,这里需要关注的一点就是在插件里面通过反射的方法调用的主应用的一些类和方法是不能删除的。


也可以使用SonarQube扫描无用类,以及不同类里面的重复代码。


详情请参考:
https://github.com/SonarSource/sonarqube 


13.剔除R文件


 随着项目中资源的增加,会发现生成的dex文件里面R.class文件越来越大。我们知道真正使用资源的地方都是以R.xxx.xxx这种方式访问的,而R.xxx.xx是对应于.arsc文件里面的一个常量值。arsc里面的内容具体如下:
 通过这两张截图我们可以看出,直接用ID替换资源访问代码R.XXX.XXX,这样R.class文件就没有任何作用了,可以删除它,并且代码里面的资源访问字符串也变成了常量,两个方面都减小了dex的大小。


剔除R文件可以参考开源工具:
https://github.com/meili/ThinRPlugin


14.arsc文件优化 


在剔除R文件小节中,大家已经看到了.arsc文件内容格式。在整体优化小节中,已经对.arsc进行了比较大的优化,接下来分析一下其它优化方式。


可以采用混淆来缩减资源文件的名称,以及移除未使用的备用资源等方式来优化.arsc文件。如何移除未使用的备用资源,gradle里面


增加如下配置:
android {
    defaultConfig {
        ...
            resConfigs "zh", "zh_CN", "zh_HK", "zh_MO", "zh_TW", "en"
    }
}
通过该方式,爱奇艺客户端包体积可以缩减100多KB。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值