您的位置首页>Android>

<img class="yuanchuan_images" title="原创" style="display: none;margin-right: 5px;" src="/d/public/images/yuanchuang.png">Android apk三大瘦身步骤

摘要 大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Android apk三大瘦身步骤问题。为什么apk越来越大?1 随着项目的不断发展,函数越

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Android apk三大瘦身步骤问题。

为什么apk越来越大?

1.随着项目的不断发展,函数越多,代码越多,资源文件越多。

2.2.app支持的主流dpi越来越多,如ldpi、mdpi、hdpi、XH XXXH等,间接导致资源增加。

3.引入了越来越多的第三方SDK或开源库,增加了许多重复的资源或方法以及无效代码。

4.对体验要求高,图片资源会用分辨率更高的图片来保证清晰度。

apk瘦身的切入点。

解压缩一个未增强的apk文件,我们将看到以下内容。我相信你已经知道这些文件或目录的含义了。接下来,我们将从三个方面对apk进行瘦身操作:

1.Java代码,对应classes.dex文件,我们需要剔除无效代码,减少dex文件的大小。

2.资源文件,对应res文件夹和资产目录。

3.减少lib中引入的so的大小。

开始减肥。

接下来,我们将重点介绍apk瘦身的上述三个切入点。

1.减少Java代码的大小。

有人认为这方面的处理很无味,因为每一行代码对应对应的功能,这里能减少多少空间也不完全是这样。随着项目的不断推进,编码过程中会产生很多冗余代码,比如被删除的被遗漏,功能重复的工具太多,引用无效等。这还是第二次。更大的问题是,随着你引入的开源库越来越多,无效代码的出现几乎是不可避免的事件。让我们言归正传。

打开minifyEnable。

它的功能不仅是混淆代码,而且是优化压缩。它将遍历所有代码,找出没有被引用的代码,这些代码不会在apk中生成。此外,混淆效果是将原来的类名和属性名替换为短字母,也可以在一定程度上减少代码量。

定期检查重构代码。

代码的持续优化是提高个人能力的有效手段,优化的结果会间接精简apk。

选择您谨慎使用的开源库。

许多开源库为不同的平台提供了简化的版本,目的是删除这个平台上不必要的代码,比如fastJson。如果我们选择简化版本,我们可以将开源代码减少大约一倍。另外,对于没有简化版本的开源库,需要根据场景考虑是否使用源代码依赖,手动移除不必要的文件资源。

二.资源文档缩减。

先用WebP图片。

文件是apk的很大一部分,尤其是图片资源,所以我们主要关注瘦身图片。首先,我们要对图像编码格式有一个简单的了解。安卓平台支持的格式有:JPEG、png、gif、BNP、WebP(从4.0开始就支持WebP了),但是位图在安卓应用开发中只支持三种JPEG、JPEG、PNG、WebP,从Bitmap类的CompressFormat枚举可以看出(详见源代码)。

JPEG:有损压缩不支持透明通道和多帧动画(RGB)。

PNG:无损压缩,支持透明通道(Argb),PNG的大小比JPEG大。

WebP:支持有损和无损压缩、透明通道和多帧动画,4.0以上是开发首选。根据谷歌官方测试,WebP相比PNG可以缩小45%,即使PNG被压缩,也可以比PNG缩小28%。

PNG格式图片尽量使用NinePatch格式。

图9具有体积小,拉伸不变形的特点,Andro。

id studio可以一键转换,使用起来相当方便。

Lint查找无效资源

Lint可以检查res目录下的无效资源(无法检查assets),然后将其删除,但是有一点要注意,如果资源文件是通过反射机制调用的,Lint是无法知道的,所以使用lint检查出的每一个资源都需要人工进行确认,防止发生异常删除。

开启shrinkResources功能

shrinkResources标识是否去除无用的resource文件,它需要配合minifyEnable使用,同样存在反射机制引用的问题,这种情况会被误删

```

android {

buildTypes {

release {

minifyEnable true

shrinkResources true

}

}

}

```

resConfigs剔除第三方库或者SDK中的资源

第三方库中包含的无效资源通常包含以下两点:

dpi目录,第三方库通常会提供所有的dpi目录以及对应的资源文件,因为它是针对大众使用的,而我们未必都需要,这时候需要选择性的移除。

很多第三方sdk是做了国际化,而我们可能用不到,此时也需要删除国际化资源。

```

defaultConfig {

。。。

resConfigs"zh"//表示只使用中文

resConfigs"xxhdpi"// 表示只是用xxhdpi目录下的资源文件

}

```

三.libs目录瘦身

so文件最终会被打包到libs目录中,我们针对libs目录的瘦身主要是去除不必要的平台ABI的so文件,例如我们只保留v7a和x86平台的so

```

defaultConfig {

ndk {

abiFilters"armeabi-v7a","x86"

}

}

```

四.其他的一些优化

1.不涉及透明图层的图片可以转换为jpg格式,比如欢迎页的图片。

2.使用shape(Vector)替换图片。

3.删除或者替换兼容包中无用的一些图(v4.v7.v13)。

4.删除第三方aar库中使用的大图。

5.把so文件放置在网上或者sd卡内。

为什么apk越来越大?

1.项目不断发展,功能越多,代码量增加的同时,资源文件也在不断的增多。

2.app支持的主流dpi越来越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,间接导致资源增多。

3.引入的第三方sdk或开源库越来越多,增加了很多重复的资源或方法以及无效代码。

4.用于体验要求高,图片资源为保证清晰度会使用分辨率更高的图片。

apk瘦身的切入点

解压一个没有加固过的apk文件我们会看到下边的内容,相信你对这些文件或目录的含义都已经清楚,接下来我们将会从三个方面进行apk的瘦身操作:

1.Java代码,对应classes.dex文件,我们要剔除无效代码,减小dex文件大小。

2.资源文件,对应res文件夹,assets目录。

3.减小lib中引入的so大小。

开始瘦身

接下来我们将分别针对上边的三个切入点进行apk瘦身。

一.减小Java代码的体积

有人认为这个方面的处理很鸡肋,因为每一行代码都对应相应的功能,这里能有多大的精简空间,其实并非完全如此,随着项目的不断推进,编码过程中会产生很多的冗余代码,比如该删掉的没有删掉,过多的重复性功能的工具类,无效的引用等,这还是其次,比较大的一个问题是,随着你引入的开源库不断增多,无效代码的出现几乎是必然事件,过多的重复方法还会导致64k方法数的问题。接下来进入正题。

开启minifyEnable

它的作用不仅仅是混淆代码,还有压缩优化的功能,他会遍历所有代码并找出没有引用到的代码,这些代码不会生成在apk中;另外混淆的效果是使用简短的字母替代原来的类名属性名等,一定程度上也可以减小代码体积。

定期review重构代码

对代码的不断优化是提升个人能力的有效手段,同时优化的结果也会间接的对apk进行精简。

慎重选择你使用的开源库

很多开源库针对不同平台提供了精简版,目的就是移除在本平台上不需要的代码,例如fastJson,我们选择精简版就可以使开源代码缩小一倍左右,另外针对没有精简版的开源库,需要根据场景考虑是否使用源码依赖,手动移除不必要的文件资源。

二.资源文件瘦身

优先采用WebP图片

资源文件是apk中体积占用较大的一部分,尤其是图片资源,所以我们首要以图片的瘦身为主。首先要对图片编码格式有简单了解。Android平台支持的格式有:JPEG,PNG,GIF,BNP,WebP(4.0开始支持WebP),但是Android应用开发中,Bitmap所支持的只有三种JPEG,PNG,WebP,从Bitmap类的CompressFormat枚举可以看出(详见源码)。

JPEG:有损压缩,不支持透明通道和多帧动画(RGB)

PNG:无损压缩,支持透明通道(ARGB),PNG大小大于JPEG

WebP:支持有损和无损压缩,支持透明通道和多帧动画,4.0以上是开发首选,Google官方测试,WebP比PNG能减少45%大小,即便PNG经过压缩,也能相比PNG减小28%

PNG格式图片尽量使用NinePatch格式

9图具有体积小,拉伸不变形的特点,并且Android studio可以一键转换,使用起来相当方便。

Lint查找无效资源

Lint可以检查res目录下的无效资源(无法检查assets),然后将其删除,但是有一点要注意,如果资源文件是通过反射机制调用的,Lint是无法知道的,所以使用lint检查出的每一个资源都需要人工进行确认,防止发生异常删除。

开启shrinkResources功能

shrinkResources标识是否去除无用的resource文件,它需要配合minifyEnable使用,同样存在反射机制引用的问题,这种情况会被误删

```

android {

buildTypes {

release {

minifyEnable true

shrinkResources true

}

}

}

```

resConfigs剔除第三方库或者SDK中的资源

第三方库中包含的无效资源通常包含以下两点:

dpi目录,第三方库通常会提供所有的dpi目录以及对应的资源文件,因为它是针对大众使用的,而我们未必都需要,这时候需要选择性的移除。

很多第三方sdk是做了国际化,而我们可能用不到,此时也需要删除国际化资源。

```

defaultConfig {

。。。

resConfigs"zh"//表示只使用中文

resConfigs"xxhdpi"// 表示只是用xxhdpi目录下的资源文件

}

```

三.libs目录瘦身

so文件最终会被打包到libs目录中,我们针对libs目录的瘦身主要是去除不必要的平台ABI的so文件,例如我们只保留v7a和x86平台的so

```

defaultConfig {

ndk {

abiFilters"armeabi-v7a","x86"

}

}

```

四.其他的一些优化

1.不涉及透明图层的图片可以转换为jpg格式,比如欢迎页的图片。

2.使用shape(Vector)替换图片。

3.删除或者替换兼容包中无用的一些图(v4.v7.v13)。

4.删除第三方aar库中使用的大图。

5.把so文件放置在网上或者sd卡内。

.dfma { position: relative; width: 1000px; margin: 0 auto; } .dfma a::after { position: absolute; left: 0; bottom: 0; width: 30px; line-height: 1.4; text-align: center; background-color: rgba(0, 0, 0, .5); color: #fff; font-size: 12px; content:"广告"; } .dfma img { display: block; }
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。