「javaadb指令」java adb命令

博主:adminadmin 2022-12-17 23:06:06 74

今天给各位分享javaadb指令的知识,其中也会对java adb命令进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Android性能测试(内存、cpu、fps、流量、GPU、电量)——adb篇

3)查看进程列表:adb shell "ps",同时也能获取到应用的UID,方式如下(不需root权限):

u0_a开头的都是Android的应用进程,Android的应用的UID是从10000开始,到19999结束,可以在Process.java中查看到(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

正常情况下帧率应该在16.67ms左右,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) / 1000000.0)

至于为啥要取第一列数据,这里不做过多介绍,欢迎参看这两篇文章

老罗的文章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 5.0后引入)

获取单个应用的耗电量信息,具体返回结果待研究

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 电池温度,单位为0.1摄氏度

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 单位0.1摄氏度

获取/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权限

参考文章:

Android 6,7系统可执行

dumpsys window windows | grep "mCurrentFocus"

执行结果一般为类似:

mCurrentFocus=Window{81caaa5 u0 com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity}

按照一定规则把com.tencent.mobileqq提取出来即可

直接apk内读取文件即可,不需要shell权限(支持到Android8)

Gpu使用率获取:会得到两个值,(前一个/后一个)*100%=使用率

adb shell cat /sys/class/kgsl/kgsl-3d0/gpubusy

Gpu工作频率:

adb shell cat /sys/class/kgsl/kgsl-3d0/gpuclk

adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/cur_freq

Gpu最大、最小工作频率:

adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/max_freq

adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/min_freq

Gpu可用频率

adb shell cat /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies

adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies

Gpu可用工作模式:

adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_governors

Gpu当前工作模式:

adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/governor

「javaadb指令」java adb命令

ADB命令必须安装JDK吗

JDK在windows系统下的环境变量配置方法如下(Win7):

计算机- 属性-高级-环境变量, 在系统变量中

1. 新建 变量名:JAVA_HOME 变量值 C:\Program Files\Java\jdk1.7.0_11(以本机的jdk安装路径为准)

2. 新建 变量名:classpath 变量值 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

3.编辑变量名Path, 变量值添加:%JAVA_HOME%\bin;

以上配置完成后,保存。 运行cmd,在控制台中输入javac 回车, 如果没有提示命令语法错误,就证明配置OK!

设置adb的环境变量:

计算机- 属性-高级-环境变量, 在系统变量中

1. 新建 变量名:Android 变量值 C:\.....android SDK路径\sdk\platform-tools; C:\.....android SDK路径\sdk\tools;(以本机的android sdk安装路径为准)

2. 编辑变量名Path, 变量值添加:%android%;

如何在Java代码中调用adb命令

代码如下:

package com.symbio.ltp.adb;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.util.ArrayList;

import java.util.List;

import com.symbio.ltp.model.ConfigPropertiesData;

import com.symbio.ltp.util.Log;

public class ShellCommand {

private String name;

private Process process;

private BufferedWriter writer;

private BufferedReader reader;

private BufferedReader errorReader;

private ListString list;

private String[] returnValue;

public ShellCommand(String name) {

this.name = name;

}

public String getName() {

return name;

}

public Process getProcess() {

return process;

}

public BufferedWriter getOutputWriter() {

return writer;

}

public BufferedReader getInputReader() {

return reader;

}

public BufferedReader getErrorReader() {

return errorReader;

}

public boolean start(String cmd) {

try {

process = Runtime.getRuntime().exec(cmd);

writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));

reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

} catch (IOException e) {

Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());

return false;

}

return true;

}

public boolean exec(String cmd) {

String line;

try {

writer.write(cmd + "\n");

writer.flush();

while((line = reader.readLine()) != null) {

Log.debug(line);

if(line.equals(ConfigPropertiesData.ltp_success)) {

return true;

} else if(line.equals(ConfigPropertiesData.ltp_fail)) {

return false;

}

}

} catch (IOException e) {

Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());

return false;

}

return true;

}

public String [] execReturn(String cmd) {

String line;

list = new ArrayListString();

try {

writer.write(cmd + "\n");

writer.flush();

line = reader.readLine();

while((line = reader.readLine()) != null) {

if(line.length()0 !(line.startsWith("#"))){

Log.debug(line);

list.add(line);

if(line.equals(ConfigPropertiesData.ltp_success)) {

break;

} else if(line.equals(ConfigPropertiesData.ltp_fail)) {

break;

}

}

}

int size = list.size();

returnValue = new String[size];

for (int i = 0; i size; i++) {

returnValue[i] = list.get(i);

}

} catch (IOException e) {

Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());

return null;

}

return returnValue;

}

public void terminate() {

try {

writer.write(0x03);

writer.flush();

} catch (IOException e) {

Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());

}

}

}

如何查看Activity任务栈以及dumpsys

有两种实现方式:

第一种:自己手动写一个程序,通过系统提供的函数来打印任务栈顶的Activity名称来判断是否是同一个Activity:

如下:

[java] view plaincopy

ListRunningTaskInfo runningTasks = mActivityManager.getRunningTasks(5);

for (RunningTaskInfo runningTaskInfo : runningTasks) {

Log.v("taskInfo", runningTaskInfo.topActivity.toString());

}

以下是列表页的任务栈顶信息:

以下是详情页的任务栈顶信息:

很明显,两个页面不是同一个Activity.

第二种:通过adb shell dumpsys activity命令:

如下:

使用cmd启动adb shell:

E:\Android_Sdk\android-sdks\platform-toolsadb shell

shell@NX601J:/ $

使用命令dumpsys activity taskinfo.txt 命令 将打印出的结果输出到taskinfo.txt文件中,方便导出到电脑查看.

1.首先在磁盘的根目录建立一个taskinfo.txt的文件:

shell@NX601J:/storage/sdcard0 $ touch taskinfo.txt

2.然后通过命令将结果输出到这个文件中:

shell@NX601J:/storage/sdcard0 $ dumpsys activity /storage/sdcard0/taskinfo.txt

命令执行完成文件中就存入了各种任务信息(只截取了部分):

这个文件中存储了非常丰富的信息:

ACTIVITY MANAGER PENDING INTENTS (dumpsys activity intents)

ACTIVITY MANAGER CONTENT PROVIDERS (dumpsys activity providers)

ACTIVITY MANAGER SERVICES (dumpsys activity services)

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)

ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes)

Historical broadcasts [background]:

Running activities (most recent first):

Recent tasks:

通过字面意思就可以知道是什么吧?

找到我们想要的结果:

=================================================================

这样,通过执行俩次同样的操作就可以知道是否是同一个Activity了.

如何在android程序中执行adb shell命令

Android中执行adb shell命令的方式如下:pre t="code" l="java" /**

* 执行一个shell命令,并返回字符串值

*

* @param cmd

* 命令名称参数组成的数组(例如:{"/system/bin/cat", "/proc/version"})

* @param workdirectory

* 命令执行路径(例如:"system/bin/")

* @return 执行结果组成的字符串

* @throws IOException

*/

public static synchronized String run(String[] cmd, String workdirectory)

throws IOException {

StringBuffer result = new StringBuffer();

try {

// 创建操作系统进程(也可以由Runtime.exec()启动)

// Runtime runtime = Runtime.getRuntime();

// Process proc = runtime.exec(cmd);

// InputStream inputstream = proc.getInputStream();

ProcessBuilder builder = new ProcessBuilder(cmd);

InputStream in = null;

// 设置一个路径(绝对路径了就不一定需要)

if (workdirectory != null) {

// 设置工作目录(同上)

builder.directory(new File(workdirectory));

// 合并标准错误和标准输出

builder.redirectErrorStream(true);

// 启动一个新进程

Process process = builder.start();

// 读取进程标准输出流

in = process.getInputStream();

byte[] re = new byte[1024];

while (in.read(re) != -1) {

result = result.append(new String(re));

}

}

// 关闭输入流

if (in != null) {

in.close();

}

} catch (Exception ex) {

ex.printStackTrace();

}

return result.toString();

} android系统底层采用的是linux,所以adb这样的linux指令是可以在java代码中调用的,可以使用ProcessBuilder 这个方法来执行对应的指令。还可以通过如下方式执行:

pre t="code" l="java"Process p = Runtime.getRuntime().exec("ls");

String data = null;

BufferedReader ie = new BufferedReader(new InputStreamReader(p.getErrorStream()));

BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));

String error = null;

while ((error = ie.readLine()) != null

!error.equals("null")) {

data += error + "\n";

}

String line = null;

while ((line = in.readLine()) != null

!line.equals("null")) {

data += line + "\n";

}

Log.v("ls", data);

关于javaadb指令和java adb命令的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-17,除非注明,否则均为首码项目网原创文章,转载请注明出处。