當前位置:首頁 » 編程軟體 » 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,微信等第三方應用需單獨備份),攜帶購機憑證再前往客戶服務中心進行電池更換。

相關鏈接如下:客戶服務中心維修備件價格查詢預約服務寄修服務

熱點內容
緩存視頻合並工具最新版 發布:2025-05-16 09:35:03 瀏覽:193
花雨庭伺服器ip地址和埠 發布:2025-05-16 09:34:58 瀏覽:238
同時修改多台伺服器管理地址工具 發布:2025-05-16 09:20:36 瀏覽:421
什麼配置就能玩地平線 發布:2025-05-16 09:13:46 瀏覽:82
python旋轉圖片 發布:2025-05-16 09:13:40 瀏覽:638
少女前線防檢測腳本 發布:2025-05-16 08:59:07 瀏覽:728
編譯器對系統的依賴 發布:2025-05-16 08:37:29 瀏覽:711
javamap數組 發布:2025-05-16 08:37:28 瀏覽:451
移動光貓如何自行修改密碼 發布:2025-05-16 08:20:15 瀏覽:125
作為基線存儲 發布:2025-05-16 08:15:22 瀏覽:859