日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

關于Android冷啟動耗時優化詳解_Android

作者:冬天的毛毛雨 ? 更新時間: 2022-03-29 編程語言

1,背景

最近開發了一個新的App,前期工期緊,做的比較粗放,上線以后發現App啟動時間比較長,達到3秒,

啟動有白屏,體驗也不好,這個只能后期優化了,最好是前期開發就考慮的

2,調研

2.1,Android中啟動的方式

1,冷啟動:如果App啟動時,后臺沒有該應用進程,那么系統會重新創建一個進程分配給該應用,這種啟動方式就是冷啟動

2,熱啟動:如果App啟動時,后臺有該應用進程,那么系統就是直接使用已有進程

從兩種啟動方式的含義就可以看出,冷啟動比較耗時,熱啟動一般比較快,我們要做的啟動優化一般做的就是冷啟動優化

2.2,冷啟動流程

系統創建應用進程時間我們一般無法優化,這個是系統創建簡單的流程

我們可以優化的地方就是

1,Application
2,SplashActivity
3,MainActivity

2.3,啟動時間

1,通過命令

adb shell am start -W [packageName]/[packageName.MainActivity]
這個時候,如果啟動的activity在Manifest中沒有設置export:true,可能無法通過命令打開,需要設置這個

2,自己埋點

從上面的啟動過程就可以知道,Android冷啟動,系統要先創建一個進程,然后創建Application,系統創建進程的過程,我們可以在Application的attachBaseContext方法中開始埋點

/**
* 統計冷啟動各個時間點的耗時
*/
public class StartLogHelper {

    private static final String TAG = "StartLogHelper";
    private static long startTime;

    /**
     * 設置開始時間,暫時放到啟動的時間,放到Application的attachBaseContext方法中
     * @param start
     */
    public static void setStart(long start){
        startTime = start;
    }

    /**
     * application初始化的時間,放到Application的onCreate方法最后
     */
    public static void getApplicationTime(){
        long end = System.currentTimeMillis();
        DebugLog.e(TAG,"==================getApplicationTime==" + (end - startTime));

    }

    /**
     * 歡迎頁初始化的時間
     */
    public static void getWelcomeTime(){
        long end = System.currentTimeMillis();
        DebugLog.e(TAG,"==================getWelcomeTime==" + (end - startTime));
    }

    /**
     * Main頁面初始化的時間
     */

    public static void getMainTime(){
        long end = System.currentTimeMillis();
        DebugLog.e(TAG,"==================getMainTime==" + (end - startTime));
    }

3,在studio的logcat日志中

在logcat日志中輸入應用的包名

然后就可以看到各個階段的時間了

3,方案

從調研冷啟動的原理就可以得出,我們要優化的地方

1,冷啟動白屏現象

冷啟動的時候,我們發現會有白屏現象,會先出現一個白屏,然后在出現歡迎頁的UI,這個跟系統的設置的背景windowBackground有關系

解決方案:

在歡迎頁設置一個自定義的theme屬性

SplashActivity的清單文件設置
   android:theme="@style/SplashScreenTheme”

SplashScreenTheme屬性定義
   <style name="SplashScreenTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/bg_splash</item>
   </style>

bg_splash定義
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white" />
        <bitmap
            android:antialias="true"
            android:gravity="center"
            android:src="@drawable/bg_show" />
    </item>
</layer-list>
其中bg_show的圖片和歡迎頁的初始圖片一樣,這樣就可以實現啟動白屏的樣式
和歡迎頁樣式一樣,給人沒有白屏的感覺

2,啟動時間優化

我們從上面的啟動時間就可以知道

1,Application onCreate中初始化三方sdk耗時

public class AppConfigHelper {
    public void setAppConfig(Application application){
        addSyncTask(application);
        addAsyncTask(application);
        TaskConfigManager.getInstance().startInit();
    }

    private void addSyncTask(Application application) {
        TaskConfigManager.getInstance().addTask(new ZMLTask("oneLogin") {
            @Override
            public void run() {
                JVerifyHelper.init(application);
            }
        });
    }
}
把需要在Application中同步執行的放到一起

可以異步執行的放到一起

2,首頁耗時方法

到首頁的時候,我們埋點的時間,小于用戶看到數據的時間 這個是因為首頁加載的數據比較多 我們首頁同時加載了7個Fragment,同時請求10個以上接口

1,首頁做懶加載,保證App啟動接口只請求3個左右

2,首頁UI優化,同時顯示出ui以后在執行后面邏輯處理

3,首頁部分不重要邏輯做延時加載,比如請求升級彈窗等

總結

原文鏈接:https://blog.csdn.net/dongrimaomaoyu/article/details/122482161

欄目分類
最近更新