美文网首页Android 优化实践系列文章
冷启动优化实践, 首页初次显示时间从4s优化到1s

冷启动优化实践, 首页初次显示时间从4s优化到1s

作者: ahking17 | 来源:发表于2016-12-16 16:15 被阅读73次
    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

        本文链接:https://www.haomeiwen.com/subject/khwnmttx.html