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检测哪些方法被调用
详见:
//www.greatytc.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.----------