飞道的博客

Android apk包体瘦身

525人阅读  评论(0)

瘦身原因

大数据统计,一定的范围小,用户的下载意愿与包体大小成正比,当包体超过一定的界限值时,用户的下载意愿就会断崖式的下跌,因此学会如何进行APK包体瘦身,是每一个合格的Android工程师(程序猿)的必备技能。

图片瘦身

使用SVG图片

APK中图片资源占比很大,一般开发中采用的icon类图片都会使用.PNG位图,并且会根据大小、颜色以及状态打等等,会提供多套类似的.PNG图片用于效果展示,实际上可以提供一些思路来处理这个问题
1.使用SVG矢量图
向UI要一个SVG图或者去阿里巴巴图库下载:阿里巴巴图库

下载前可以设置颜色与大小,按需要来即可,接着导入到as中

第一个为Android预设图片可以挑选着用,第二个为从本地文件中导入

改变图中的标识信息,图片将会发生对应的变化

2.使用着色器Tint
Tint可以直接改变SVG图片的颜色

android:src="@drawable/ic_error"
        app:tint="#ff55ccff"

当有随状态发生颜色大小变化时,使用颜色选择器

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/black" android:state_pressed="false"/>
    <item android:color="#228899" android:state_pressed="true"/>
</selector>
   android:src="@drawable/ic_error"
        android:clickable="true"
        app:tint="@color/error_color_selector"

3.处理SVG生成问题
首先在打包时,没有任何处理的话SVG图片会在对应的资源文件夹下面生成.PNG图片,甚至远远超过本身使用.PNG图片的大小

可以使用Gradle构建工具指定资源文件生成(但是这种方式最后的生成图片数量和直接使用PNG无任何差别,
达不到瘦身的目的):
	adnroid {
   
	defaultConfig {
   
	 generatedDensities=['xhdpi','xxhdpi']
		}
	}
 使用支持依赖
	adnroid {
   
	defaultConfig {
   
	 vectorDrawables.useSupportLibrary = true
		}
	}

使用时使用app:srcCompat

   		app:srcCompat="@drawable/ic_error"
        android:clickable="true"
        app:tint="@color/error_color_selector"

使用方法二后,打包APK将不再在对应资源文件夹生成.PNG图片,由此大大的减少了APK体积

4使用.WEBP图片
其他例如背景图,启动页之类的大图,可以使用AS自带工具,将图片制作为.WBBP格式,也能大量的减少图片体积

5.使用JPG不带透明度图片
6.图片压缩
总之一切在图片使用正常的情况下,使得图片体积变小
7.使用.9图

国际化处理

打包时,通过资源映射表可以看出,APK支持了多种语言,因此可以只选择自己需要的进行支持

	android {
   
		defaultConfig{
   
			resConfigs 'en','zh-rCN'
		}
	}


可以看到,多余的支持语言没有了(蚊子腿再小也是肉)

SO包优化

不同的SO包用于不同的CPU架构,由C/C++编写,NDK编译出来,常见的有:armeabiarmeabi-v7aarm64-v8ax86x64mipsmips64
而应用于手机的CPU架构趋于稳定,大多数时候,使用arm64-v8a即可(模拟器使用x86),其他的按项目需求自行配置,SO库能够大量的减少包体体积。

	android{
   
		defaultConfig{
   
			ndk{
   
            	abiFilters "armeabi-v7a"
        	}
		}
	}

移除无用资源

1.压缩代码
将minifyEnabled设置为true
minifyEnabled不仅会对代码进行混淆,也会通过R8树遍历,删除掉无用代码,编译时间很长,开发期间不建议打开

2.移除无用资源

因此可以通过移除无用资源来进行包体减小

1.使用工具

通过AS自带Refactor->Remove Unused Resources来进行删除无用资源,但是这种方式是通过资源索引进行排除的,如果项目中用到了通过名字进行匹配的,这样无疑是有很大风险的,如使用Assets,使用getResources方式获取的资源,尽管代码中使用了也会被检索到删除队列中。
项目中小的时候,可以通过备份项目,删除后报错再将需要的资源文件恢复就行。
2.使用工具


可以标记选中资源文件为使用中,可以避免被删除

3.使用shrinkResources
Gradle构建中使用shrinkResources,将其设为true,同时当它被设为true时,minifyEnabled也同时需要被打开
扩展:创建raw资源文件夹,创建keep.xml可以对shrinkResources进行配置,可以用于删除指定资源文件(因为shrinkResources默认使用非严苛模式)

<resources tools:discard="@layout/activity_main2"
    xmlns:tools="http://schemas.android.com/tools">
</resources>

资源混淆

建议使用微信的开源工具AndResGuard:地址


转载:https://blog.csdn.net/LZ511321/article/details/117114115
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场