分析Dalvik字节码进行减包优化

来源:互联网 发布:娜塔莉 波特曼 知乎 编辑:程序博客网 时间:2024/06/05 03:27

分析Dalvik字节码进行减包优化

    • 分析Dalvik字节码进行减包优化
      • 优化思路
      • 优化效果
      • 优化方案如下

优化思路

通过dexdump反编译apk中的dex,得到对应Dalvik字节码,找到寻找冗余的字节码,尝试去除或替换冗余的字节码

目前主要是替换或去除原有的java代码,减少对应的Dalvik指令,从而减少安装包大小。

现在主要是从Dalvik字节码分析来调整Java代码,之后希望能够通过ASM等框架直接调整字节码减少现在的包大小。

优化效果

去除初始化赋值方案 ————减少整个手q的发布包大小80k左右。

插桩函数优化———减少整个手q的发布包大小2k左右。

其它尝试方案,包括字符串拼接、移除interface很多空方法等,因为效果比较小、难以统一修改等问题,只是列举下分析结果,大家如果项目中出现的量比较多也是可以尝试去优化的。

优化方案如下:

1、去除初始化赋值冗余
1.1、问题分析:
对于初始化赋值为系统分配默认零值的静态变量和成员变量,去掉初始化赋值,直接使用系统赋的系统零值,可以减少和中的Dalvik指令,从而减少包大小,而且可以提高类加载和对象创建的效率。
1.2、优化要点
注意对于static final的变量必须赋初值;

interface的变量都是static final类型的;

注意只有赋值为系统赋予的零值的静态变量和成员变量才能按照这种方式优化,其它比如局部变量的改动会导致编译不通过等问题。

2、字符串拼接
用String.valueOf()绝对是最优方案。少用+”” 或者用StringBuffer。

3、调整interface到class,减少实现接口造成的空方法(该方案的缺点在于修改必须手动,难度大,缩减少,优化难度高收益小,弃坑。)

interface FrostInterface{public abstract void dosth1();public abstract void dosth2();}public class FrostTest1 implements FrostInterface{@overridepublic void dosth1(){//do thing}@overridepublic void dosth2(){//do thind }}

改成

public abstract class FrostTest implements FrostInterface{@overridepublic void dosth1(){//do thing}@overridepublic void dosth2(){//do thind }}public class FrostTest1 extends FrostTest {}

开心一刻:管申请驾照的人去管结婚证书后失业了,原因是他习惯性地问:“你们是为了娱乐还是为了商业用途?”

0 0
原创粉丝点击