冷啟動優化實踐, 首頁初次顯示時間從4s優化到1s

activity 啟動時間計算

ActivityManager Log 輸出:

I/ActivityManager: Displayed com.qihoo.freewifi/.activity.MainActivity: +4s149ms

優化前的初始值為: +4s149ms

也可以使用adb shell啟動頁面.
adb shell 輸出:

adb shell am start -W com.qihoo.freewifi/.activity.MainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.qihoo.freewifi/.activity.MainActivity }
Status: ok
Activity: com.qihoo.freewifi/.activity.MainActivity
ThisTime: 3320
TotalTime: 3320
Complete
使用StrictMode檢測在UI線程的磁盤讀寫和網絡耗時操作

Application onCreate() 中添加檢測代碼:

        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskReads()
                .detectDiskWrites()
                .detectNetwork()   // or .detectAll() for all detectable problems
                .penaltyLog()
                .build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedSqlLiteObjects()
                .penaltyLog()
                .penaltyDeath()
                .build());

通過StrictMode Log Tag輸出:

D/StrictMode: StrictMode policy violation; ~duration=301 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2

給出了時間消耗: ~301ms, 以及完整的stacktrace.
把這些操作封裝成runnable, 通過HandlerThread在子線程中去執行.
在項目中通過AsyncDataJobHandler類完成這些操作.

public class AsyncDataJobHandler extends HandlerThread
使用traceview
android.os.Debug.startMethodTracing("startup");
android.os.Debug.stopMethodTracing();

在/sdcard/目錄下, 生成startup.trace文件.

wangxin@wangxin:~/tool/android-sdk-linux/tools$ ./traceview ~/Desktop/startup.trace

找出啟動過程中的耗時方法.

Hugo檢測哪些方法被調用

詳見:
http://www.lxweimin.com/p/e3d9221f8e37
快速定位某個類中的哪些方法在啟動時被調用了,
以及這些方法的執行時間, 使用Hugo可以快速定位出一些性能問題.

使用 android lint 優化layout文件

按照lint給出的建議, 優化了幾十個布局文件, 提高布局的加載速度.

優化多進程app中首頁的啟動速度.

FreeWifi有5個進程同時啟動, 因此Application的onCreate()被調用5次, 做初始化的工作. 通過context得到進程名, 要區分不同進程要初始化的具體模塊, 避免不必要的模塊在當前進程中被初始化.
另外, 為達到主進程中的activity快速顯示出來, 可以在其他進程進入Application的onCreate()中有意sleep()幾秒, 避免和主進程搶占CPU資源.

    @Override
    public void onCreate() {
        super.onCreate();
        if (!isUIApplication(this)) {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
避免啟動白屏的背景圖

最后, 為達到更好的效果, 可以為啟動activity提供一個背景圖, 避免白屏.

優化結果

ActivityManager Log 輸出:

Displayed com.qihoo.freewifi/.activity.MainActivity: +1s215ms (total +1s736ms)

從4s多, 優化到1s多, 效果還是不錯的.

----DONE.----------

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,124評論 25 708
  • 1、前言 隨著項目版本的迭代,App的性能問題會逐漸暴露出來,而好的用戶體驗與性能表現緊密相關,性能問題從應用的啟...
    蕭竹閱讀 15,029評論 1 24
  • 一觸即發 App啟動優化最佳實踐 文中的很多圖都是Google性能優化指南第六季中的一些截圖 Google給出的優...
    eclipse_xu閱讀 5,132評論 7 95
  • 今天是2016年12月13日。因為“年紀已大”所以格外看重時間。希望每分鐘都有意義。年紀已大已經不需要每天都快快樂...
    晨曉靜和閱讀 203評論 0 0
  • 打這個標題前我又看了一遍學校的各種亂七八糟的公眾號(每個社團都有公眾號我還能理解,我學校不同部門搞不同公眾號是想霸...
    橙和梨子閱讀 327評論 0 0