性能优化

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,699评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,124评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,127评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,342评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,356评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,057评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,654评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,572评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,095评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,205评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,343评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,015评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,704评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,196评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,320评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,690评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,348评论 2 358

推荐阅读更多精彩内容