当前位置:首页 » 编程软件 » dex2oat编译耗电快怎么解决

dex2oat编译耗电快怎么解决

发布时间: 2022-10-23 21:17:26

A. 性能优化实践(三)-卡顿优化思考

Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,这也意味着程序的大多数操作都必须在16ms内完成。如果无法完成,则发生丢帧,上一帧画面被重复显示,造成卡顿的视觉。

从整个视图渲染流程看:

Surfaceflinger由init启动的独立进程,提供合成视图的系统服务。如果Surfaceflinger挂掉,会重启zygote。

在Surfaceflinger的init方法中,实例化了HWComposer和两个EventThread。

HWComposer :负责输出硬件产生或软件模拟的Vsync信号。

EventThread :负责分发vsync到Choreographer和SurfaceFlinger。其中mEventThread对应Choreographer;而mSFEventThread:对应SurfaceFlinger。

VSYNC信号主要的两个订阅者:SurfaceFlinger 和 Choreographer。

SurfaceFlinger :接收信号执行合成Layer流程。

Choreographer :接收信号来控制同步处理输入(Input)、动画(Animation)、绘制(Draw)三个UI操作。

Choreographer通知应用层绘制、SurfaceFlinger负责合成视图、两者之前加上了一定的offset,这样能保证两者步调一致。

在这个过程中,CPU负责把视图加工为多边形和纹理。GPU负责把多边形和纹理做栅格化处理,成为送显的像素数据。

1 视图层面的问题

包括layout层级太深View太多、View太复杂、重复绘制、ListView没优化、动画设计不合理等等。

这是遇到卡顿问题首先需要排查的,部分问题可以通过开发阶段的coding规范来避免的。

1)layout层级太深View太多:可以通过Lint来检测,优化:通过合理容器的使用,优先减少层级,其次减少View数目,能重用的尽量重用。

2)View太复杂:如果是自定义View,那还是从视图太深、View太多两个层面来考虑优化。如果是成熟的View:比如WebView、VideoView这种重量级的View,尽量复用和管理好生命周期。

3)重复绘制:通过Settings中打开GPU过度绘制 & GPU呈现模式可以了解当前视图层级关系,当然这部分与前面两点也是分不开的,最基本的要注意移除xml中非必须背景。

4)ListView优化,这部分主要是convertView的复用,能减少View的创建;ViewHolder的使用,减少View的find和赋值,加快加载速度;分页加载:控制一次加载的数据量,这样加载速度会快,内存压力也相对小。

5)动画:合理设计动画,能不用帧动画尽量不用,因为图片比较占内存,尤其是数量多的时候。另外针对属性动画,同一个view的一系列动画,可以使用Keyframe+PropertyValuesHolder组合方式达到只使用一个ObjectAnimator,多个view的动画用AnimatorSet进行动画组合和排序。

2 消息相关耗时

我们都知道,耗时操作放到子线程做,通过handle返回主线程更新UI。但是消息本身也是会耗时的,主要分两方面:1)消息本身执行耗时, 2)消息执行被delay。消息本身执行耗时那就是主线程耗时,消息执行被delay,在messageQueue中,由于之前的Message太多或者执行时间过长,导致当前需更新UI的操作得不到及时处理,尤其是16.6ms硬性标准下,一旦delay必然丢帧。

3 主线程耗时

这部分我要说的并不是在主线程做耗时操作了,而是站在CPU调度的角度来看耗时问题,也就是说,比如主线程有500ms的耗时,要么Running了多久,是否存在Sleeping和Uninterruptible sleep等状态,这段时间内CPU被抢占了压根就没腾出功夫来执行你这操作。如果有现场的话,通过抓systrace能比较明显看出来。

4 Input事件本身耗时

在Android整个Input体系中有三个重要的成员:Eventhub,InputReader,InputDispatcher。它们分别担负着各自不同的职责,Eventhub负责监听/dev/input产生Input事件,InputReader负责从Eventhub读取事件,并将读取的事件发给InputDispatcher,InputDispatcher则根据实际的需要具体分发给当前手机获得焦点实际的Window,最终交给ActivityThread通过消息来处理。

系统角度:
InputDispatcher分发事件给Window这个过程是跨进程通信,获取对应window本身可能存在耗时。

应用角度:
客户端接收事件的消息本身又可能存在耗时和delay的情况,这又回到消息耗时的范畴了。

5 持锁耗时
这属于业务逻辑层面的问题,最简单的就是主线程死锁,亦或是主线程在等锁,然后当前锁被其他线程持有在做耗时操作等等。

6 频繁GC

我们知道,执行GC操作的时候,所有线程的任何操作都会需要暂停,等待GC操作完成之后,其他操作才能够继续运行。通常来说,单个的GC并不会占用太多时间,但是大量不停的GC操作则会显着占用帧间隔时间(16ms)。如果在帧间隔时间里面做了过多的GC操作,那么自然其他类似计算,渲染等操作的可用时间就变得少了。

导致GC频繁执行有两个原因:

1)内存抖动,在memory monitor里能很明显看出来,短时间内创建大量对象然后又迅速被释放。

比如:在一个方法里for循环拼接String。会产生大量废弃的String对象,短时间内又会被回收,所以容易造成抖动,可以用StringBuilder/StringBuffer来替代,它们实现是动态数组,初始长度128,不够用了通过array来增加长度。对象统一管理,不会短时间内造成短时间内大量创建和销毁的问题,同时append与+相比更安全。

2)瞬间产生大量的对象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,也会触发GC。即使每次分配的对象占用了很少的内存,但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC。这个操作有可能会影响到帧率,并使得用户感知到性能问题。

1 内存原因

在系统内存非常低的情况下,常规经验是:MemAvailable 低于MemTotal 1/10的情况下,容易出现内存引起的卡顿,原因无非就是在内存低的情况下内核在分配内存时,很难从物理内存(伙伴系统)直接拿到合适大小的页面,此时会触发回收操作,如内存整理(compact)、回收匿名页(swap)、回收文件页(dirty=回写,clean=丢弃)等操作。这些回收操作较慢,因此耗时。这个过程主要体现在新启一个应用,zygote fork进程申请内存的时候。

2 系统服务持锁耗时

应用binder call请求系统服务,一般来说,系统服务如AMS、WMS对应的方法,一上来先不管三七二十一,就是一把大锁,很多情况下,特定的操作会造成持锁耗时的情况,具体问题具体分析。

3 CPU调度问题

这类情况不太多见,但是也是存在的。在某个绘制周期中,CPU被抢占,无法及时开始绘制操作。这分几部分来看,首先是不是被某个进程抢占的,比如dex2oat。或者看这段时间CPU使用率非常高,但是可能是大核跑满了,但是小核相对比较闲,这属于系统调度有问题等等。

例如:dex2oat发生的时候,占用所有有CPU(默认策略是有多少个核,就启动多少个线程),会将原文件中的dex文件抽出来,逐个指令的判断,然后进行翻译,并生成大量的中间内容,这些在memory当中是保存不下的,所以采用了swap机制, memory越少,越容易发生交换,所以还可能引起IO上的瓶颈。

可以设置系统属性:dalvik.vm.bg-dex2oat-threads 和 dalvik.vm.dex2oat-threads ,这两个系统属性是分别设置在前后台执行dex2oat限制的线程数,对应8核CPU来说,比如设置前后台分别为4,这样dex2oat执行时间会变长,但是卡顿会被缓解。

当然还有一种情况是,当手机温度过高,导致CPU降频,也会出现系统卡顿。

本文只是对卡顿分析提供一点不成熟的小思路。随着学习的深入,我会持续更新。
文中牵涉到的布局和重复绘制相关的内容可以参考我的文章: 布局优化
文中牵扯到的相关性能优化工具可以参考我的系列文章: 性能优化工具篇总结

B. 安卓art和dalvik的区别

Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
Android操作系统已经成熟,Google的Android团队开始将注意力转向一些底层组件,其中之一是负责应用程序运行的Dalvik运行时。Google开发者已经花了两年时间开发更快执行效率更高更省电的替代ART运行时。 ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是依靠一个Just-In-Time (JIT)编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运 行。ART则完全改变了这套做法,在应用安装时就预编译字节码到机器语言,这一机制叫Ahead-Of-Time (AOT)编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。

C. 手机耗电快应该怎么办

手机耗电快应该这么做:
一、关闭应用通知
手机应用越多,通知也会越多。我们新买回来的手机,所有的应用是默认允许通知的。
有时候手机一响,还以为是女神给你回了信息,结果一看,是某游戏软件提示你新皮肤上线了。
手机这样频繁地接收不同的通知消息,不仅会消耗电量,同时还缓存了不同的应用数据,导致手机内存越来越小,所以建议大家最好关闭一些不必要的应用通知。
二、关闭应用自启动
手机里的应用一般都是默认自启动的,不管我们有没有在使用,这些应用都会在后台运行。
对于一些不经常使用的应用,我们可以关闭它的自启动。
三、关闭广告推送
新手机使用一段时间后,会根据我们的使用习惯和爱好,进行智能推荐一些我们可能感信息的广告信息。
可以进入手机“设置”-“隐私”-“广告”,开启“限制广告跟踪”功能。这样我们就不会收到各种软件推送的广告,还能省下不少电。
四、调低屏幕亮度
实际上屏幕亮度也是我们手机最耗电的地方之一,平时使用时不需要将亮度调到最大,建议适当降低亮度,能节省电量。
五、掌握正确的充电方式
在30%~80%的电量下充电可以延长电池寿命,并且既要避免完全没电再充电,又要避免每次都将电池完全充满。
以前是电量耗尽了才去充电,这样可以增强手机电池的使用寿命,而现在大部分手机采用的是锂离子电池,锂电池怕电量低、怕电压高,也怕热。
因此,我们不宜频繁将电池耗光再去充电;
尽量避免长时间让电池处于100%的状态下,这样会导致电压居高不下;
也最好不要边充电边玩手机,因为充电时手机会发热,玩大型游戏可以让手机释放更多热量,长期这样会有损电池正常的使用寿命!
六、手机功能即用即开
另外,蓝牙、wifi、个人热点、GPS定位这些功能,建议即用即开,不用时关闭,能有效节省电量的消耗。因为开启之后会不断收发信号,信号传输是会耗费电的哦。
关于手机省电技巧的分享就到这里了,有需要的小伙伴,赶紧去试试吧~

D. OPPOr9plus电池耗电栏里出现了dex2ota是什么啊!,之前没有的

oppor9plus 本来电池就不大,而且现在的智能机都这样。
这里说一些手机的省电技巧:
1)调整屏幕亮度
2)不需要时关闭按键音、震动和触感反馈
3)不需要时关闭蓝牙、GPS、WIFI
4)关闭自动同步
5)调整音量设置
6)开启节电保护模式
7)经常清理手机后台运行的程序。

E. 安卓手机耗电快怎么解决

手机耗电量是和手机的使用频率,机器运行状态(导航、游戏、后台运行程序),网络信号强弱等,都会影响手机充电后的使用时间,若使用vivo手机要降低电量消耗,可以参考以下方式操作:

1、玩游戏、看视频和直播时,适当调低屏幕亮度和音量;

2、调整软件设置,适当降低画质及帧率,屏幕高刷新率机型,可设置为普通刷新率减少耗电;

3、清理后台不必要的程序,平常可以多使用“一键加速”功能;

4、未使用GPS定位、蓝牙等功能时,可以关闭功能减少耗电;

5、进入设置--电池,根据需求选择开启省电模式、超级省电模式或睡眠模式。


F. dex2oat 有什么用

dex2oat的用处:

众所周知,Android虚拟机可以识别的是dex文件,应用使用过程中如果每次将dex文件加载进行内存,解释性执行字节码,效率会很低,严重影响用户体验。

通过dex2oat优化后,可以在系统运行之前利用合适的时机将dex文件字节码提前转化为虚拟机可以执行运行的机器码。

后续直接从效率更高的机器码中运行,则运行阶段更加流畅,优化用户体验。

Dex2oat (dalvik excutable file to optimized art file),是一个对 dex 文件进行编译优化的程序,在我们的 Android 手机中的位置是/system/bin/dex2oat。

对应的源码路径为 android/art/dex2oat/dex2oat.cc。

通过编译优化,可以提升用户日常的使用体验(包含安装速度、启动速度、应用使用过程中的流畅度等),是 Android Art Runtime 中的一个重要的模块, 本文我们一起来了解下 dex2oat 的功能以及常用的场景。

G. 如何在刷机包里开启dex2oat模式

刷机准备工作:1、保证手机有充足的电量(70%以上);2、备份手机中的个人数据(联系人、短信、应用程序等);3、下载官方包或其它刷机包(可以到官网论坛,ROM基地下载)。方法步骤:1、首先将刷机包包拷贝到手机存储卡的根目录下。2、关机状态下,同时按住电源键与音量下键,约十秒钟时间之后,屏幕上将出现黑底黄字,这说明手机已经进入Recovery模式。3、使用音量上、下按键将光标移动到“手动选择安装包”位置,点击电源键进行确认。接下来使用音量上、下按键选择安装包,点击电源键进行确认。 4、只需等待自行完成,机过程中手机始终保持屏幕点亮状态,除了不断滚动的黄色文字之外还有蓝色的进度条显示在绿色机器人的下方。最终屏幕最下方将显示“安装完成”字样,机完成,5、根据提示选择立即重启系统,完成。

H. 手机耗电快怎么解决

手机耗电量是和手机的使用频率,机器运行状态(导航、游戏、后台运行程序),网络信号强弱等,都会影响手机充电后的使用时间,若使用vivo手机要降低电量消耗,可以参考以下方式操作:

1、玩游戏、看视频和直播时,适当调低屏幕亮度和音量;

2、调整软件设置,适当降低画质及帧率,屏幕高刷新率机型,可设置为普通刷新率减少耗电;

3、清理后台不必要的程序,平常可以多使用“一键加速”功能;

4、未使用GPS定位、蓝牙等功能时,可以关闭功能减少耗电;

5、进入设置--电池,根据需求选择开启省电模式、超级省电模式或睡眠模式。

I. 手机耗电特别快应该怎么办

您好!手机耗电严重有如下原因:

1.您开启了蓝牙或位置信息功能。若要关闭,在手机上方往下滑,在控制菜单上找到蓝牙按钮和位置信息按钮,点击关闭即可。2.屏幕亮度过高导致耗电严重。同样在手机上方往下滑,进入控制中心,将横条向左滑即可降低亮度。提示:若想更加省电,可以开启省电模式。省电模式将限制部分应用的功能,从而达到省电的效果。进入设置,找到电池,点击开启省电模式。希望这条回答对您有帮助!望采纳!

J. 手机耗电快怎么办

影响耗电的原因一般有电池容量、屏幕显示、应用运行、通信连接等原因,不同的使用状态耗电情况也不同。如果您使用的是华为手机可以按照以下方法优化电池续航能力:
1,EMUI 10.X,及以下版本:进入设置 > 电池,点击一键省电,系统会自动帮您找到可能造成耗电的一些功能,您可以手动选择优化。
EMUI 11.0&Harmony OS:进入手机管家应用,点击一键优化,根据结果优化可省电的设置。
2.点击耗电排行,查看耗电高的应用
进入设置 > 电池 > 耗电排行,查看正在运行的高耗电应用,如果暂时不需要运行,请点击应用并结束运行
3.开启智能分辨率,有助于省电
进入设置,在上方搜索屏幕分辨率,根据提示进入屏幕分辨率设置界面,开启智能或智能分辨率。
4.开启省电模式
进入设置 > 电池,开启省电模式或超级省电。
若需要更换电池,可参考以下进行说明:
1. 正常保外维修收费=维修备件价+人工费,具体费用请咨询客户服务中心。
2. 维修方式包括: 预约、到店、寄修、经销商送修、上门/驻场服务均可参与。
温馨提示:建议您提前备份好数据(QQ,微信等第三方应用需单独备份),携带购机凭证再前往客户服务中心进行电池更换。

相关链接如下:客户服务中心维修备件价格查询预约服务寄修服务

热点内容
ftp命令批量下载文件 发布:2025-07-18 11:58:45 浏览:743
nba2k17文件夹 发布:2025-07-18 11:48:53 浏览:871
朔源码是什么 发布:2025-07-18 11:44:33 浏览:774
迷你世界解压剧场 发布:2025-07-18 11:43:48 浏览:154
linux安装opencv 发布:2025-07-18 11:42:10 浏览:446
编程游戏的软件有哪些 发布:2025-07-18 11:41:34 浏览:956
c程序设计语言电子书 发布:2025-07-18 11:35:58 浏览:642
lightning耳机如何在安卓手机上用 发布:2025-07-18 11:21:47 浏览:176
妄想山海新宿怎么配置好 发布:2025-07-18 11:07:43 浏览:616
androidsaxxml解析xml 发布:2025-07-18 10:57:58 浏览:387