
你说指的是手机运行内存还是存储内存?一般运行内存被占用的话,只需要重启一次手机就行了。就会把内存里战胜的程序全部清掉的,恢复到开机初始化状态。如果是存储内存被占用,只需要找出安装源文件,将它删除掉就行了。
获取apk。apk可以获取虚拟内存,所以adb设置手机虚拟内存是获取apk。adb的全称为AndroidDebugBridge,就是起到调试桥的作用,借助adb工具,可以管理设备或手机模拟器的状态。
3)查看进程列表:adb shell "ps",同时也能获取到应用的UID,方式如下(不需root权限):
u0_a开头的都是Android的应用进程,Android的应用的UID是从10000开始,到19999结束,可以在Processjava中查看到(FIRST_APPLICATION_UID和LAST_APPLICATION_UID),u0_a后面的数字就是该应用的UID值减去FIRST_APPLICATION_UID所得的值,所以,对于截图这个应用进程,它是u0_a155,按前面的规制,它的UID就是155 + FIRST_APPLICATION_UID = 10155。
VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
使用 adb shell "dumpsys meminfo -s <pakagename | pid>"命令,输出结果分以下4部分:
PS:在apk内调用运行获取其他app的内存数据则需要root权限
adb命令:adb shell dumpsys gfxinfo <package | pid>
正常情况下帧率应该在1667ms左右,1秒60帧,执行结果如下:
详细计算方法如下:
还有一个命令是: adb shell dumpsys SurfaceFlinger --latency LayerName
其中LayerName在各个不同系统中获取的命令是不一样的
在Android 6系统直接就是SurfaceView
在Android 7系统中可以通过 dumpsys window windows | grep mSurface | grep SurfaceView 然后通过数据截取到
在Android 8系统中可以通过 dumpsys SurfaceFlinger | grep android包名获取到
执行命令结果如下:
计算方法比较简单,一般打印出来的数据是129行(部分机型打印两次257行,但是第一部分是无效数据,取后半部分),取len-2的第一列数据为end_time,取len-128的第一列数据为start_time
fps = 127/((end_time - start_time) / 10000000)
至于为啥要取第一列数据,这里不做过多介绍,欢迎参看这两篇文章
老罗的文章SurfaceView原理
Android性能测试之fps获取
至于为啥要处于1000000,因为命令打印出来的是纳秒单位,要转为毫秒进行计算,127就是因为命令一次打印出来127帧的数据而已
有两种方法可以获取
1) adb shell "top -n 5 | grep <package | pid>" ,第三列就是实时监控的CPU占用率(-n 指定执行次数,不需root权限),这边top命令执行需要2到3s左右,一般可以采用busybox 的top命令执行,效率会快很多
2) adb shell "dumpsys cpuinfo | grep <package | pid>"
两种方法直接区别在于,top是持续监控状态,而dumpsys cpuinfo获取的实时CPU占用率数据
adb命令:adb shell "dumpsys batterystats < package | pid>" (Android 50后引入)
获取单个应用的耗电量信息,具体返回结果待研究
adb命令:adb shell "dumpsys battery"
出现信息解读:
AC powered:false 是否连接AC(电源)充电线
USB powered:true 是否连接USB(PC或笔记本USB插口)充电
Wireless powered:false 是否使用了无线电源
status: 1 电池状态,2为充电状态,其他为非充电状态
level:58 电量(%)
scale: 100 电量最大数值
voltage: 3977 当前电压(mV)
current now: -335232 当前电流(mA)
temperature:355 电池温度,单位为01摄氏度
adb 命令:adb shell "dumpsys< package | pid> | grep UID" [通过ps命令,获取app的UID(安装后唯一且固定)]
adb shell cat /proc/uid_stat/UID/tcp_rcv [cat为查看命令,读取tcp_rcv获取应用接收流量信息(设备重启后清零)]
adb shell cat /proc/uid_stat/UID/tcp_snd [cat为查看命令,读取tcp_snd获取应用发送流量信息(设备重启后清零)]
计算流量消耗步骤:
或者还有一种方式获取应用流量消耗:
首先判断类型:
cat /sys/class/thermal/thermal_zone/type
只有红框框出来的是有效的
cat /sys/class/thermal/thermal_zone/temp
获取CPU温度
dumpsys battery | grep temperature 单位01摄氏度
获取/proc/stat文件内容(无权限限制)
总的cpu时间片是 total = user+nice+system+idle+iowait+irq+softirq
忙碌时间为 notidle = user+nice+system +iowait+irq+softirq
cpu使用率计算方法为,先取开始的total值和忙碌时间notidle,隔一段时间片,再取一次计算total2,notidle2, cpuuse = (notidle2 – notidle) 100 / (total2 - total)%
PS:由于Android 8权限收紧,在Android 8系统手机内apk内读取文件内容为空,需要shell权限才可获取文件内容,下同
读/sys/devices/system/cpu/cpuX/cpufreq/scaling_cur_freq文件的值,X不定,看是几核手机,scaling_cur_freq是否存在也不一定,需要判断
至于为啥不取cpuinfo_cur_freq文件的值,原因是android 6,7系统获取的时候,这个文件shell没有读取权限,需要root权限
参考文章: >
准备的工具除了jdk还有以下内容(在Google官网都有):把apktool-install-windows-21_r01-1zip,dex2jar-007-SNAPSHOTzip
解压到一个盘的根目录下(这里我选择H盘),同时把
AXMLPrinter2jar,apktooljar
和你想解包的apk软件也放在同一个目录下,然后“运行--cmd”打开控制台,输入
cd /d h : /进入H盘的根目录然后输入以下内容(
控制台不要关,为了后面方便):其中apktooljar
是解包工具,d表示解包,
memoapk是我要解包的软件,
memo表示解包后输出到这个文件夹,等待片刻,就会生成memo文件夹,打开里面会有res文件夹下的所有文件和
AndroidManifestxml
,用记事本就可以查看了。
以上是获得xml文件和,下面获得里面的java源代码:用winRar或者好压打开memoapk
,截图如下:把里面的classesdex文件解压到H盘根目录下,然后重新打开控制台,输入
dex2jarbat classesdex
得到一个名为
classesdexdex2jarjar
的文件,此时用jd-guiexe打开classesdexdex2jarjar
就可以看到所有源代码了!
如果想把反编译好的文件变回apk文件,只要在控制台输入
apktooljar b memo就可以了其中b就是重新封包的意思,
memo是你刚才解包出来的文件夹,前提是确保所有文件都在memo文件夹里!!
以上就是关于安装APK失败后,手机内存依然被占用,求助全部的内容,包括:安装APK失败后,手机内存依然被占用,求助、adb设置手机虚拟内存、Android性能测试(内存、cpu、fps、流量、GPU、电量)——adb篇等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)