冷啟動(dòng)優(yōu)化實(shí)踐, 首頁(yè)初次顯示時(shí)間從4s優(yōu)化到1s

activity 啟動(dòng)時(shí)間計(jì)算

ActivityManager Log 輸出:

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

優(yōu)化前的初始值為: +4s149ms

也可以使用adb shell啟動(dòng)頁(yè)面.
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檢測(cè)在UI線(xiàn)程的磁盤(pán)讀寫(xiě)和網(wǎng)絡(luò)耗時(shí)操作

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

        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());

通過(guò)StrictMode Log Tag輸出:

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

給出了時(shí)間消耗: ~301ms, 以及完整的stacktrace.
把這些操作封裝成runnable, 通過(guò)HandlerThread在子線(xiàn)程中去執(zhí)行.
在項(xiàng)目中通過(guò)AsyncDataJobHandler類(lèi)完成這些操作.

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

找出啟動(dòng)過(guò)程中的耗時(shí)方法.

Hugo檢測(cè)哪些方法被調(diào)用

詳見(jiàn):
http://www.itdecent.cn/p/e3d9221f8e37
快速定位某個(gè)類(lèi)中的哪些方法在啟動(dòng)時(shí)被調(diào)用了,
以及這些方法的執(zhí)行時(shí)間, 使用Hugo可以快速定位出一些性能問(wèn)題.

使用 android lint 優(yōu)化layout文件

按照l(shuí)int給出的建議, 優(yōu)化了幾十個(gè)布局文件, 提高布局的加載速度.

優(yōu)化多進(jìn)程app中首頁(yè)的啟動(dòng)速度.

FreeWifi有5個(gè)進(jìn)程同時(shí)啟動(dòng), 因此Application的onCreate()被調(diào)用5次, 做初始化的工作. 通過(guò)context得到進(jìn)程名, 要區(qū)分不同進(jìn)程要初始化的具體模塊, 避免不必要的模塊在當(dāng)前進(jìn)程中被初始化.
另外, 為達(dá)到主進(jìn)程中的activity快速顯示出來(lái), 可以在其他進(jìn)程進(jìn)入Application的onCreate()中有意sleep()幾秒, 避免和主進(jìn)程搶占CPU資源.

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

最后, 為達(dá)到更好的效果, 可以為啟動(dòng)activity提供一個(gè)背景圖, 避免白屏.

優(yōu)化結(jié)果

ActivityManager Log 輸出:

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

從4s多, 優(yōu)化到1s多, 效果還是不錯(cuò)的.

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,008評(píng)論 25 709
  • 1、前言 隨著項(xiàng)目版本的迭代,App的性能問(wèn)題會(huì)逐漸暴露出來(lái),而好的用戶(hù)體驗(yàn)與性能表現(xiàn)緊密相關(guān),性能問(wèn)題從應(yīng)用的啟...
    蕭竹閱讀 15,153評(píng)論 1 24
  • 一觸即發(fā) App啟動(dòng)優(yōu)化最佳實(shí)踐 文中的很多圖都是Google性能優(yōu)化指南第六季中的一些截圖 Google給出的優(yōu)...
    eclipse_xu閱讀 5,245評(píng)論 7 95
  • 今天是2016年12月13日。因?yàn)椤澳昙o(jì)已大”所以格外看重時(shí)間。希望每分鐘都有意義。年紀(jì)已大已經(jīng)不需要每天都快快樂(lè)...
    晨曉靜和閱讀 244評(píng)論 0 0
  • 打這個(gè)標(biāo)題前我又看了一遍學(xué)校的各種亂七八糟的公眾號(hào)(每個(gè)社團(tuán)都有公眾號(hào)我還能理解,我學(xué)校不同部門(mén)搞不同公眾號(hào)是想霸...
    橙和梨子閱讀 359評(píng)論 0 0

友情鏈接更多精彩內(nèi)容