1. 构造一个会产生死锁的代码如下:

MainActivity.java

package com.sunmi.lock;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button button = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = findViewById(R.id.button);button.setOnClickListener(this);}@Overridepublic void onClick(View view) {DieLockDemo.run("hello");}
}

DieLockDemo.java

package com.sunmi.lock;import android.util.Log;/*** 定义死锁任务*/
class DieLockThread extends Thread {/*** 此变量已经不是共享数据了,因为:*              DieLockThread extends Thread*              new DieLockThread().start();*              new DieLockThread().start();** 所以:Thread-0有自己的flag     Thread-1也有自己的flag*/private boolean flag;private String TAG="Jon";public DieLockThread(boolean flag) {this.flag = flag;}@Overridepublic void run() {int i = 0;int j = 0;if (flag) {while (true) {synchronized (Lock.LOCK1) // 使用第一把锁?{synchronized (Lock.LOCK2) // 使用第二把锁?{Log.e(TAG,"thread : " + Thread.currentThread().toString() + ", cnt: " + i++ );}}}} else {while(true) {Log.e(TAG,"thread : " + Thread.currentThread().toString() + ", cnt: " + j++ );synchronized (Lock.LOCK2) // 使用第二把锁?{synchronized (Lock.LOCK1) // 使用第一把锁?{Log.e(TAG,"thread : " + Thread.currentThread().toString() + ", cnt: " + j++ );}}}}}
}/*** 定义两把锁?*/
class Lock {public final static Object LOCK1 = new Object();public final static Object LOCK2 = new Object();
}public class DieLockDemo {public static void run(String args) {new DieLockThread(true).start();new DieLockThread(false).start();}}

如上在触发Button后一段时间内,必然会导致死锁。我们下面用systrace捕获一下。

2. systrace捕获异常
需要先进入Android Sdk的目录:

sdk\platform-tools\systrace\

之后先执行下面的指令,随后立刻按下button触发测试demo

python systrace.py -t 3 dalvik -a com.sunmi.lock


搜集到异常信息后,使用chrome应用打开trace.html
需要先在chrome地址栏中输入”chrome:tracing”再打开traceing

将绿色区域放大看看

systrace非常直接的告知了你锁异常,DieLockDemo.java的37行和50行发生了死锁。

3. 缺陷:
这个工具无法在异常发生后,帮你定位问题,而是需要在异常发生前就需要启动systrace收集信息。由于笔者也是初次接触这个工具,也许有更好的方法也未可知。

如何利用systrace分析Android App的死锁问题相关推荐

  1. 利用Appium对Android App进行测试

    文章目录 前言 一.软件 二.环境配置 1.安装node.js (Appium 1.11以上版本不需要安装此环境) 2.Android虚拟手机和Java环境 3.安装Appium 4.测试项目的创建 ...

  2. android内存占用分析,Android App性能评测分析-内存篇

    1.内存了解 在Android App的性能优化的各个部分里,内存方面的知识较多且不易理解,内存的问题绝对是最令人头疼的一部分,需要对内存基础知识.内存分配.内存管理机制等非常熟悉,才能排查问题. 1 ...

  3. android启动分析,Android APP启动方式、启动流程及启动优化分析

    本文章向大家介绍Android app应用启动的一些相关知识,包括app启动方式.app启动流程和app启动优化等知识! app应用启动方式 1.冷启动 当启动应用时,后台没有该应用的进程,这时系统会 ...

  4. 利用Frida绕过Android App(途牛apk)的SSL Pinning

    0x00 前言 做APP测试过程中,使用burp无法抓到数据包或提示网络错误可能是因为APP启用了SSL Pinning,刚好最近接触到途牛apk就是这种情况,于是便有了本文. 0x01 SSL Pi ...

  5. 大数据随记 —— 利用Python分析快手APP全国大学生用户数据(2022 年初赛第四题 )

    大数据系列文章:

  6. 分析启动耗时 android,Android app启动耗时分析

    首先编译你的程序,打开Android Studio里面的Android Monitor,找到下图的按钮 <img src="//bbsm ...

  7. Android App签名(证书)校验过程源码分析

      Android App安装是需要证书支持的,我们在Eclipse或者Android Studio中开发App时,并没有注意关于证书的事,也能正确安装App.这是因为使用了默认的debug证书.在A ...

  8. Android app应用开发高级进阶系列专栏解读

    1.前言 在从事android app开发的几年里,最开始接触做android 都是从app开发开始做的,在做app的这几年中把积累下来的做的一些功能,都整理出来了作为自己的技术资料,在以后开发类似的 ...

  9. Android APP性能分析工具大全

    目录 官方推荐工具 第三方工具 一,官方工具 1.1,TraceView 1.2,StrictMode 1.3,Systrace 1.4,Hierarchy Viewer 1.5,AndroidStu ...

  10. Android APP性能分析方法及工具

    近期读到<Speed up your app>一文.这是一篇关于Android APP性能分析.优化的文章.在这篇文章中,作者介绍他的APP分析优化规则.使用的工具和方法.我觉得值得大家借 ...

最新文章

  1. 待办事项优先级 开发_如何通过创建主题待办事项确定学习内容的优先级
  2. Hadoop + MapReduce 端口自定义配置
  3. 记录JS报错Cannot set property ‘onclick/xxx‘ of null
  4. 网管型工业交换机和 非网管型工业交换机的优缺点
  5. Android Drawable文件夹对应像素密度
  6. axios请求失败重新发起请求_axios请求超时,设置重新请求的完美解决方法
  7. 【医疗影像处理】使用GMM分割3D T1得到wm/gm/csf/background
  8. uniapp H5页面 点击图片放大预览
  9. 集成测试之自顶向下、自底向上、三明治集成
  10. FANUC机器人的主板结构和电缆连接示意图介绍
  11. 如何为你的网站植入广告,赚取收益呢GoogleAdsense首选
  12. c语言数组124048,根据GPS经纬度判断当前所属的市区
  13. windows双系统如何删除ubuntu系统并重装
  14. 携手互联网企业10巨头设VC基金
  15. Python 爬虫教学网站
  16. java查询数据库方法show create
  17. 计算机考研817,2017年南京工业大学计算机科学与技术学院817信号系统与数字电路考研题库...
  18. Python学习笔记-文件,CSV,序列化反序列化及应用
  19. snprintf用法
  20. Sketch装机必备!10款Sketch 插件使用率超高!

热门文章

  1. linux源码中的核心数据结构
  2. 基于Windows字库的点阵数据提取方法
  3. CCF 201412-4 最优灌溉
  4. initwithcoder和 initwithframe 区别?
  5. 学习之路十四:客户端调用WCF服务的几种方法小议
  6. RailsCasts中文版,#15 Fun with Find Conditions 使用hash为查询条件以便生成正确语法的SQL查询...
  7. C# 将数据导出到Excel汇总(转)
  8. jupyter notebook怎么画决策树图_状态图怎么画?图文详解快速上手UML图
  9. Grails 基础环境搭建及HelloWorld
  10. mybatis spring maven