Android 系統省電軟件分析

1、硬件耗電

在這里插入圖片描述
主要有:
1、屏幕
2、CPU
3、WLAN
4、感應器
5、GPS(目前我們沒有)
電量其實是目前手持設備最寶貴的資源之一,大多數設備都需要不斷的充電來維持繼續使用。不幸的是,對于開發者來說,電量優化是他們最后才會考慮的的事情。但是可以確定的是,千萬不能讓你的應用成為消耗電量的大戶

2、參考

在這里插入圖片描述

2.1

在這里插入圖片描述

2.2

Purdue University研究了最受歡迎的一些應用的電量消耗,平均只有30%左右的電量是被程序最核心的方法例如繪制圖片,擺放布局等等所使用掉的,剩下的70%左右的電量是被上報數據,檢查位置信息,定時檢索后臺廣告信息所使用掉的。如何平衡這兩者的電量消耗,就顯得非常重要了。
在這里插入圖片描述

2.3

在這里插入圖片描述

2.4

在這里插入圖片描述

3、WIFI耗電

在這里插入圖片描述
在這里插入圖片描述
前段時間做的省電主要是針對wifi的,三種情況下效果很明顯:
1、桌面待機
2、任何應用Home鍵待機
3、用瀏覽器或者愛奇藝看視頻待機,這種效果相當的明顯,完全秒殺
小米平板;同時待機86個小時小米平板(6700毫安):沒電自動關機
K1平板(4060毫安) :還剩68%
這樣處理過后,平板待機時間至少是10天

4、后臺應用

在這里插入圖片描述在這里插入圖片描述

目前我們做的做法是后臺只保留一個后臺程序。后期我們會考慮待機一定時間后,我們會把后臺程序清理掉,這樣會更省電。

5、APP提高續航

在這里插入圖片描述
總體原則:提高性能
1、不作沒有必要的工作
2、盡量避免內存分配
通常來講,盡量避免創建短時臨時對象.少的對象創建意味著低頻的垃圾回收。而這對于用戶體驗產生直接的影響。
例:避免內部的Getters/Setters
在源生語言像C++中,通常做法是用Getters(i=getCount())代替直接字段訪問(
i=mCount)。這是C++中一個好的習慣,因為編譯器會內聯這些訪問,并且如果需要約束或者調試這些域的訪問,你可以在任何時間添加代碼。
而在Android中,這不是一個好的做法。虛方法調用的代價比直接字段訪問高昂許多。通常根據面向對象語言的實踐,在公共接口中使用Getters和Setters是有道理的,但在一個字段經常被訪問的類中宜采用直接訪問。
無JIT時,直接字段訪問大約比調用getter訪問快3倍。有JIT時(直接訪問字段開銷等同于局部變量訪問),要快7倍。在Froyo版本中確實如此,但以后版本可能會在JIT中改進Getter方法的內聯。

6、布局

在這里插入圖片描述
總體原則:控件盡量少、盡量減少布局層次
1、Textview +Imageview → Textview+icon(android:drawableXXX)
2、多個LinearLayout→單個RelativeLayout
3、使用 標簽來減少視圖層級結構
4、通過 標簽來重用layout代碼
5、Layout_weight使用時,android:layout_width或者android:layout_height值盡量為0,而不是自適應,為什么?

View渲染流程
在這里插入圖片描述

7、WakeLock

在這里插入圖片描述
盡量減少喚醒屏幕的次數與持續的時間(屏幕是用電大戶),用WakeLock來處理喚醒的問題,能夠正確執行喚醒操作并根據設定及時關閉操作進入睡眠狀態,使用wakelock.acquice() 方法,一定要加上超時處理(例如釋放鎖)。
使用場景:Android中通過各種Lock鎖對電源進?行控制,比如保持通信和后臺續連。
另一種思路:
不用冒著忘記釋放Wakelock的風險,交給系統處理,也不用在manifest中設置權限,只在布局文件XML聲明即可,當然也可以用函數:View.setKeepScreenOn()方法控制即可。
在這里插入圖片描述

8、優化網絡

在這里插入圖片描述
1、設置網絡超時時間包括連接超時和請求超時
2、觸發網絡請求的操作,每次都會保持無線信號持續一段時間,我們可以把零散的網絡請求打包進行一次操作,避免過多的無線信號引起的電量消耗(例如APP的數據采集)。比如我們的大數據和推送等應用。
3、如果沒有網絡連接,你的應用跳過網絡操作;只在有網絡連接并且無漫游的情況下更新數據;
4、選擇兼容的數據格式,把含有文本數據和二進制數據的請求全部轉化成二進制數據格式請求;
5、使用高效的轉換工具,多考慮使用流式轉換工具,少用樹形的轉換工具;
在這里插入圖片描述
很明顯,使用流的方式解析效率要高一些,因為DOM解析是在對整個文檔讀取完后,再根據節點層次等再組織起來。而流的方式是邊讀取數據邊解析,數據讀取完后,解析也就完畢了。
在數據格式方面,JSON和Protobuf效率明顯比XML好很多,XML和JSON大家都很熟悉,Protobuf是Google提出的,一種語言無關、平臺無關、擴展性好的用于通信協議、數據存儲的結構化數據串行化方法。
從上面的圖中我們可以得出結論就是盡量使用SAX等邊讀取邊解析的方式來解析數據,針對移動設備,最好能使用JSON之類的輕量級數據格式為佳。
6、如果可以的話,請使用framework的GZIP庫來壓縮文本數據以高效使用CPU資源。
在這里插入圖片描述

9、調整定時更新的頻率

在這里插入圖片描述

int alarmType = AlarmManager.ELAPSED_REALTIME;
long interval = AlarmManager.INTERVAL_HOUR;
long start = System.currentTimeMillis() + interval;
alarmManager.setInexactRepeating(alarmType, start, interval, pi)

如果可以,請設置提醒的類型為ELAPSED_REALTIME or RTC而不是_WAKEUP;這樣在系統睡眠的時候不會喚醒CPU。

10、數據庫使用事務

在這里插入圖片描述
1、首先Android數據庫操作(特別是寫操作)是非常慢的,將所有操作打包成一個事務能大大提高處理速度。
2、在setTransactionSuccessful和endTransaction之間不進行任何數據庫操作。
在這里插入圖片描述

11、Adapter標準

在這里插入圖片描述
在這里插入圖片描述

12、廣播接收

在這里插入圖片描述
1、盡量能不用靜態注冊就不要靜態注冊
2、盡量在onResume()和onPause()中進行注冊與注銷
3、廣播用完后一定要記得注銷

13、回收對象

在這里插入圖片描述
JVM的回收機制給開發人員帶來很大的好處,不用時刻處理對象的分配與回收,可以更加專注于更加高級的代碼實現。相比起Java,C與C++等語言具備更高的執行效率,他們需要開發人員自己關注對象的分配與回收。

雖然Java有自動回收的機制,這不意味著Java中不存在內存泄漏的問題,在一個龐大的系統當中,還是免不了經常發生部分對象忘記回收的情況,而內存泄漏會很容易導致嚴重的性能問題。

內存泄漏指的是那些程序不再使用的對象無法被GC識別,這樣就導致這個對象一直留在內存當中,占用了寶貴的內存空間。顯然,這還使得每級Generation的內存區域可用空間變小,GC就會更容易被觸發,從而引起性能問題。

尋找內存泄漏并修復這個漏洞是件很棘手的事情,你需要對執行的代碼很熟悉,清楚的知道在特定環境下是如何運行的,然后仔細排查。

原始JVM中的GC機制在Android中得到了很大程度上的優化。Android里面是一個三級Generation的內存模型,最近分配的對象會存放在Young Generation區域,當這個對象在這個區域停留的時間達到一定程度,它會被移動到Old Generation,最后到Permanent Generation區域。
在這里插入圖片描述

大多數用戶感知到的卡頓等性能問題的最主要根源都是因為渲染性能。從設計師的角度,他們希望App能夠有更多的動畫,圖片等時尚元素來實現流暢的用戶體驗。但是Android系統很有可能無法及時完成那些復雜的界面渲染操作。Android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染,如果每次渲染都成功,這樣就能夠達到流暢的畫面所需要的60fps,為了能夠實現60fps,這意味著程序的大多數操作都必須在16ms內完成。

我們通常都會提到60fps與16ms,可是知道為何會是以程序是否達到60fps來作為App性能的衡量標準嗎?這是因為人眼與大腦之間的協作無法感知超過60fps的畫面更新。

12fps大概類似手動快速翻動書籍的幀率,這明顯是可以感知到不夠順滑的。24fps使得人眼感知的是連續線性的運動,這其實是歸功于運動模糊的效果。24fps是電影膠圈通常使用的幀率,因為這個幀率已經足夠支撐大部分電影畫面需要表達的內容,同時能夠最大的減少費用支出。但是低于30fps是無法順暢表現絢麗的畫面內容的,此時就需要用到60fps來達到想要的效果,當然超過60fps是沒有必要的。
16=1000/60

通常來說,單個的GC并不會占用太多時間,但是大量不停的GC操作則會顯著占用幀間隔時間(16ms)。如果在幀間隔時間里面做了過多的GC操作,那么自然其他類似計算,渲染等操作的可用時間就變得少了。

Android對GC做了大量的優化操作,雖然執行GC操作的時候會暫停其他任務,可是大多數情況下,GC操作還是相對很安靜并且高效的。但是如果我們對內存的使用不恰當,導致GC頻繁執行,這樣就會引起不小的性能問題

有些對象的回收不能依賴系統GC,比如:XmlPullParserFactory and BitmapFactory …

14、onDraw方法

在這里插入圖片描述
自定義View中的onDraw方法也需要引起注意,每次屏幕發生繪制以及動畫執行過程中,onDraw方法都會被調用到,避免在onDraw方法里面執行復雜的操作,避免創建對象。對于那些無法避免需要創建對象的情況,我們可以考慮對象池模型,通過對象池來解決頻繁創建與銷毀的問題,但是這里需要注意結束使用之后,需要手動釋放對象池中的對象。

但是不幸的是,對于那些過于復雜的自定義的View(重寫了onDraw方法),Android系統無法檢測具體在onDraw里面會執行什么操作,系統無法監控并自動優化,也就無法避免Overdraw了。但是我們可以通過canvas.clipRect()來幫助系統識別那些可見的區域。這個方法可以指定一塊矩形區域,只有在這個區域內才會被繪制,其他的區域會被忽視。這個API可以很好的幫助那些有多組重疊組件的自定義View來控制顯示的區域。同時clipRect方法還可以幫助節約CPU與GPU資源,在clipRect區域之外的繪制指令都不會被執行,那些部分內容在矩形區域內的組件,仍然會得到繪制。
在這里插入圖片描述

15、工具

在這里插入圖片描述

15.1、hierarchyviewer

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

15.2、Lint(官方代碼優化利器)

Android Lint是SDK Tools 16 (ADT 16)之后才引入的工具,通過它對Android工程源代碼進行掃描和檢查,可發現潛在的問題,以便程序員及早修正這個問題。Android Lint提供了命令行方式執行,還可與IDE(如Eclipse)集成,并提供了html形式的輸出報告。
官網:http://tools.android.com/tips/lint
在這里插入圖片描述

16、其他

在這里插入圖片描述

1、動畫
2、傳感器
3、清理緩存和垃圾文件
.
.
.

覺得本文對您有用,麻煩點贊、關注、收藏,您的肯定是我創作的無限動力,謝謝!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11361.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

排序實現題目:排序數組

文章目錄 題目標題和出處難度題目描述要求示例數據范圍 前言冒泡排序原理示例代碼復雜度分析穩定性分析 選擇排序原理示例代碼復雜度分析穩定性分析 插入排序原理示例代碼復雜度分析穩定性分析 希爾排序原理示例代碼復雜度分析穩定性分析 歸并排序原理示例代碼復雜度分析穩定性…

Jackson如何禁止在反序列化字符串為對應java bean時,字符串中的null被反序列成為NullNode

直接說應用場景,json文件中有一個如下配置: [{"name":"John Doe","age":28,"jsonNode":null},{"name":"John1","age":31}] 待反序列化類定義如下所示: @Data static class TestClass {/*** 名字.*…

【C++】詳解STL的適配器容器之一:優先級隊列 priority_queue

目錄 堆算法 概述 向下調整建堆 向上調整建堆 建堆算法 仿函數 概述 使用介紹 emtpy size top push pop 模擬實現 仿函數 框架 向下調整算法 向上調整算法 pop push empty top 要理解優先級隊列,需要有如下知識 STL容器之一的vector&#xf…

聚類分析 | 基于GA遺傳算法優化kmeans聚類(Matlab)

聚類分析 | 基于GA遺傳算法優化kmeans聚類(Matlab) 目錄 聚類分析 | 基于GA遺傳算法優化kmeans聚類(Matlab)效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 GA-kmeans聚類算法,通過GA遺傳算法優化kmeans聚類&…

序列化的不同格式:JSON、XML、TOML、CSON、YAML

前言 這篇文章參考于知乎,進行了一些總結。 正文 首先什么是序列化,數據序列化是從一個系統獲取一些信息,將其轉換為其它系統可以讀取的格式,然后將其傳遞給其它系統的過程。也就是可以讓不同系統“通信”。 序列化需要滿足兩…

JetPack Compose Navigation

1. 導入依賴 implementation("androidx.navigation:navigation-compose:2.7.7") 2.kotlin編譯版本升級 composeOptions {kotlinCompilerExtensionVersion "1.5.0"} 3.插件版本升級 // Top-level build file where you can add configuration options c…

學習筆記:IEEE 1003.13-2003【POSIX PSE51接口列表】

一、POSIX PSE51接口列表 根據IEEE 1003.13-2003,整理了POSIX PSE51接口API(一共286個),每個API支持鏈接查看。 IEEE POSIX接口online搜索鏈接: The Open Group Base Specifications Issue 7, 2018 edition 詳細內…

【python】模塊與包

Python中的模塊和包是組織和管理代碼的重要工具。通過模塊和包,你可以更好地管理和重用你的代碼,使得代碼更加模塊化和可維護。 目錄 前言 正文 一、模塊 1、模塊的分類 1)內置模塊 python解釋器中默認擁有的模塊可以直接使用(…

用戶需求甄別和篩選的6大標準

產品經理日常經常接收到大量的需求,并不是所有的需求都需要開發,需要進行甄別和篩選,這樣有利于確保項目的成功、優化資源利用以及提高產品質量。 那么針對這些用戶需求進行甄別或篩選的評判標準是什么?需求篩選可以說是初步的需求…

代碼隨想錄-算法訓練營day31【貪心算法01:理論基礎、分發餅干、擺動序列、最大子序和】

代碼隨想錄-035期-算法訓練營【博客筆記匯總表】-CSDN博客 第八章 貪心算法 part01● 理論基礎 ● 455.分發餅干 ● 376. 擺動序列 ● 53. 最大子序和 貪心算法其實就是沒有什么規律可言,所以大家了解貪心算法 就了解它沒有規律的本質就夠了。 不用花心思去研究其…

C++牛客周賽題目分享(2)小紅叕戰小紫,小紅的數組移動,小紅的素數合并,小紅的子序列求和

目錄 ?編輯 1.前言 2.四道題目 1.小紅叕戰小紫 1.題目描述 2.輸入描述 3.輸出描述 4.示例 5.題解與思路 2.小紅的數組移動 1.題目描述 2.輸入描述 3.輸出描述 4.示例 5.題解與思路 3.小紅的素數合并 1.題目描述 2.輸入描述 3.輸出描述 4.示例 5.題解與思…

增強For循環執行順序探究

增強For循環執行順序探究 增強For循環基礎執行順序探討對于數組對于集合 經典示例數組示例集合示例(ArrayList) 注意事項結論 在Java編程中,增強型for循環(也稱為“foreach”循環)是一種簡潔而強大的迭代集合或數組元素…

super

super 一、理解 super.屬性:在子類中,調用父類非私有化的成員屬性 super.方法:在子類中,調用父類非私有化的成員方法 super():在子類構造方法中調用父類非私有的構造方法 二、案例 需求:編寫中國人和日本人…

云原生新手和開源教育分論壇 01-Kubernetes 社區:從新手到影響者

2024年04月20日 上海KCD & Shanghai:https://community.cncf.io/events/details/cncf-kcd-shanghai-presents-kcd-shanghai-2024/視頻觀看:https://www.bilibili.com/video/BV1nD421T786/?spm_id_from333.999.0.0&vd_sourceae7b192be069682aabc…

【FreeRTOS 快速入門】-- 1、STM32工程移植FreeRTOS

目錄 一、新建STM32工程 為了示范完整的移植過程,我們從0開始,新建一個標準的STM32點燈工程。 (本篇以CubeMX作示范,CubeIDE操作近同,可作對比參考) 1、新建工程 選擇 芯片型號 新建工程 2、搜索芯片型號…

24年做抖音小店,你還停留在數據?別人都已經開始注重利潤了

大家好,我是電商笨笨熊 一件事情持續做,一個項目持續深耕,意義到底是什么? 這句話我常常說,但很多人似乎走偏了實際意義; 尤其對于新手來說,做抖音小店總是向往某某老玩家多么牛的數據&#…

程序員健康指南:運動,讓代碼更流暢

程序員健康指南:運動,讓代碼更流暢 程序員,一個與電腦相伴的群體,長時間的久坐和高強度的腦力勞動是他們的日常。然而,久坐不僅影響體態,更對心臟健康構成威脅。根據《歐洲心臟雜志》的研究,中…

第十三節 huggingface的trainner解讀與Demo

文章目錄 前言一、trainer和TrainingArguments訓練與預測完整Demo1、數據構建2、TrainingArguments構建3、Trainer初始化4、模型訓練5、模型推理6、完整demo代碼7、完整運行結果二、輔助函數1、yield返回內容2、迭代器中斷恢復迭代demo3、yield from結構4、torch.Generator()的…

【PPT技巧】ppt文件打開就是只讀模式,如何改為可編輯模式?

PPT文檔打開是只讀模式,如何改成可編輯文檔呢?這需要分幾種情況來說,所以今天將介紹幾種方法幫助PPT只讀文檔改為可編輯文檔。 方法一: 我們可以先查看一下文件屬性,屬性中有只讀屬性,當我們打開文檔之后帶…

C++入門——引用(2)

前言 上一節我們開始學習了C,并且對C有了初步的了解,這一節我們繼續學習C的基礎,那么廢話不多說,我們正式進入今天的學習 C中的引用 1.1引用的概念 引用不是新定義一個變量,而是給已存在變量取了一個別名&#xff0…