dex2oat过程对系统性能的影响

系统卡顿疑云:dex2oat优化与CPU调度的秘密
本文探讨了系统休眠唤醒后卡顿现象与dex2oat优化过程的关系,指出虽然dex2oat占用资源,但因其低优先级并非主要原因。真正原因可能是CPU降频策略。作者还分享了编译选项配置和优化策略。

问题

最近开发中遇到个问题,系统在休眠唤醒后的一段时间,经常会出现系统卡顿不流畅的情况。正好赶上前段时间对设备做过OTA升级,自然会想到是否是OTA升级给系统引入了新的问题。

看了一些设备在系统卡顿时间的log,多个设备此时后台都在执行dex2oat的过程。只是巧合吗?dex2oat会不会影响系统性能使系统变得卡顿?带着这个问题简单了解一下dex2oat。

 

dex2oat简介

android应用使用java语言写的,java跑在java虚拟机上。java虚拟机的作用是屏蔽底层系统与芯片的差异,使得上层只专注于app的开发,不用关注底层的差异,适配转换的工作都交给java虚拟机帮你做了。

android早期使用dalvik虚拟机,目前采用ART虚拟机。dex2oat工具是对dex文件进行转化,转化成虚拟机执行效率更高的格式。针对Dalvik虚拟机转化为odex文件,针对ART虚拟机转化为ELF文件。下图为

java语言在android的运行流程:

 

dex2oat在优化时,会根据需要优化一定量的method。也就是说并不是优化的method都会被翻译成oat模式。根据优化的method的量的多少,可以分为如下的几种模式:

Android 运行时 (ART) 包含一个具备代码分析功能的即时 (JIT) 编译器,该编译器可以在 Android 应用运行时持续提高其性能。N版本当中强化了JIT模式。JIT模式是Just in time 的简称。意思是在运行的时候,根据method有使用频率来决定是否要对某一个方法进行优化。虚拟机会统计每一个方法被执行的次数。如果某一个方法执行的次数比较多,达到一定的阈值,就会将升级为hot method,并将其记录在一个profile当中。在系统空闲并且在充电的时候,只将这些方法进行优化。在运行的时候,也会对这些方法进行优化,以方便在运行的时候使用。

备注: 以上内容主要来自 https://blog.youkuaiyun.com/long375577908/article/details/78190422

 

dex2oat命令行

开启 JIT 详细日志记录

adb root adb shell stop adb shell setprop dalvik.vm.extra-opts -verbose:jit adb shell start

停用 JIT

adb root adb shell stop adb shell setprop dalvik.vm.usejit false adb shell start

    基于配置文件强制编译特定软件包

adb shell cmd package compile -m speed-profile -f my-package

    全面强制编译特定软件包

adb shell cmd package compile -m speed -f my-package

基于配置文件强制编译所有软件包

adb shell cmd package compile -m speed-profile -f -a

全面强制编译所有软件包

adb shell cmd package compile -m speed -f -a

备注:以上内容主要来自 https://blog.youkuaiyun.com/zhangbijun1230/article/details/80590208

 

dex2oat占用资源测试

手动发命令触发dex2oat,通过top命令发现dex2oat进程占用将近300%的cpu(cpu一共4个核,总资源400%)

从log中也能看到,dex2oat开启了4个线程,在4个核上都在跑

看到这里感觉得找到了真凶,dex2oat占用cpu资源太多,导致cpu资源紧张,系统卡顿。

但是还有一个重要的信息被遗漏了,从top命令的截图中看到,dex2oat进程的nice值为10,优先级很低。cpu空闲的时候,优先级高低影响不大,都能分到足够的cpu资源。一旦cpu紧张的时候,优先级低的进程cpu使用时间就会被大量抢占,把cpu让给优先级更高的进程。android上用户能感知的进程的优先级都比较高,nice值远低于10(nice值越大优先级越低),所以一个nice值为10的进程,cpu抢占能力很低,不是造成系统卡顿的主因。实测结果也是这样的,在系统繁忙的时候dex2oat进程cpu占用就被抢占很严重,降到10%以下了。

另外补充一些信息:

1. dex2oat会判断cpu的核数,几个核就创建几个线程,并发执行,这就是为什么系统空闲时cpu占用如此高的原因。

2. OTA升级系统重启后,dex2oat不是一下全部执行完,有一些策略,分批执行,比如cpu闲时执行等。

 

结论

dex2oat进程优先级低,不是造成系统卡顿的主因。

最终经过分析导致系统卡顿的真因是cpu被降频了,高通平台有个限制温度低于5摄氏度cpu被降频,高于10摄氏度解除降频。猜测可能是为了考虑低温保护电池所做的措施。

 

编译选项配置

通过在模块的makefile文件设定 LOCAL_DEX_PREOPT 选项为ture or false,来指定应用启用或停用预先优化功能。

启用预先优化功能,即在模块编译的时候就进行dex2oat的优化,生成apk的同时生成优化后的oat文件。增加了systemimage的大小,但节省了在系统在运行时进行dex2oat的资源开销,以空间换时间。

<think> 嗯,用户问的是手机CPU温度达到多少度时会限频。这个问题挺实用的,毕竟手机过热会卡顿,用户可能遇到过这种情况想了解原因。 从引用内容看,站内资料提到了Android获取CPU温度的方法和高通/联发科平台差异,但没具体说限频阈值。我记得移动芯片的热管理策略是分级的:50-60度是初始降频区间,超过70度会强制降频,极端情况可能关机。不同厂商策略会有差异,比如游戏手机阈值更高些。 用户可能是普通手机用户,遇到游戏或充电时手机发烫变卡的问题。ta没提具体机型,说明需要通用性解答。可以补充说明散热条件和环境温度的影响,毕竟夏天户外更容易触发限频。 需要强调这是动态过程:不是达到某温度就立刻锁频,而是芯片根据升温速率智能调节的。引用中Linux监控CPU温度的方法倒提醒了我,其实用户可以装AccuBattery这类APP自己观察温度频率关系。 最后生成的问题要覆盖用户可能的延伸需求:如何查看实时温度、高温处理技巧、硬件差异等。不过“限频机制原理”可能太硬核了,普通用户更关心怎么解决卡顿吧。 </think>手机CPU的限频温度阈值因**芯片平台、厂商策略和机型设计**而异,但根据常见移动芯片(如高通骁龙、联发科天玑)的温控机制,一般遵循以下规律: --- ### **核心温度与限频策略** 1. **轻中度负载阶段(50℃~60℃)** - 后台开始限制非核心进程的性能,防止温度快速上升。 - 示例:后台应用刷新频率降低,小核频率轻微下降。 2. **高温降频阶段(60℃~75℃)** - **60℃~65℃**:系统逐步降低大核/超大核频率,小核可能维持正常频率[^1]。 - **70℃~75℃**:触发**强制降频**,所有核心频率大幅降低(例如:旗舰芯片从3.2GHz降至2.0GHz以下)。此时用户会明显感到卡顿。 3. **临界保护阶段(≥80℃)** - 芯片触发**过热保护**:可能强制关闭部分核心、降低屏幕亮度,甚至自动关机[^2]。 --- ### **关键影响因素** | 因素 | 说明 | |---------------------|----------------------------------------------------------------------| | **芯片平台差异** | 高通骁龙:通常限频起点为60℃-65℃,联发科天玑策略类似但细节不同[^1]。 | | **散热设计** | 散热差的机型(如轻薄手机)会更早触发限频。 | | **环境温度** | 夏季户外使用可能提前5℃-10℃触发降频。 | | **系统调度策略** | 厂商调校不同(如游戏手机阈值更高,普通手机更保守)。 | --- ### **如何监控实时温度?** - **安卓用户**: 使用工具如`CPU Monitor`、`AIDA64`查看核心温度(需开启传感器权限)。 ```bash adb shell cat /sys/class/thermal/thermal_zone*/temp # 通过ADB读取温度传感器 ``` - **iOS用户**: 系统限制严格,需越狱后使用`iStat Menus`等工具。 --- ### **高温应对建议** 1. **避免边充电边玩游戏**:充电+运行重负载会使温度飙升10℃以上。 2. **关闭后台应用**:减少多任务负载,尤其是视频、导航类应用。 3. **使用散热背夹**:物理降温可延缓限频(实测降低表面温度5℃-8℃)。 > ⚠️ **注意**:长期超过75℃运行可能加速电池老化,甚至损坏芯片[^2]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值