• android dex 优化


    目录

    dex

    Simpleperf (火焰图)



    dex

    https://source.android.com/devices/tech/dalvik/jit-compiler

    https://developer.android.com/studio/profile/baselineprofiles

    https://source.android.com/devices/tech/dalvik/configure

    https://source.android.com/devices/tech/dalvik/jit-compiler

    dex2oat 编译模式:

    run-from-apk,extract,verify,quicken,speed-profile,speed:

    run-from-apk : 从apk 里面拿到dex 直接执行,通常在app 优化被中断;或者一个app 长时间没有运行,升级后就处于这种状态,这样节省空间;debug 模式应用也是这种状态不会优化。

    extract : 就是apk 里面的dex 被解压了,执行这个dex,oat升级过程没有选择app 会是这种模式,所有的类加载都要verify,且只能解释执行。

    verity quicken:

    不仅仅是将dex释放出来,verify会对释放出来的dex进行pre verify,从而进而省去运行时的verify,而quicken则会生成对应的quicken code,运行时可以执行对应的quicken code而不是dex code(都没有生成oat code)。ota 升级,app 进行转换通常是这个模式之间。

    speed:

    系统的核心应用或者share 进程的应用 speed模式,这模式的时候系统会对限定大小的方法以及class进行oat编译,生成对应的机器码。编译十分耗时。

    speed-profile:

    进程起来的时候,会同时启动jit线程,而jit会对当前进程中的hot method进行run time编译,同时也会记录保存这些需要编译的方法和类名,这个就是profile文件。对于常用的class和string将会保存到对应的art文件中,启动加速;下面条件会确定profile 时机:

    static constexpr uint32_t kMinNewMethodsPercentChangeForCompilation = 20;
    static constexpr uint32_t kMinNewClassesPercentChangeForCompilation = 20;
    static constexpr const uint32_t kMinNewMethodsForCompilation = 100;
    static constexpr const uint32_t kMinNewClassesForCompilation = 50;

    运行时 /data/misc/profiles/cur/0/pkg/primary.prof, 编译时使用的是/data/misc/profiles/ref/pkg/primary.prof

    profman --dump-classes-and-methods --apk=xx.apk --profile-file=primary.prof

    优化的类型:

    static constexpr char kMethodFlagStringHot = 'H';
    static constexpr char kMethodFlagStringStartup = 'S';
    static constexpr char kMethodFlagStringPostStartup = 'P';

    拷贝一个app对应的odex vdex art文件到一个目录

    oatdump --list-classes --oat-file=XXX.odex 

    可以看到该odex中每个class的状态。从该文件的OatDexFile的dump段开始显示class的状态,可以直接搜OatDexFile调到对应的段。状态AllCompiled,SomeCompiled,NoneCompiled

    odex根据profole 生成,当应用执行,先看类/方法是否依次在odex/vdex,从它们开始,如果都不在就从dex 开始。 

    内置应用:
    reason = prebuilt status = speed-profile

    prebuilt出来的模式。
    第一种,配置自己的mk文件配置对应的模式,mk文件中加入如下修改
    LOCAL_DEX_PREOPT_FLAGS += --compiler-filter=speed
    第二种方法,在PRODUCT_DEXPREOPT_SPEED_APPS添加对应的apk model名字
    修改完成后,刷机后可以通过adb shell dumpsys package 包名查看其中的dex status 与reason确认是否配置成功,其中reason是prebuilt。

    安装应用:

    非谷歌商店,非应用商店安装

    通常是reason = install status = speed-profile

    谷歌商店

    安装部分应用(谷歌商店内部有名单)安装后 reason=install-dm。谷歌商店下发了profile文件,在安装过使用了profile,nstalld-dm一般是安装完成后就有比较好的性能,相了二次编译,但也是因为这样,install-dm的安装时间比较长。

    reason = install-dm  status = speed-profile
    

    其它商店

    安装部分应用,安装后 reason=install,但是这类应用会在灭屏待机或空闲的时候进行二次转换,以此达到性能优化的状态。

    reason = install  status = speed-profile

    限制dex2oat 占用资源和发热,将其限制在小核上,限制温度太高不进行二次优化。

    安装完应用后,对某一些应用在启动的时候会进行二次编译,以此达到性能优化的效果或插件加载的时候触发编译的。原理是通过采集启动过程的热点方法和函数,进行oat编译,下次启动后就可以复用编译好的oat code,而不是执行dex code。

    灭屏待机云端编译

    灭屏充电idle 情况进行二次优化编译

    充电电流档位二次编译

    后台编译

    Simpleperf (火焰图)

    通过Simpleperf分析运行时方法来源

    • Systrace 通常用来是性能问题首选,可查看整机和对应App的状态,这里抓取 Perfetto trace
    • Simpleperf 则可用来查看 App 或指定process 的 Java&Native 层的call stack / 指令统计

    编译simplerperf push 到手机:

    simpleperf record -o /data/local/tmp/perf.data -f 10000 -g -e instructions --app 包名

    system\extras\simpleperf\scripts\report_html.py -i perf.data

    可以查看方法来源odex 还是jit   

  • 相关阅读:
    【Linux】线程池
    【网络协议】聊聊ifconfig
    【kali-漏洞利用】(3.2)Metasploit基础(中):Armitage工具利用过程
    拨开发展迷雾,将“智慧”嵌入全业务场景【2022戴尔科技峰会预告】
    基于JAVA+SpringBoot+Mybatis+MYSQL的销售团队管理系统
    我又造了个轮子:GrpcGateway
    @ConditionalOnProperty 注解的四个属性解释
    seata
    如何预防最新的Mallox变种malloxx勒索病毒感染您的计算机?
    grep扩展正则使用
  • 原文地址:https://blog.csdn.net/lei7143/article/details/125897835