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.----------