减小apk体积
1. ProGuard
Proguard可以删除无效的java code,显著地减小apk体积,
但是要注意使用proguard之后要测试app,有时会导致一些bug。
2. ShrinkResources
在gradle中使用ShrinkResources可以去除无效的资源文件,
从而减少最终的apk大小,在build.gradle中使用shrinkResources:
release {
...
shrinkResources true
...
}
3. 使用Android Lint
Unused resource这一栏打开,即是未被使用的资源列表,用户可以参照来手动删除资源
4. 清理Assert文件夹
Assert文件夹经常会放置一些不被编译的资源,时间久了,里面可能一些文件或者资源已经不用了,
然而这个文件夹也是会被打包到apk里面的。所以定期清理这个里面的内容也是减小apk体积的重要一步。
5. 我们可以通过配置gradle来制定只打包某些so,依然是在defualtConfig中:
defaultConfig {
... ...
ndk {
//设置支持的SO库架构
abiFilters 'arm64-v8a', 'armeabi' //, 'x86', , 'x86_64', 'arm64-v8a'
}
}
6. 对第三方库进行重新定制(重新打jar包)
7. 动态加载技术(插件化)
8. 用代码代替图片,放弃一部分图片资源,对图片进行无损压缩
开发的时候有些地方能用代码做出来的就尽量不用图片来渲染,
这样子可以减少图片资源的数量从而减少体积。
- 用shape代替背景图
- 用RotateDrawable代替仅仅是方向不同的“内容相同”的图片
- 用layer-list来制作多层图片从而达到复用
- 使用属性动画而不是多图片连续播放的帧动画
- 用shape代替背景图
很多背景图比如按钮的背景、纯色背景都是可以用shape来制作的,
这样子仅用xml代码就代替了png资源。比如这么要给按钮背景图(纯色背景、带边框、圆角)
可以用shape而不是Png图片来制作
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<stroke
android:width="0.5dp" android:color="@color/white"/>
<gradient
android:startColor="#ffffff"
android:endColor="#ffffff"
android:angle="0.0" />
<corners
android:topLeftRadius="4dp"
android:topRightRadius="0dp"
android:bottomLeftRadius="4dp"
android:bottomRightRadius="0dp" />
</shape>
</item>
</selector>
用RotateDrawable代替仅仅是方向不同的“内容相同”的图片
这里两个图片是两个按钮箭头,但是仅仅方向不同而已,其实可以只用其中一个图片即可,
而另一个用RotateDrawable来让其“调转”180度
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_arrow_left"
android:fromDegrees="180"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="180" />
用layer-list来制作多层图片从而达到复用
有些需求中需要一种图片,但是明显这个图片是其他几个图片简单叠加而已,
那么可以使用layer-list来达到目的
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<!-- 最底层的图片,以x,y轴坐标为中心进行旋转-->
<rotate android:pivotX="0" android:pivotY="0"
android:fromDegrees="-10" android:toDegrees="-10">
<bitmap android:src="@drawable/chatting_bg_default_thumb"/>
</rotate>
</item>
<!-- 第二层的图片,以x,y轴坐标为中心进行旋转-->
<item>
<rotate android:pivotX="0" android:pivotY="0"
android:fromDegrees="15" android:toDegrees="15">
<bitmap android:src="@drawable/chatting_bg_purecolor_thumb"/>
</rotate>
</item>
<!-- 最上层的图片,以x,y轴坐标为中心进行旋转-->
<item>
<rotate android:pivotX="0" android:pivotY="0"
android:fromDegrees="35" android:toDegrees="55">
<bitmap android:src="@drawable/mark"/>
</rotate>
</item>
</layer-list>
使用属性动画而不是多图片连续播放的帧动画
网友评论