##apk
瘦身
> 想办法较减少apk大小
###必要性
>同样功能,apk越小越好,用户下载动机更大
###了解apk的组成
* classes.dex:是java源码编译后生成的java字节码文件
* resources.arsc:编译后的布局文件
* AndroidManifest.xml
* assets:目录可以存放一些配置文件
* lib目录下的子目录armeabi存放的是一些so文件或者jar包
* META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全
* res:apk图片资源
###了解apk生成过程
![](img/tu5.png)
###辅助分析工具
* nimbledroid:能够得知app内存使用,网络使用,磁盘输入/输出,文件大小等一些NimbleDroid认为至关重要的数据;
* 官网:https://nimbledroid.com/(无需翻墙,访问比较慢)
* 注册
* 登录
* 上传apk
* 效果图:"冒泡新闻_文件分析.png"
###瘦身步骤
0.开始大小-->19039kb
1.开启minifyEnabled(开启混淆,删除没用的java文件),混淆笔记查看 `Proguard使用注意_billy`-->18447kb
buildTypes {
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
2.开启shrinkResources(去除无用资源),同时去除工程中`临时展示的图片`-->17121kb
debug {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
}
3.删除无用的语言资源-->减少100kb左右
defaultConfig {
...
resConfigs "zh"
...
}
![](img/tu1.png)
4. 使用tinypng有损压缩 (用的比较多的)
>* TinyPNG 使用一种智能有损压缩技术(通过降低图片中的颜色数量,来减少存储图片所需要的数据)来降低 PNG 图片的大小。这样的压缩对图片的效果影响是很小的,但是可以大大降低图片的大小,并且还能保持 PNG 的 alpha 透明度
>* 因为 TinyPNG 将 PNG 图片压缩成 8 位的 PNG(而不是24位),所以它的压缩比例非常高,至少都有 50% 以上的压缩比例,有些甚至可以达到70%,并且压缩之后的图片和原图人眼基本看不出区别。
* 官方网站: http://tinypng.com/(无需翻墙,访问较慢)
* 使用方式一:拖拽,压缩,下载即可
* 使用方式二(tinypng客户端,测试失败,现在不能使用了):使用外部工具,申请授权码,使用TinyPngWrapper(http://blog.csdn.net/visualcatsharp/article/details/17137405)
* 使用方式三(ps插件,未做测试):http://www.zcool.com.cn/article/ZMTE2MTQw.html
* 效果![](img/tu2.png)
5.对于非透明的大图,jpg将会比png的大小有显著的优势,在启动页,活动页等之类的大图展示区采用jpg将是非常明智的选择-->15615kb
* 使用格式工厂进行转换
* 了解常见图片格式:http://baike.baidu.com/link?url=MGe8RiFIw8NjAnrE7-ETrr_LTm3y9fRdcjKAa2TSKLiknlGx6vopk8TyzfuFIPaTze9oM4Ljn4lPOCfgIaRC5K#16
* 效果![](img/tu3.png)
6.使用webp格式-->15541
* 了解webp格式:http://isux.tencent.com/introduction-of-webp.html(WebP 探寻之路)
* 从Android 4.0+开始原生支持,但是不支持包含透明度,直到Android 4.2.1+才支持显示含透明度的webp,使用的时候要特别注意
* 使用格式工厂进行转换
* 效果![](img/tu4.png)
* webp使用NDK兼容低版本(未做测试):http://blog.csdn.net/jiwangkailai02/article/details/17015451
7.删除或者替换兼容包(v4 v7 v13)中无用的一些图
* 删除drawable-ldrtl:是layout-direction-right-to-left的缩写,意味着布局方式从右到左,主要是为了适配阿拉伯语用。这应该是API17,即Android4.2上新出的功能
drawable-ldrtl-xxxhdpi-v4
drawable-ldrtl-xxhdpi-v4
drawable-ldrtl-xhdpi-v4
drawable-ldrtl-hdpi-v4
drawable-ldrtl-mdpi-v4
* 替换v4 v7 v13 中无用图片资源_可选方式
* 可以使用1x1像素图片,替换v4,v7,v13中的一些图片资源
8.注意删除第三方aar库中使用的大图_注意情况
9.so库的删除:建议实际工作的配置是只保留armable、x86下的so文件,算是一个折中的方案。
armeabi :针对普通的或旧的arm v5 cpu
armeabi-v7:库会对图形渲染方面有很大的改进,如果没有这方面的要求,可以精简。针对有浮点运算或高级扩展功能的arm v7 cpu.
arm64-v8a:64位ARM设备
mips
mips64
x86
x86_64
10.通过v4包中的DrawableCompat,通过着色方案完成selector效果,参考
Drawable icon = getResources().getDrawable(drawableId)
Drawable tintIcon = DrawableCompat.wrap(icon);
//1.着色一个selector
DrawableCompat.setTintList(tintIcon, getResources().getColorStateList(R.color.xx));
//2.着色一个颜色
DrawableCompat.setTintList(tintIcon, ColorStateList.valueOf(Color.BLUE));
imageView.setImageDrawable(tintIcon);
11.使用shape文件替换图片
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<corners android:radius="10dp"></corners>
<solid android:color="#e6d5d5"></solid>
</shape>
12.切图使用一套图即可,参考美团客户端,美团使用的一套drawable-xhdpi
13.把so文件放置到网上或者sdcard内,参考`https://segmentfault.com/a/1190000004062899`
14.配合vectorDrawable使用矢量图
> 想办法较减少apk大小
###必要性
>同样功能,apk越小越好,用户下载动机更大
###了解apk的组成
* classes.dex:是java源码编译后生成的java字节码文件
* resources.arsc:编译后的布局文件
* AndroidManifest.xml
* assets:目录可以存放一些配置文件
* lib目录下的子目录armeabi存放的是一些so文件或者jar包
* META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全
* res:apk图片资源
###了解apk生成过程
![](img/tu5.png)
###辅助分析工具
* nimbledroid:能够得知app内存使用,网络使用,磁盘输入/输出,文件大小等一些NimbleDroid认为至关重要的数据;
* 官网:https://nimbledroid.com/(无需翻墙,访问比较慢)
* 注册
* 登录
* 上传apk
* 效果图:"冒泡新闻_文件分析.png"
###瘦身步骤
0.开始大小-->19039kb
1.开启minifyEnabled(开启混淆,删除没用的java文件),混淆笔记查看 `Proguard使用注意_billy`-->18447kb
buildTypes {
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
2.开启shrinkResources(去除无用资源),同时去除工程中`临时展示的图片`-->17121kb
debug {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
}
3.删除无用的语言资源-->减少100kb左右
defaultConfig {
...
resConfigs "zh"
...
}
![](img/tu1.png)
4. 使用tinypng有损压缩 (用的比较多的)
>* TinyPNG 使用一种智能有损压缩技术(通过降低图片中的颜色数量,来减少存储图片所需要的数据)来降低 PNG 图片的大小。这样的压缩对图片的效果影响是很小的,但是可以大大降低图片的大小,并且还能保持 PNG 的 alpha 透明度
>* 因为 TinyPNG 将 PNG 图片压缩成 8 位的 PNG(而不是24位),所以它的压缩比例非常高,至少都有 50% 以上的压缩比例,有些甚至可以达到70%,并且压缩之后的图片和原图人眼基本看不出区别。
* 官方网站: http://tinypng.com/(无需翻墙,访问较慢)
* 使用方式一:拖拽,压缩,下载即可
* 使用方式二(tinypng客户端,测试失败,现在不能使用了):使用外部工具,申请授权码,使用TinyPngWrapper(http://blog.csdn.net/visualcatsharp/article/details/17137405)
* 使用方式三(ps插件,未做测试):http://www.zcool.com.cn/article/ZMTE2MTQw.html
* 效果![](img/tu2.png)
5.对于非透明的大图,jpg将会比png的大小有显著的优势,在启动页,活动页等之类的大图展示区采用jpg将是非常明智的选择-->15615kb
* 使用格式工厂进行转换
* 了解常见图片格式:http://baike.baidu.com/link?url=MGe8RiFIw8NjAnrE7-ETrr_LTm3y9fRdcjKAa2TSKLiknlGx6vopk8TyzfuFIPaTze9oM4Ljn4lPOCfgIaRC5K#16
* 效果![](img/tu3.png)
6.使用webp格式-->15541
* 了解webp格式:http://isux.tencent.com/introduction-of-webp.html(WebP 探寻之路)
* 从Android 4.0+开始原生支持,但是不支持包含透明度,直到Android 4.2.1+才支持显示含透明度的webp,使用的时候要特别注意
* 使用格式工厂进行转换
* 效果![](img/tu4.png)
* webp使用NDK兼容低版本(未做测试):http://blog.csdn.net/jiwangkailai02/article/details/17015451
7.删除或者替换兼容包(v4 v7 v13)中无用的一些图
* 删除drawable-ldrtl:是layout-direction-right-to-left的缩写,意味着布局方式从右到左,主要是为了适配阿拉伯语用。这应该是API17,即Android4.2上新出的功能
drawable-ldrtl-xxxhdpi-v4
drawable-ldrtl-xxhdpi-v4
drawable-ldrtl-xhdpi-v4
drawable-ldrtl-hdpi-v4
drawable-ldrtl-mdpi-v4
* 替换v4 v7 v13 中无用图片资源_可选方式
* 可以使用1x1像素图片,替换v4,v7,v13中的一些图片资源
8.注意删除第三方aar库中使用的大图_注意情况
9.so库的删除:建议实际工作的配置是只保留armable、x86下的so文件,算是一个折中的方案。
armeabi :针对普通的或旧的arm v5 cpu
armeabi-v7:库会对图形渲染方面有很大的改进,如果没有这方面的要求,可以精简。针对有浮点运算或高级扩展功能的arm v7 cpu.
arm64-v8a:64位ARM设备
mips
mips64
x86
x86_64
10.通过v4包中的DrawableCompat,通过着色方案完成selector效果,参考
Drawable icon = getResources().getDrawable(drawableId)
Drawable tintIcon = DrawableCompat.wrap(icon);
//1.着色一个selector
DrawableCompat.setTintList(tintIcon, getResources().getColorStateList(R.color.xx));
//2.着色一个颜色
DrawableCompat.setTintList(tintIcon, ColorStateList.valueOf(Color.BLUE));
imageView.setImageDrawable(tintIcon);
11.使用shape文件替换图片
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<corners android:radius="10dp"></corners>
<solid android:color="#e6d5d5"></solid>
</shape>
12.切图使用一套图即可,参考美团客户端,美团使用的一套drawable-xhdpi
13.把so文件放置到网上或者sdcard内,参考`https://segmentfault.com/a/1190000004062899`
14.配合vectorDrawable使用矢量图
15.使用微信资源混淆`https://github.com/shwenzhang/AndResGuard`,
Studio使用Analyze APK分析APK包:
在Android Studio工具栏里,打开build–>Analyze APK, 选择要分析的APK包
注意:必须先打包一个APK,在打开Analyze APK 来选中刚刚打包的APK