冷启动优化实践, 首页初次显示时间从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.jianshu.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.----------

你可能感兴趣的:(冷启动优化实践, 首页初次显示时间从4s优化到1s)