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