Android 性能優化之啟動優化

文章目錄

  • Android 性能優化之啟動優化
    • 啟動狀態
      • 冷啟動
      • 溫啟動
      • 熱啟動
    • 耗時檢測
      • 檢測手段
      • TraceView
        • 使用方式
        • 缺點
      • Systrace
        • 環境配置
        • 使用方式
        • TraceView和Systrace比較
      • AOP統計耗時
        • 環境配置
        • 使用
    • 優化
      • 白屏優化
      • 異步加載優化
        • 環境配置
        • 使用
      • 延遲加載優化
      • AppStartup
    • 源碼下載

Android 性能優化之啟動優化

啟動狀態

在這里插入圖片描述

冷啟動

冷啟動是應用程序啟動的默認方式。當用戶首次啟動應用程序時,或者系統徹底殺死了應用程序進程后再次啟動應用程序時,會經歷冷啟動。在冷啟動過程中,系統需要創建一個新的進程,并初始化所有必要的資源。這包括加載應用程序的代碼、數據,以及初始化應用程序的環境。冷啟動的時間相對較長,因為系統需要執行一系列初始化操作。用戶能感受到明顯的等待時間,這段時間從點擊應用圖標到看到應用程序主界面出現。

在冷啟動開始時,系統有以下三項任務:

  1. 加載并啟動應用。
  2. 在啟動后立即顯示應用的空白啟動窗口。
  3. 創建應用進程。

系統一創建應用進程,應用進程就負責后續階段:

  1. 創建應用對象。
  2. 啟動主線程。
  3. 創建主 activity。
  4. 膨脹視圖。
  5. 創建屏幕布局。
  6. 執行初步繪制。

在這里插入圖片描述

溫啟動

溫啟動是指應用程序已經在后臺運行,但由于系統資源緊張等原因被系統終止。當用戶再次啟動應用程序時,系統會重新加載應用程序。與冷啟動相比,溫啟動不需要重新創建進程,因此啟動時間較短。

熱啟動

熱啟動是指應用程序處于前臺運行狀態,用戶通過返回鍵或應用程序內部的邏輯退到后臺,然后又重新顯示到前臺。在這種情況下,應用程序的進程仍然在運行,所以不需要進行任何初始化操作。熱啟動是最快的啟動方式,因為系統只需要恢復應用程序的前臺狀態。

耗時檢測

檢測手段

  • TraceView
  • Systrace
  • AOP統計耗時

TraceView

TraceView 是 Android SDK 中提供的性能分析工具,它可以幫助開發者分析應用程序的方法調用和線程活動。TraceView 專注于應用程序的內部行為,提供了方法執行時間、調用次數、CPU 使用率等詳細信息。它通常用于分析應用程序的特定部分或特定場景。

使用方式
public class BaseApp extends Application {  @Overridepublic void onCreate() {super.onCreate();// TraceView開始Debug.startMethodTracing("myTrace001");initRefresh();initTitleBar();initToast();initActivites();// TraceView結束Debug.stopMethodTracing();}
}

運行程序后生成文件:/sdcard/Android/data/com.example.android_performance_optimization/files/myTrace001.trace

在這里插入圖片描述

將 trace 文件到處,用 AndroidStudio的 Profiler 工具打開,可以清楚看到各個方法的執行時間:

在這里插入圖片描述

缺點
  • 運行時開銷嚴重,整體會變慢。
  • 可能帶偏優化方向。

Systrace

Systrace 是 Android SDK 中提供的另一個性能分析工具,它提供了系統級別的跟蹤信息,包括內核調度、硬件I/O、進程/線程調度等。Systrace 專注于整個 Android 系統的行為,幫助開發者了解系統資源的使用情況和潛在的瓶頸。

環境配置

https://blog.csdn.net/Donald_Zhuang/article/details/118771191

https://blog.csdn.net/jdsjlzx/article/details/134179374

使用方式
public class BaseApp extends Application {@Overridepublic void onCreate() {super.onCreate();// Systrace開始Trace.beginSection("myTrace002");initRefresh();initTitleBar();initToast();initActivites();// Systrace結束Trace.endSection();}
}

先執行命令:python D:\dev\AndroidSDK\platform-tools\systrace\systrace.py -t 10 -o mytrace.html -a com.example.android_performance_optimization sched freq idle am wm gfx view binder_driver hal dalvik camera input res

然后運行程序,大概10秒后會生成 mytrace.html 文件。

打開 html 文件過濾相關信息后可以看到 Wall Duration 耗時:

在這里插入圖片描述

TraceView和Systrace比較

性能消耗

  • TraceView:由于它收集所有方法的耗時信息和嵌套關系,因此本身的性能消耗很大,可能會影響到實際的運行環境,統計的耗時可能不準確。
  • Systrace:采用了不同的思路,通過有限的Label先粗略統計出一個階段的耗時,定位到問題后再進一步細化和測算分析。這種方式相對于TraceView來說,對性能的影響較小。

適用范圍

  • TraceView:更適用于從軟件跟蹤的角度分析應用程序的性能。
  • Systrace:則更側重于從系統整體的角度分析Android系統的性能,包括各個關鍵子系統和服務的運行情況。

AOP統計耗時

環境配置

這里使用第三方框架:https://github.com/FlyJingFish/AndroidAOP

添加依賴庫:

implementation 'io.github.FlyJingFish.AndroidAop:android-aop-core:1.8.8'
implementation 'io.github.FlyJingFish.AndroidAop:android-aop-annotation:1.8.8'
annotationProcessor 'io.github.FlyJingFish.AndroidAop:android-aop-processor:1.8.8'
使用

定義注解:

@AndroidAopPointCut(CostTimePointcut.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CostTime {
}

定義切面類:

public class CostTimePointcut implements BasePointCut<CostTime> {@Nullable@Overridepublic Object invoke(@NonNull ProceedJoinPoint proceedJoinPoint, @NonNull CostTime costTime) {long startTime = System.currentTimeMillis();proceedJoinPoint.proceed(); // 繼續執行原方法long time = System.currentTimeMillis() - startTime;Class<?> targetClass = proceedJoinPoint.getTargetClass();String className = targetClass.getName();AopMethod targetMethod = proceedJoinPoint.getTargetMethod();String methodName = targetMethod.getName();String builder = className + "#" + methodName + " [" + time + "ms" + "] ";Log.e("CostTime", builder);return null;}
}

使用AOP:

public class BaseApp extends Application {@CostTime@Overridepublic void onCreate() {super.onCreate(); initRefresh(); initTitleBar(); initToast(); initActivites(); }@CostTimeprivate void initActivites() {ActivityManager.getInstance().init(instance);}@CostTimeprivate void initToast() {ToastUtils.init(instance, new ToastStyle());ToastUtils.setDebugMode(AppConfig.isDebug());ToastUtils.setInterceptor(new ToastLogInterceptor());}@CostTimeprivate void initTitleBar() {TitleBar.setDefaultStyle(new TitleBarStyle());}@CostTimeprivate void initRefresh() {SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {@Overridepublic RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {layout.setPrimaryColorsId(R.color.black, android.R.color.white);//全局設置主題顏色return new ClassicsHeader(context);}});SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {@Overridepublic RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {return new ClassicsFooter(context).setDrawableSize(20);}});}
}

輸出:

com.example.android_performance_optimization.BaseApp#initRefresh [1ms] 
com.example.android_performance_optimization.BaseApp#initTitleBar [0ms] 
com.example.android_performance_optimization.BaseApp#initToast [0ms] 
com.example.android_performance_optimization.BaseApp#initActivites [1ms] 
com.example.android_performance_optimization.BaseApp#onCreate [2ms] 

優化

  • 白屏優化
  • 異步加載優化
  • 延遲加載優化

白屏優化

在啟動時提供一個簡潔的初始界面給用戶,增強用戶體驗。

定義主題:

<style name="SplashTheme" parent="AppTheme"><!--        設置背景圖--><item name="android:windowBackground">@drawable/shape_splash</item><!--        取消標題欄--><item name="windowNoTitle">true</item><item name="windowActionBar">false</item><!--        設置window不透明--><item name="android:windowIsTranslucent">false</item><!--        禁用窗口的預覽動畫--><item name="android:windowDisablePreview">true</item><!--        取消遮蓋--><item name="android:windowContentOverlay">@null</item><!--        全屏--><item name="android:windowFullscreen">true</item>
</style>

配置AndroidManifest.xml:

<activityandroid:name=".SplashActivity"android:exported="true"android:launchMode="singleTop"android:theme="@style/SplashTheme"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>

異步加載優化

環境配置

這里使用第三方框架:https://github.com/aiceking/AppStartFaster

添加依賴庫:

implementation 'com.github.aiceking:AppStartFaster:2.2.0'
使用
public class BaseApp extends Application {private static BaseApp instance;public static BaseApp getInstance() {return instance;}@CostTime@Overridepublic void onCreate() {super.onCreate();instance = this; AppStartTaskDispatcher.create().setShowLog(true).addAppStartTask(new ActivityTask(instance)).addAppStartTask(new ToastTask(instance)).addAppStartTask(new TitleBarTask()).addAppStartTask(new RefreshTask()).start().await();}
}

延遲加載優化

IdleHandler 是一個用于在主線程(UI 線程)空閑時執行任務的接口。

使用場景:

  • 數據預加載。
  • 清理資源。
  • 日志上傳。
  • 檢查更新。
  • 性能分析。

使用:

首先,你需要創建一個實現了IdleHandler接口的類或使用匿名內部類。在queueIdle()方法中定義你希望在空閑時執行的代碼邏輯。該方法的返回值決定了IdleHandler的生命周期:

  • 返回true表示IdleHandler將繼續保留在集合中,下次消息隊列空閑時還會再次調用queueIdle()
  • 返回false表示執行完畢后將從集合中移除,不再重復調用。

定義延遲加載啟動器:

public class DelayInitDispatcher {private DelayInitDispatcher() {}public static DelayInitDispatcher newInstance() {return new DelayInitDispatcher();}private LinkedList<Task> mDelayTasks = new LinkedList<>();private MessageQueue.IdleHandler mIdleHandler = new MessageQueue.IdleHandler() {@Overridepublic boolean queueIdle() {if (mDelayTasks.size() > 0) {Task task = mDelayTasks.poll();task.run();}return !mDelayTasks.isEmpty();}};public DelayInitDispatcher addTask(Task task) {mDelayTasks.add(task);return this;}public void start() {Looper.myQueue().addIdleHandler(mIdleHandler);}
}

定義Task接口:

public interface Task extends Runnable{
}

定義2個任務:

public class PreloadTask implements Task {@Overridepublic void run() {try {Thread.sleep(1000L);Log.e("TAG", "預加載數據");} catch (InterruptedException e) {throw new RuntimeException(e);}}
}
public class ClearTask implements Task {@Overridepublic void run() {try {Thread.sleep(2000L);Log.e("TAG", "清理資源");} catch (InterruptedException e) {throw new RuntimeException(e);}}
}

使用:

DelayInitDispatcher.newInstance().addTask(new PreloadTask()).addTask(new ClearTask()).start();

AppStartup

  • AppStartup 是一個可以用于加速App啟動速度的 Jetpack 組件。
  • AppStartup 是借助 ContentProvider 進行提前初始化操作

https://blog.csdn.net/qq_14876133/article/details/119247723

源碼下載

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

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

相關文章

Reid系列論文學習——無人機場景下基于 Transformer 的輕量化行人重識別

今天介紹的一篇論文是針對無人機場景下的行人重識別&#xff0c;論文題目為&#xff1a;"無人機場景下基于 Transformer 的輕量化行人重識別"。該論文針對無人機場景下行人呈現多角度多尺度的特點、以及傳統CNN網絡在行人重識別任務中受限于感受野和下采樣導致的無法…

力扣1895.最大的幻方

力扣1895.最大的幻方 求前綴和暴力枚舉幻方邊長 求行列前綴和 class Solution {public:int largestMagicSquare(vector<vector<int>>& grid) {int n grid.size() , m grid[0].size();vector<vector<int>> rowsum(n,vector<int>(m));for…

關于汽車軟件測試的幾點想法

如果你有過汽車行業的從業經驗&#xff0c;你就應該知道&#xff0c;過去汽車行業只做測試&#xff0c;而不做開發。汽車制造商的主要任務&#xff08;從工程角度看&#xff09;是將來自數百家供應商的數千個零部件組裝在一起。考慮到現代軟件的復雜性和客戶的“挑剔”&#xf…

Rufus 制作啟動盤 | 便攜的工作空間

嘮嘮閑話 最近服務器硬盤故障多&#xff0c;在修復過程中&#xff0c;學習了一些操作&#xff0c;這里做個記錄。本期主要介紹 U盤啟動盤的制作&#xff0c;以及持久化存儲。 U 盤啟動盤 鏡像選擇 Ubuntu 的版本命名遵循 “Adjective Animal” 的模式&#xff0c;即 “形容…

【trition-server】python-backend 源碼閱讀

c++ 的stub 代碼import 了 python的類 sys 和 triton_python_backend_utils.pystub本身是一個進程,與主進程做IPC通信docker 運行一個trition-server (base) zhangbin@ubuntu-server:~$ docker run --shm-size=1g --ulimit memlock=-1 -p 8000:8000 -p 8001:8001 -p 8002:8002…

windwos環境和pyspark環境問題解決-記錄

一&#xff1a; 打不開cmd/cmd閃退問題解決 1.winR打開 regedit 2.在注冊表找到 HKEY_CURRENT_USER\Software\Microsoft\Command Processor路徑 3.在該路徑下找到AutoRun&#xff0c;將數值改為空 可能原因&#xff1a;找到AutoRun 發現值是&#xff1a; if exist & if…

新港海岸NCS8822 低功耗DP轉VGA 分辨率支持1920*1200*60HZ

NCS8822描述&#xff1a; NCS8822是一個低功耗顯示端口到vga轉換器。NCS8822集成了一個與DP1.2兼容的接收器和一個高速三通道視頻DAC。對于DP1.2輸入&#xff0c;NCS8822支持1車道/2車道&#xff0c;也支持車道交換功能。對于VGA輸出NCS8822&#xff0c;在60Hz幀率下對WUXGA&a…

C++ 棧-隊列-優先級隊列

目錄 1 棧 2 隊列 3 deque 介紹 4 優先級隊列 5 反向迭代器 棧也是我們在C語言就模擬實現過的一種數據結構&#xff0c;在C中&#xff0c;棧其實和我們前面模擬實現過的string、vector等容器有一點區別&#xff0c;站起是不是容器&#xff0c;而是一種容器適配器&#xff0c;我…

java必知必會-j2ee規范(上)

文章目錄 一、WEB三大規范二、j2ee相關接口(上)1.javax.servlet.Servlet2.javax.servlet.http.HttpServlet3.javax.servlet.ServletRequest4.javax.servlet.http.HttpServletRequest5.javax.servlet.ServletResponse6.javax.servlet.http.HttpServletResponse7. javax.servlet.…

k8s record 20240705

k8s 安全管理 request 是1g&#xff0c;你得不到要求&#xff0c;我就不創建了&#xff0c;這就是準入控制二次校驗 SA就是serviceAccount。 內部是SA和 token, 外部用戶進來就是 .kube/config文件 namespace下的是role&#xff0c;整個集群是 ClusterRole. 動作就是Binding li…

pytest-rerunfailures:優化測試穩定性的失敗重試工具

筆者在執行自動化測試用例時&#xff0c;會發現有時候用例失敗并非代碼問題&#xff0c;而是由于服務正在發版&#xff0c;導致請求失敗&#xff0c;從而降低了自動化用例的穩定性&#xff0c;最后還要花時間定位到底是自身case的原因還是業務邏輯問題&#xff0c;還是其他原因…

大數據面試題之Presto[Trino](3)

目錄 Presto如何處理數據的聚合操作&#xff1f; Presto支持哪些類型的JOIN操作&#xff1f; 如何在Presto中使用子查詢&#xff1f; 解釋Presto中的窗口函數。 Presto中的Page和Block是什么&#xff1f; 描述Presto如何處理列式存儲數據。 ORC和Parquet格式在Presto中的…

適合家居建材企業的CRM系統盤點(2024版)

當前&#xff0c;CRM市場上&#xff0c;國際巨頭的市場優勢正在逐漸減弱&#xff0c;國內CRM企業奮起追趕&#xff0c;呈現出強勁的崛起勢頭。因此&#xff0c;對于家居建材企業來講&#xff0c;在進行CRM選型時&#xff0c;如何選擇一款合適的系統是關乎企業高效發展的重要課題…

探索C嘎嘎的奇妙世界:第十九關---STL(list的模擬實現)

1. 基本框架 首先&#xff0c;我們先從節點的準備工作入手&#xff0c;請看示例&#xff1a; #pragma once #include<iostream> #include<assert.h> using namespace std; //節點 template<class T> struct ListNode {ListNode<T>* _next;Li…

矩陣鍵盤與密碼鎖

目錄 1.矩陣鍵盤介紹?編輯 2.掃描的概念 3.代碼演示&#xff08;讀取矩陣鍵盤鍵碼&#xff09; 4.矩陣鍵盤密碼鎖 1.矩陣鍵盤介紹 為了減少I/O口的占用&#xff0c;通常將按鍵排列成矩陣形式&#xff0c;采用逐行或逐列的 “掃描”&#xff0c;就可以讀出任何位置按鍵的狀態…

免殺筆記 ----> ShellCode Loader !!!

學了那么久的前置知識&#xff0c;終于到了能上線的地方了&#xff01;&#xff01;&#xff01; 不過這里還沒到免殺的部分&#xff0c;距離bypass一眾的殺毒軟件還有很長的路要走&#xff01;&#xff01; 目錄 1.ShellCode 2.ShellCode Loader的概念 3.可讀可寫可…

字符串函數5-9題(30 天 Pandas 挑戰)

字符串函數 1. 相關知識點1.5 字符串的長度條件判斷1.6 apply映射操作1.7 python大小寫轉換1.8 正則表達式匹配2.9 包含字符串查詢 2. 題目2.5 無效的推文2.6 計算特殊獎金2.7 修復表中的名字2.8 查找擁有有效郵箱的用戶2.9 患某種疾病的患者 1. 相關知識點 1.5 字符串的長度條…

代碼隨想錄算法訓練營第四十四天|188.買賣股票的最佳時機IV、309.最佳買賣股票時機含冷凍期、714.買賣股票的最佳時機含手續費

188.買賣股票的最佳時機IV 題目鏈接&#xff1a;188.買賣股票的最佳時機IV 文檔講解&#xff1a;代碼隨想錄 狀態&#xff1a;不會 思路&#xff1a; 在股票買賣1使用一維dp的基礎上&#xff0c;升級成二維的即可。 定義dp[k1][2]&#xff0c;其中 dp[j][0] 表示第j次交易后持…

虛擬ECU:純電動汽車發展下的新選擇

人類文明的進步是一個不斷自我否定、自我超越的過程。21世紀以來&#xff0c;隨著科技進步和經濟社會發展&#xff0c;能源和交通系統已從獨立于自然環境的孤立系統&#xff0c;轉變為與自然、技術、社會深度耦合的復雜系統。為實現可持續發展和應對氣候變化&#xff0c;世界各…

【居家養老實訓室】:無障礙設施建設與評估

本文圍繞居家養老實訓室中的無障礙設施建設與評估展開討論。首先闡述了無障礙設施對于居家養老的重要性&#xff0c;接著詳細介紹了常見的居家養老無障礙設施類型&#xff0c;包括出入口、通道、臥室、衛生間等區域的設施。然后重點探討了無障礙設施的評估方法和標準&#xff0…