性能优化常用到的adb技巧

您所在的位置:网站首页 安卓9build优化代码 性能优化常用到的adb技巧

性能优化常用到的adb技巧

2024-04-22 07:54| 来源: 网络整理| 查看: 265

adb命令是安卓开发经常会用到的命令之一,熟悉adb命令使用,往往能让我们开发达到事半功倍的效果。

结论

1.dumpsys meminfo适用场景: 查看进程的oom adj,或者dalvik/native等区域内存情况,或者某个进程或apk的内存情况,功能非常强大; 2.procrank适用场景: 查看进程的VSS/RSS/PSS/USS各个内存指标; 3.cat /proc/meminfo适用场景: 查看系统的详尽内存信息,包含内核情况; 4.free适用场景: 只查看系统的可用内存; 5.showmap适用场景: 查看进程的虚拟地址空间的内存分配情况; 6.vmstat适用场景: 周期性地打印出进程运行队列、系统切换、CPU时间占比等情况;

使用场景 1. 获取设备对进程限制

在低版本不限制,高版本已不可用命令:

adb shell cat /system/build.prop

在7.0系统上还可用,9.0、10.0均会提示没有权限,如下,即使添加sudo也没用。

zhouhao@zhouhaodeMacBook-Pro ~ % sudo adb shell cat /system/build.prop Password: cat: /system/build.prop: Permission denied

那我们想看当前设备的为每个进程分配了多少初始大小,最大占用内存大小,及开启最大内存申请后的极限大小呢?

查看单个应用程序最大内存限制的指令: adb shell getprop|grep heapgrowthlimit 应用启动后分配的初始内存,这个值是厂商定制,在系统启动时候可以设置参数控制, adb shell getprop|grep dalvik.vm.heapstartsize 单个 java 虚拟机最大的内存限制 adb shell getprop|grep dalvik.vm.heapsize

上面3条命令的结果如下,目前使用设备是华为P30pro,我们拿到这个结果可以做什么? 1.我们可以获取当前设备上的应用常规内存的限制,比如我现在是384M,当在开发过程中,超过这个值就很可能发生OOM; 2.manifest中设置了largeHeap=true之后,可以使用的最大内存值,但是Android官方建议应该努力减少内存的使用,最好是回收、复用 而不是去更大申请,因为越大,每次GC耗时更多,性能会下降。

zhouhao@zhouhaodeMacBook-Pro ~ % adb shell getprop|grep heapgrowthlimit [dalvik.vm.heapgrowthlimit]: [384m] zhouhao@zhouhaodeMacBook-Pro ~ % adb shell getprop|grep dalvik.vm.heapstartsize [dalvik.vm.heapstartsize]: [8m] zhouhao@zhouhaodeMacBook-Pro ~ % adb shell getprop|grep dalvik.vm.heapsize [dalvik.vm.heapsize]: [512m]

当然我们还可以使用以下方式在代码中获取:

ActivityManager am = (ActivityManager)MoEnvironment.getInstance().getContext().getSystemService(Context.ACTIVITY_SERVICE); am.getMemoryClass() 2.安卓对前后台是否可见对应用也有明确的划分,如果你的APP切到后台,并且不可见了,那么它会系统杀掉的概率也就大得多,使用ADB也能轻松查看到等级!

步骤1:先执行这个找到你自己APP对于的PID,

adb shell top

步骤2:执行这个命令可以查看,连上你的手机,试试切前台,切后台看看,当然这个数值越大,越容易被干掉。我个人理解有点像赏金猎人一样! oom_adj 【-16 到15 】 数字越小越不容易被杀, AMS 中 oom_scope_adj -1000。1000

adb shell cat /proc/29251/oom_adj //其中29251就是步骤1找到的对于的APP的进程号 image.png 3.查看某个进程的线程数,分析你的APP线程是否合理

在进入adb shell后可以执行ps命令 ,查看,之前我们的项目150M的大小,不管是自身的业务,还是第三方的业务肯定涉及到很多的线程、线程池,我们之前线上经常出现OOM,很多时候就是我们线程数过多,因为华为手机是单个进程的线程数也是有限制,毕竟这个线程资源是珍惜的。 执行以下命令,能看到你执行的进程里面到底有哪些线程在跑: 比如pool- 开头的就是线程池创建的,包括了binder的 Glide 的,以及网络ok的等等; 之前的项目就遇到一个比较诡异的问题,最终通过这种方式定位到第三方的每个请求,开了一个线程,下面两个还是有点区别。

列出了由进程号为的进程创建的所有线程。 $ ps -T -p 要让top输出某个特定进程并检查该进程内运行的线程状况 $ top -H -p 当然监控线程肯定不止这种方式,我这里大致提下:还可以使用AS自带的profiler,运行起来后点进GPU,里面左边一栏就能显示,缺点是没有排序! HWCLT:/ $ ps -T -p 29251 USER PID TID PPID VSZ RSS WCHAN ADDR S CMD u0_a1199 29251 29251 623 2688620 253520 0 0 S .paic.mo.+ u0_a1199 29251 29258 623 2688620 253520 0 0 S Jit threa+ u0_a1199 29251 29266 623 2688620 253520 0 0 S Signal Ca+ u0_a1199 29251 29268 623 2688620 253520 0 0 S HeapTaskD+ u0_a1199 29251 29269 623 2688620 253520 0 0 S Reference+ u0_a1199 29251 29270 623 2688620 253520 0 0 S Finalizer+ u0_a1199 29251 29271 623 2688620 253520 0 0 S Finalizer+ u0_a1199 29251 29273 623 2688620 253520 0 0 S Binder:29+ u0_a1199 29251 29274 623 2688620 253520 0 0 S Binder:29+ u0_a1199 29251 29282 623 2688620 253520 0 0 S Profile S+ u0_a1199 29251 29283 623 2688620 253520 0 0 S .paic.mo.+ u0_a1199 29251 29287 623 2688620 253520 0 0 S .paic.mo.+ u0_a1199 29251 29288 623 2688620 253520 0 0 S .paic.mo.+ u0_a1199 29251 29296 623 2688620 253520 0 0 S Thread-2 u0_a1199 29251 29299 623 2688620 253520 0 0 S DB_Thread u0_a1199 29251 29301 623 2688620 253520 0 0 S PALog-Wri+ u0_a1199 29251 29302 623 2688620 253520 0 0 S PALog-Exe+ u0_a1199 29251 29305 623 2688620 253520 0 0 S .paic.mo.+ u0_a1199 29251 29306 623 2688620 253520 0 0 S Binder:29+ u0_a1199 29251 29310 623 2688620 253520 0 0 S queued-wo+ u0_a1199 29251 29313 623 2688620 253520 0 0 S ...省略些 4. 查看内存、内存泄漏

我们也可以进入adb shell ,然后执行 dumpsys meminfo可以看到下面的信息,我删除了很多,太多了,重点看下这些:

zhouhao@zhouhaodeMacBook-Pro ~ % adb shell HWCLT:/ $ dumpsys meminfo Applications Memory Usage (in Kilobytes): Uptime: 87567669 Realtime: 124091566 Total PSS by process: 497,445K: com.paic.mo.client (pid 29251 / activities) 410,785K: com.tencent.mm (pid 7479 / activities) 384,717K: com.android.systemui (pid 2725) 356,569K: system (pid 1460) 285,256K: [email protected] (pid 644) 209,319K: com.paic.mo.client:push (pid 29388) 202,098K: com.paic.mo.client:QALSERVICE (pid 919) 202,073K: com.paic.mo.client:livepush (pid 29694) 178,759K: com.tencent.mm (pid 23493) 。。。。

我们直接执行包名看吧: 解释下属性:

HWCLT:/ $ dumpsys meminfo --package com.paic.mo.client Applications Memory Usage (in Kilobytes): Uptime: 88252204 Realtime: 124776101 ** MEMINFO in pid 919 [com.paic.mo.client:QALSERVICE] ** Pss Private Private SwapPss Heap Heap Heap Total Dirty Clean Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ ------ Native Heap 57727 57688 0 96 88576 85415 3160 Dalvik Heap 1408 1152 0 41 3548 1500 2048 Dalvik Other 136213 136208 0 6 Stack 40 40 0 0 Other dev 4 0 4 0 .so mmap 345 104 0 86 .jar mmap 81 0 0 0 .dex mmap 8 8 0 0 .oat mmap 248 0 0 0 .art mmap 1800 916 0 242 Other mmap 2205 2196 0 0 Unknown 1602 1572 0 13 TOTAL 202165 199884 4 484 92124 86915 5208 App Summary Pss(KB) ------ Java Heap: 2068 Native Heap: 57688 Code: 112 Stack: 40 Graphics: 0 Private Other: 139980 System: 2277 TOTAL: 202165 TOTAL SWAP PSS: 484 Objects Views: 0 ViewRootImpl: 0 AppContexts: 4 Activities: 0 Assets: 7 AssetManagers: 0 Local Binders: 6 Proxy Binders: 24 Parcel memory: 7 Parcel count: 30 Death Recipients: 0 OpenSSL Sockets: 0 WebViews: 0 SQL MEMORY_USED: 155 PAGECACHE_OVERFLOW: 19 MALLOC_SIZE: 117 DATABASES pgsz dbsz Lookaside(b) cache Dbname 4 20 32 1/19/2 /data/user/0/com.paic.mo.client/databases/aladdin.db ** MEMINFO in pid 29388 [com.paic.mo.client:push] ** Pss Private Private SwapPss Heap Heap Heap Total Dirty Clean Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ ------ Native Heap 5054 5012 0 55680 92672 88658 4013 Dalvik Heap 2327 2104 0 57 4387 2339 2048 Dalvik Other 19845 19844 0 117393 Stack 32 32 0 16 Ashmem 0 0 0 0 Other dev 4 0 4 0 .so mmap 501 36 4 141 .jar mmap 158 0 0 0 .dex mmap 0 0 0 8 .oat mmap 548 0 8 0 .art mmap 1894 996 0 236 Other mmap 221 88 8 2176 Unknown 593 564 0 1293 TOTAL 208177 28676 24 177000 97059 90997 6061 App Summary Pss(KB) ------ Java Heap: 3100 Native Heap: 5012 Code: 48 Stack: 32 Graphics: 0 Private Other: 20508 System: 179477 TOTAL: 208177 TOTAL SWAP PSS: 177000 Objects Views: 0 ViewRootImpl: 0 AppContexts: 6 Activities: 0 Assets: 7 AssetManagers: 0 Local Binders: 13 Proxy Binders: 29 Parcel memory: 13 Parcel count: 52 Death Recipients: 1 OpenSSL Sockets: 0 WebViews: 0 SQL MEMORY_USED: 642 PAGECACHE_OVERFLOW: 93 MALLOC_SIZE: 117 DATABASES pgsz dbsz Lookaside(b) cache Dbname 4 32 63 5717/25/8 /data/user/0/com.paic.mo.client/databases/paim_push_service.db 4 28 31 82/20/3 /data/user/0/com.paic.mo.client/databases/data_collect.db 4 28 38 25/21/4 /data/user/0/com.paic.mo.client/databases/mpush.db 4 20 32 87/19/2 /data/user/0/com.paic.mo.client/databases/aladdin.db ** MEMINFO in pid 29694 [com.paic.mo.client:livepush] ** Pss Private Private SwapPss Heap Heap Heap Total Dirty Clean Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ ------ Native Heap 1187 1156 0 56755 88576 85707 2868 Dalvik Heap 1568 1316 0 41 3704 1656 2048 Dalvik Other 21782 21780 0 114721 Stack 16 16 0 20 Other dev 4 0 4 0 .so mmap 257 24 0 149 .jar mmap 68 0 0 0 .dex mmap 0 0 0 8 .oat mmap 280 0 0 0 .art mmap 1692 816 0 326 Other mmap 49 48 0 2176 Unknown 308 280 0 1333 TOTAL 202740 25436 4 175529 92280 87363 4916 App Summary Pss(KB) ------ Java Heap: 2132 Native Heap: 1156 Code: 24 Stack: 16 Graphics: 0 Private Other: 22112 System: 177300 TOTAL: 202740 TOTAL SWAP PSS: 175529 Objects Views: 1 ViewRootImpl: 0 AppContexts: 4 Activities: 0 Assets: 7 AssetManagers: 0 Local Binders: 10 Proxy Binders: 24 Parcel memory: 8 Parcel count: 34 Death Recipients: 1 OpenSSL Sockets: 0 WebViews: 0 SQL MEMORY_USED: 312 PAGECACHE_OVERFLOW: 38 MALLOC_SIZE: 117 DATABASES pgsz dbsz Lookaside(b) cache Dbname 4 32 42 64/22/5 /data/user/0/com.paic.mo.client/databases/live_im_push_service.db 4 20 32 1/19/2 /data/user/0/com.paic.mo.client/databases/aladdin.db ** MEMINFO in pid 29251 [com.paic.mo.client] ** Pss Private Private SwapPss Heap Heap Heap Total Dirty Clean Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ ------ Native Heap 70996 70920 0 179444 356864 275747 81116 Dalvik Heap 18483 18280 0 268 24837 18628 6209 Dalvik Other 46449 46448 0 102641 Stack 44 44 0 240 Ashmem 4 4 0 0 Other dev 49 12 36 0 .so mmap 3289 1248 1160 2384 .jar mmap 381 0 32 0 .apk mmap 738 24 68 128 .dex mmap 1234 1188 36 5424 .oat mmap 1540 0 8 0 .art mmap 3557 2584 0 193 Other mmap 2050 772 188 2176 GL mtrack 30848 30848 0 0 Unknown 10215 10208 0 13498 TOTAL 496273 182580 1528 306396 381701 294375 87325 App Summary Pss(KB) ------ Java Heap: 20864 Native Heap: 70920 Code: 3764 Stack: 44 Graphics: 30848 Private Other: 57668 System: 312165 TOTAL: 496273 TOTAL SWAP PSS: 306396 Objects Views: 1063 ViewRootImpl: 2 AppContexts: 15 Activities: 3 Assets: 12 AssetManagers: 0 Local Binders: 111 Proxy Binders: 51 Parcel memory: 69 Parcel count: 285 Death Recipients: 2 OpenSSL Sockets: 0 WebViews: 0 SQL MEMORY_USED: 7721 PAGECACHE_OVERFLOW: 3951 MALLOC_SIZE: 117 DATABASES pgsz dbsz Lookaside(b) cache Dbname 4 32 65 1155/25/8 /data/user/0/com.paic.mo.client/databases/paim_push_service.db 4 28 107 359/67/13 /data/user/0/com.paic.mo.client/files/SkyEyeHRXskyEye.db 4 36 30 3/23/2 /data/user/0/com.paic.mo.client/databases/pa_b_permission.db 4 36 109 173/54/24 /data/user/0/com.paic.mo.client/databases/tes_db 4 20 81 2/25/5 :memory: 4 28 78 452/24/7 /data/user/0/com.paic.mo.client/databases/data_collect.db 4 44 24 0/27/2 /data/user/0/com.paic.mo.client/databases/pajk_hm_run_room.db 4 12 0/0/0 (attached) temp 4 44 46 1/16/2 /data/user/0/com.paic.mo.client/databases/pajk_hm_run_room.db (2) 4 36 30 11/25/2 /data/user/0/com.paic.mo.client/databases/group_meeting.db 4 28 32 8/20/3 /data/user/0/com.paic.mo.client/databases/mpush.db 4 1904 109 4833/193/25 /data/user/0/com.paic.mo.client/databases/ims.db 4 72 36 3/23/4 /data/user/0/com.paic.mo.client/databases/hrxapp 4 24 33 3/26/4 /data/user/0/com.paic.mo.client/databases/tz_http_cookie.db 4 24 60 3/19/4 /data/user/0/com.paic.mo.client/databases/tz_http_cookie.db (2) 4 2960 109 1107/423/25 /data/user/0/com.paic.mo.client/databases/user_db_GEYDCMBQGAYDAMBSHE3TOOJYGUZA====.db 4 28 108 108/70/16 /data/user/0/com.paic.mo.client/files/SkyEyeskyEye.db 4 32 42 66/22/5 /data/user/0/com.paic.mo.client/databases/live_im_push_service.db 4 20 28 5/19/2 /data/user/0/com.paic.mo.client/databases/account_kick.db 4 20 41 17/21/4 /data/user/0/com.paic.mo.client/databases/aladdin.db 4 24 42 14/51/7 /data/user/0/com.paic.mo.client/databases/tbsbeacon_db_com.paic.mo.client 4 24 33 2/17/2 /data/user/0/com.paic.mo.client/databases/tbsbeacon_db_com.paic.mo.client (4) 4 24 58 26/19/5 /data/user/0/com.paic.mo.client/databases/tbsbeacon_db_com.paic.mo.client (3) 4 60 109 64/30/13 /data/user/0/com.paic.mo.client/databases/bugly_db_ HWCLT:/ $ 1.上面会显示你APP的所有进程的数据,一般我们逐个分析;一般关注 DalvikHeap 总的, Dirty 清空可以释放多少 Heap size 堆上用了多少, 剩下多少 一些不是那么重要的

1.查看当前手机内存大小,比如我买的手机是6G内存的,可用的780M,不够了总有应用会被回收的!

adb shell cat /proc/meminfo

效果如下:

image.png

2.启动activity

adb shell am start -n /.

3、获得应用的启动时间,可以很方便地获取应用的启动时间

adb shell am start -W /.

4.日志相关:

adb logcat > c:\test.log //将日志保存到文件test.log

5.数据库相关

数据库的操作和今天的主题关系不大,增删改查操作不再列举。但是平时的开发过程中只是查看数据库中某个表或者某个字段,也无需每次都pull出来之后再查看,用命令行会更加方便快捷,进入到test.db的目录后,运行如下命令

sqlite3 test.db

6.查看手机sdk版本

adb shell getprop | grep version

7、查看手机型号信息

adb shell getprop | grep product 运行此命令之后,能看到product,board,brand和cpu等等的型号

8.查看屏幕分辨率

zhouhao@zhouhaodeMacBook-Pro ~ % adb shell wm size Physical size: 1080x2240

9.获取单个应用的电量消耗信息

adb shell dumpsys batterystats > > xxx.txt

这个一般用的少,还是要用adb bugreport 然后使用google 的battery histogram分析

10、获得应用的启动时间,可以很方便地获取应用的启动时间

adb shell am start -W /.


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3