美文网首页
性能优化

性能优化

作者: 修符道人 | 来源:发表于2020-01-20 15:48 被阅读0次

    https://www.cnblogs.com/ldq2016/p/8480153.html
    不要过度绘制,减少嵌套,减少重复的background。

    https://www.jianshu.com/p/6d855e984b99

    第一篇:Android官方性能分析工具

    1.StrictMode (线程优化分析)

    https://www.cnblogs.com/yaowen/p/6024690.html (十分详细)
    https://my.oschina.net/u/1175007/blog/486666
    各个方法说明:https://blog.csdn.net/mynameishuangshuai/article/details/51742375

    • StrictMode.java方法总结:

    detectXXX:表示要检测XXX项
    permitXXX:表示不检测XXX项
    penaltyXXX:表示检测到不合格的代码,以什么样的形式提示开发者。

    public class MyApplication extends Application {
        private static MyApplication instance;
        public static MyApplication getInstance(){
            return instance;
        }
        @Override
        public void onCreate() {
            instance = this;
            StrictMode.ThreadPolicy oldThreadPolicy = StrictMode.getThreadPolicy();
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(oldThreadPolicy)
                    .detectCustomSlowCalls() //API等级11,使用StrictMode.noteSlowCode
                    .detectDiskWrites()
    //                .penaltyDialog() //弹出违规提示对话框
                    .penaltyDeath() //弹出违规提示对话框
                    .build());
    
            StrictMode.VmPolicy vmPolicy = StrictMode.getVmPolicy();
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder(vmPolicy)
                    .detectActivityLeaks()
                    .penaltyDeath()
                    .build());
            super.onCreate();
        }
    }
    

    ThreadPolicy 详解 (线程策略)

    • 主线程发起网络请求

    关于StrictMode,即使不手动集成这个类,network on UI也会自动报错。
    https://blog.csdn.net/gengkui9897/article/details/82863966

    D/NetworkSecurityConfig: No Network Security Config specified, using platform default
    W/System.err: android.os.NetworkOnMainThreadException
    W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
            at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:117)
            at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105)
            at java.net.InetAddress.getAllByName(InetAddress.java:1154)
            at com.android.okhttp.Dns$1.lookup(Dns.java:39)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175)
            at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83)
            at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174)
            at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
            at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
            at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
            at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
    

    https://blog.csdn.net/shuaizhigen/article/details/82223945

    其实,在android3.0之后,主线程增加了StrictMode检查网络请求出现在主线程抛出异常的源码:
    以API29为例:
    ActivityThread.java

        StrictMode.initThreadDefaults(data.appInfo);
        StrictMode.initVmDefaults(data.appInfo);
    

    StrictMode.java

       public static void initThreadDefaults(ApplicationInfo ai) {
            final ThreadPolicy.Builder builder = new ThreadPolicy.Builder();
            final int targetSdkVersion =
                    (ai != null) ? ai.targetSdkVersion : Build.VERSION_CODES.CUR_DEVELOPMENT;
    
            // Starting in HC, we don't allow network usage on the main thread
            if (targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB) {
                builder.detectNetwork();
                builder.penaltyDeathOnNetwork();
            }
            ...
    }
    

    检测网络在主线程的代码

    builder.detectNetwork();
    

    所以,ActivityThread本来就默认集成了StrictMode,我们只是个性化自己的策略而已。

    • 主线程文件读写

    在主线程做文件读写,android默认并不会抛出异常。通过上面分析StrictMode.java的initThreadDefaults方法可以知道,StrictMode默认不会在主线程里检测读写异常。

    自己怎么检测主线程里有读写文件操作:先获取旧的线程策略,然后传入builder。这样既可以保留系统原来的参数设置,又能自己个性化设置。

    public class MyApplication extends Application {
        @Override
        public void onCreate() {
            StrictMode.ThreadPolicy oldThreadPolicy = StrictMode.getThreadPolicy();
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(oldThreadPolicy)
                    .detectDiskWrites()
                    .build());
            super.onCreate();
        }
    }
    

    这样,在主线程执行文件读写操作,就会报错。

    • 主线程耗时操作

    https://www.cnblogs.com/yaowen/p/6024690.html
    这篇博客里,作者说的很详细,这个可以自定义,使用StrictMode.noteSlowCall方法即可向StrictMode传递类似于异常的信息。

    VMPolicy 详解(虚拟机策略)

    主要是用来检测内存泄漏

    • 检测Activity内存泄漏

    • 检测没有正确关闭

    我测试了一下,不加close,StrictMode并没有生效。

    其它操作

    在设置里开启了严格模式,但是耗时操作屏幕也没有闪烁不知道为啥(vivo iqoo android9.0)。

    2.Systrace

    官方使用指南:https://developer.android.google.cn/studio/profile/systrace.html

    trace启动

    https://www.cnblogs.com/blogs-of-lxl/p/10926824.html (介绍了一些缩放、移动快捷键,怎么写bat来开启ddms)

    • 通过systrace.py启动
      通过systrace.py启动可以自定义更多的参数(但是windows使用py脚本,除了要安装完整python外,还要安装对应的支持windows api插件,且版本要和sdk里的py脚本的版本一致。)
      https://blog.csdn.net/Jason43/article/details/84834990
    D:\Android\Sdk\platform-tools\systrace>systrace.py -a com.example.appoptimize -t 10
    

    使用Python可能会出现的问题:
    1)ImportError: No module named six
    https://blog.csdn.net/Jason43/article/details/84834990
    2)指定-o 输出路径参数,生成trace.html报错:

    image.png
    不加-o参数即不会报错

    trace文件分析

    http://www.360doc.com/content/18/0423/20/7377734_748161620.shtml
    https://www.cnblogs.com/andy-songwei/p/10659564.html
    https://blog.csdn.net/weixin_38570262/article/details/78479064 (如何精确的trace,自定义自己的trace label)
    https://www.jianshu.com/p/acc78b36bd34 (大致图解了一下systrace的各个图形的意思)

    • F符号判断是否卡帧

    3.TraceView

    作用:分析方法调用栈以及其执行时间, 优化方法执行.

    DDMS开启TraceView:

    https://www.cnblogs.com/sunzn/p/3192231.html
    https://blog.csdn.net/u010164190/article/details/80092941

    AndroidStudio开启TraceView:

    对应CPU选项
    https://segmentfault.com/a/1190000011084104

    3.Layout Inspector

    最新的SDK里没有Hierarchy Viewer,as使用Layout Inspector替代。
    官方文档:https://developer.android.google.cn/studio/debug/layout-inspector.html

    https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html

    布局优化和Hierarchy Viewer看下面
    https://www.jianshu.com/p/4943dae4c333

    第二篇:性能优化实战

    1.应用启动速度优化

    https://www.jianshu.com/p/98c1656a357a

    2.ANR处理

    https://www.jianshu.com/p/6d855e984b99

    3.消除卡顿

    https://www.jianshu.com/p/1fb065c806e6

    4.电量优化

    https://www.jianshu.com/p/c55ef05c0047

    4.网络优化

    https://www.jianshu.com/p/d4c2c62ffc35

    相关文章

      网友评论

          本文标题:性能优化

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