移动 前端 Python Android Java

辅助性能分析工具aapt systrace等

2020-09-15  本文已影响0人  zcwfeng

adb shell pm list packages -f 命令能获取到所有apk包所在目录

adb shell pm list packages -f | grep "top.zcwfeng.news"

不知道apk入口的时候可以用命令输出apk信息定位,利用aapt工具
aapt dump xmltree app-debug.apk AndroidManifest.xml

信息过多,优化
aapt dump xmltree app-debug.apk AndroidManifest.xml | find /n "android.intent.action.MAIN"

 debug git:(master) ✗ aapt dump xmltree app-debug.apk AndroidManifest.xml 
N: android=http://schemas.android.com/apk/res/android
  N: dist=http://schemas.android.com/apk/distribution
    E: manifest (line=2)
      A: android:versionCode(0x0101021b)=(type 0x10)0x1
      A: android:versionName(0x0101021c)="1.0" (Raw: "1.0")
      A: android:compileSdkVersion(0x01010572)=(type 0x10)0x1d
      A: android:compileSdkVersionCodename(0x01010573)="10" (Raw: "10")
      A: package="top.zcwfeng.news" (Raw: "top.zcwfeng.news")
      A: platformBuildVersionCode=(type 0x10)0x1d
      A: platformBuildVersionName=(type 0x10)0xa
      E: uses-sdk (line=8)
        A: android:minSdkVersion(0x0101020c)=(type 0x10)0x15
        A: android:targetSdkVersion(0x01010270)=(type 0x10)0x1d
      E: uses-permission (line=12)
        A: android:name(0x01010003)="android.permission.READ_EXTERNAL_STORAGE" (Raw: "android.permission.READ_EXTERNAL_STORAGE")
      E: uses-permission (line=13)
        A: android:name(0x01010003)="android.permission.INTERNET" (Raw: "android.permission.INTERNET")
      E: application (line=15)
        A: android:theme(0x01010000)=@0x7f100008
        A: android:label(0x01010001)=@0x7f0f001f
        A: android:icon(0x01010002)=@0x7f0d0000
        A: android:name(0x01010003)="top.zcwfeng.news.NewsApplication" (Raw: "top.zcwfeng.news.NewsApplication")
        A: android:debuggable(0x0101000f)=(type 0x12)0xffffffff
        A: android:testOnly(0x01010272)=(type 0x12)0xffffffff
        A: android:allowBackup(0x01010280)=(type 0x12)0xffffffff
        A: android:supportsRtl(0x010103af)=(type 0x12)0xffffffff
        A: android:networkSecurityConfig(0x01010527)=@0x7f120000
        A: android:roundIcon(0x0101052c)=@0x7f0d0001
        A: android:appComponentFactory(0x0101057a)="androidx.core.app.CoreComponentFactory" (Raw: "androidx.core.app.CoreComponentFactory")
        E: activity (line=27)
          A: android:theme(0x01010000)=@0x7f100142
          A: android:name(0x01010003)="top.zcwfeng.news.SplashActivity" (Raw: "top.zcwfeng.news.SplashActivity")
          E: intent-filter (line=30)
            E: action (line=31)
              A: android:name(0x01010003)="android.intent.action.MAIN" (Raw: "android.intent.action.MAIN")
            E: category (line=33)
              A: android:name(0x01010003)="android.intent.category.LAUNCHER" (Raw: "android.intent.category.LAUNCHER")
        E: activity (line=36)
          A: android:name(0x01010003)="top.zcwfeng.news.MainActivity" (Raw: "top.zcwfeng.news.MainActivity")
        E: provider (line=38)
          A: android:name(0x01010003)="com.billy.cc.core.component.remote.RemoteProvider" (Raw: "com.billy.cc.core.component.remote.RemoteProvider")
          A: android:exported(0x01010010)=(type 0x12)0xffffffff
          A: android:authorities(0x01010018)="top.zcwfeng.news.com.billy.cc.core.remote" (Raw: "top.zcwfeng.news.com.billy.cc.core.remote")
        E: activity (line=43)
          A: android:theme(0x01010000)=@0x01030010
          A: android:name(0x01010003)="com.billy.cc.core.component.remote.RemoteConnectionActivity" (Raw: "com.billy.cc.core.component.remote.RemoteConnectionActivity")
          A: android:exported(0x01010010)=(type 0x12)0xffffffff
          A: android:taskAffinity(0x01010012)="com.billy.cc.connection" (Raw: "com.billy.cc.connection")
          A: android:excludeFromRecents(0x01010017)=(type 0x12)0xffffffff
          E: intent-filter (line=49)
            E: action (line=50)
              A: android:name(0x01010003)="action.com.billy.cc.connection" (Raw: "action.com.billy.cc.connection")

运行adb shell am start -W 包名/主Activity全名带包名
查看 thistime totaltime waitertime

 zcw_android_demo git:(master) ✗ adb shell am start -W top.zcwfeng.news/top.zcwfeng.news.SplashActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=top.zcwfeng.news/.SplashActivity }
Status: ok
Activity: top.zcwfeng.news/.SplashActivity
ThisTime: 4516
TotalTime: 4516
WaitTime: 4584
Complete

systrace.py 常用的分析

sched: CPU调度的信息,非常重要;你能看到CPU在每个时间段在运行什么线程;线程调度情况,比如锁信息。
gfx:Graphic系统的相关信息,包括SerfaceFlinger,VSYNC消息,Texture,RenderThread等;分析卡顿非常依赖这个。
view: View绘制系统的相关信息,比如onMeasure,onLayout等;对分析卡顿比较有帮助。
am:ActivityManager调用的相关信息;用来分析Activity的启动过程比较有效。

systrace.py -t 10 -o ~zcw/Downloads/mytrace.html sched gfx view am -a com.example.myapplication

chrome://tracing/

systrace
功能: 分析UI卡顿问题
app启动流程
分析 锁性能

  1. 测试列表滑动, 桌面滑动等流畅性问题
    gfx input view

  2. 若在上面的基础上 还需要分析HWUI
    gfx input view hwui

  3. 测试app启动或者进入某个界面的速度
    gfx input view am wm res

  4. 怀疑有GC或者是IO导致的卡顿
    gfx input view dalvik disk

  5. 怀疑有power相关的问题
    gfx input view res am wm power

分析竞品和自家产品

systrace 查看线程状态
绿色:运行中
作用: 查看Running状态的线程,查看其运行的时间,与竞品做对比,分析快或者慢的原因

是否频率不够
是否跑在了小核上
是否在Running 与Runnable之间切换? 为什么? 
是否在Running 与Sleep之间切换? 为什么?检查io


蓝色:
作用:Runnable状态的线程持续时间越长,则表示cpu调度越忙,没有及时处理这个任务

是否后台有太多的任务在跑
是否频率太低
被限制某个具体的cpuset cpu很满?
此时Running状态的线程是哪个? 为什么? 

白色: 
作用: 一般都是在等待事情驱动 在互斥锁上被阻塞

橘色 不可中断的睡眠态? 一般都是线程在IO上被阻塞 或者等待磁盘操作 IO操作很慢
大量的橘色出现 表明 低内存状态


紫色: 可中断的睡眠态
线程在另一个内核上被阻塞  
有可能是正常的
也有可能是不正常的

Linux 进程状态:
D 无法中断的休眠状态 (IO 进程)
R 正在可运行队列中的
S 休眠状态
T 停止
W 内存交换
X 死掉的进程
Z 僵尸进程

假设 -》 验证 -》定位问题(缩小范围) -》 定位细节问题
systrace

Android 自带的控件 拼接 要这么多层
-》 自定义View绘制

然后用traceView 查看
https://www.jianshu.com/p/631536332ab0

现在可以用systrace 抓下冷启动的过程,用谷歌浏览器打开分析下掉帧的地方,然后找出耗时比较长的 在抓一段trace文件,用traceview具体分析是哪个地方耗时

查看非绿色的F标记

上一篇下一篇

猜你喜欢

热点阅读