ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

TT语音线程优化,深入讲解Android

2021-09-08 12:33:15  阅读:199  来源: 互联网

标签:cn 创建 TT k3u1fbpfcp 线程 https Android image


             }

            if (e.className == "me.weishu.epic.art.entry.Entry" && e.methodName == "referenceBridge") {
                isCanAppendLog = true
            } else {
                if (isCanAppendLog) {
                    normalInfo.append("\n${e.className}(methodName:${e.methodName},lineNumber:${e.lineNumber})")
                }
            }
        }
        normalInfo.append("\n=====================================threadTraceEnd=======================================")
        Log.i(tag, normalInfo.toString())
    }
}

companion object {
    const val tag = "====>ThreadCheck"

    fun hook() {

        if (!BuildConfig.DEBUG) {
            return
        }

        DexposedBridge.hookAllConstructors(Thread::class.java, ThreadCheck())
    }
}

}


日志打印格式
------

![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d6c6119245374551890b33ff3d305203~tplv-k3u1fbpfcp-watermark.image)

从上图结合下图可以看出在下面的类创建了AsyncTask,而且使用完后没有立即销毁,造成了内存的浪费,而且,频繁的创建线程可能会导致APP因为线程数量过多造成OOM

![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0e4332836e6d419b8cca60ca29aaa444~tplv-k3u1fbpfcp-watermark.image)

分析
--

![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7550c8a6515645ea80aae594807ae260~tplv-k3u1fbpfcp-watermark.image)

![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f702f8e7b33a4f1da610bb9156a277d3~tplv-k3u1fbpfcp-watermark.image)

如上图所示,TT语音在android8.0以上的机型上出现的大量这种类似的OOM,这是因为线程数量过多或者虚拟内存不足造成的,创建线程是需要消耗虚拟内存的,不同机型允许的最大线程数量是不一样的,例如在华为的部分机型上,这个上限被修改的很低(大约500),需要注意的是,**APP的线程总数=工作中的线程数+sleep状态的线程数**,所以这些手机容易出现线程数溢出的问题,而TT语音一进入首页就会大概创建240个左右的线程,虽然这里面有很多线程都是很快就工作结束的,然后变成无用线程的,也就是说这些工作结束后的线程并不会计入APP的线程总数中,但是,频繁的创建线程依然可能会导致上图中的OOM,因为尽管他们工作时间很短,但是依然可能是压垮骆驼的最后一根稻草,而且,频繁的创建线程,会造成虚拟内存的消耗,加大OOM的可能性,因此,尽量减少线程的创建是线程优化的关键一步,然后,开始统计线程使用情况,情况如下:

线程使用情况
------

  1. 代码中使用 new Thread或者new AsyncTask或者new HandlerThread创建的线程,例如上图中创建了AsyncTask
  2. 获取SharePreferences对象的时候创建的线程,每次获取SharePreferences对象的时候都会重新创建线程,原因是我们获取SharePreferences对象的模式是多进程模式,这个情况下每次获取SharePreferences对象的时候都会创建新线程
  3. 代码中协程创建的线程
  4. 第三方sdk创建的线程以及获取SharePreference对象创建的线程
  5. 代码中使用线程池创建的线程
  6. Maven依赖库创建的线程

优化方式
----


### 学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

**2021最新上万页的大厂面试真题**

![](https://www.icode9.com/i/ll/?i=img_convert/8d1970fdf49378354dbf4ead8fede65f.png)

**七大模块学习资料:如NDK模块开发、Android框架体系架构…**

![](https://www.icode9.com/i/ll/?i=img_convert/5580deccc64e977604f3b48b7f594387.png)

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

> 这份体系学习笔记,适应人群:
> **第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
> **第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
> **第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。

**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](https://codechina.csdn.net/m0_60958482/android_p7)**

### 由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

ps://codechina.csdn.net/m0_60958482/android_p7)**

### 由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

标签:cn,创建,TT,k3u1fbpfcp,线程,https,Android,image
来源: https://blog.csdn.net/m0_61072747/article/details/120177384

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有