AndroidAPK瘦身

来源:互联网 发布:管家婆软件操作步骤 编辑:程序博客网 时间:2024/05/17 00:49
##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
库的删除:建议实际工作的配置是只保留armablex86下的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



原创粉丝点击