辅助性能分析工具aapt systrace等
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
systrace
功能: 分析UI卡顿问题
app启动流程
分析 锁性能
-
测试列表滑动, 桌面滑动等流畅性问题
gfx input view -
若在上面的基础上 还需要分析HWUI
gfx input view hwui -
测试app启动或者进入某个界面的速度
gfx input view am wm res -
怀疑有GC或者是IO导致的卡顿
gfx input view dalvik disk -
怀疑有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标记