Android Studio的代码笔记--adb shell的常用命令:获取设备信息、反射获取设备信息、获取设备内存等

本文介绍通过adb命令和反射机制获取Android设备的各种信息,包括设备属性、进程、资源占用情况、内存信息、CPU信息等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用adb命令,返回结果

/**
 * adb shell 下的命令都可以直接用
 * @lxh 例如 "getprop ro.serialno"
 * @param command
 * @return back
 */
public String shell_(String command){
        Process cmdProcess = null;
        BufferedReader reader = null;
        String back = "";
        try {
            cmdProcess = Runtime.getRuntime().exec(command);
            reader = new BufferedReader(new InputStreamReader(cmdProcess.getInputStream()));
            back = reader.readLine();
            Log.i("LXH","命令:"+command+"     结果输出:"+back);
            return back;
        } catch (IOException e) {
            return null;
        } finally{
            try {
                reader.close();
            } catch (IOException e) {
            }
            cmdProcess.destroy();
        }
    }
I/LXH: 命令:getprop ro.serialno     结果输出:xxx

adb shell 命令

Android的内核本身就是Linux

查看设备信息常用命令

1)查看设备的全部信息

root@Hi3798MV200H:/ # getprop
[STBHWVER]: [08.76.xx.xx]	硬件版本号
[persist.sys.hardversion]: [08.76.xx.xx]
[STBSWVER]: [00.00.00.01]	软件件版本号
[persist.sys.softversion]: [00.00.00.01]
[STBMAC]: [A8:F4:70:9C:xx:xx]	
[ro.mac]: [A8:F4:70:9C:xx:xx]
[ro.boot.mac]: [A8:F4:70:9C:xx:xx]
[STBMANUID]: [08]
[STBSN]: [0876xxxxxx101000xxxx]	设备序列号
[ro.product.serialno]: [0876xxxxxx01000xxxx]
[ro.serialno]: [0876xxxxxx01000xxxx]
[ro.boot.serialno]: [0876xxxxxx01000xxxx]
[STBSWPRO]: [NEWxxxx]	制造厂商
[ro.product.manufacturer]: [NEWxxxx]
[ro.build.product]: [xxxxxxMV310]
[ro.product.device]: [xxxxxxMV310]
[ro.product.name]: [xxxxxxMV310]
[ro.product.mem.size]: [1g]
[ro.product.model]: [NL-xxxx]

2)查看设备属性信息:getprop <属性名>

root@xxxx:/ # getprop ro.serialno
0876xxxxxx01000xxxx
root@xxxx:/ # getprop ro.build.version.release
4.4.2
属性名含义
ro.build.version.sdkSDK 版本
ro.build.version.releaseAndroid 系统版本
ro.build.version.security_patchAndroid 安全补丁程序级别
ro.product.model型号
ro.product.brand品牌
ro.product.name设备名
ro.product.board处理器型号
ro.product.cpu.abilistCPU 支持的 abi 列表
persist.sys.isUsbOtgEnabled是否支持 OTG
dalvik.vm.heapsize每个应用程序的内存上限
ro.sf.lcd_density屏幕密度

假设:当我要查看设备的dns,但是不知道具体信息可以先过滤筛选出含有dns的信息在进行输出对应想要的结果

  1. 过滤dns
root@xxxx:/ # getprop | grep dns
[net.change]: [net.dns1]
[net.dns1]: [172.16.100.15]
  1. 输出net的dns1
root@xxxx:/ # getprop net.dns1
172.16.100.15

3)查看进程

root@xxxx:/ # ps
USER     PID   PPID  VSIZE  RSS     WCHAN    PC        NAME
root      1     0     9412   980   00000000 08073a60 S /init
root      2     0     0      0     00000000 00000000 S kthreadd
列名含义
USER所属用户
PID进程 ID
PPID父进程 ID
NAME进程名

4)查看实时资源占用情况

root@xxxx:/ # top
  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
    7  1   0% S     1      0K      0K  fg root     rcu_preempt
 1530  0   0% S    75 1633276K 104552K  fg system   system_server
列名含义
PID进程 ID
PR优先级
CPU%当前瞬间占用 CPU 百分比
S进程状态(R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
#THR线程数
VSSVirtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSSResident Set Size 实际使用物理内存(包含共享库占用的内存)
PCY调度策略优先级,SP_BACKGROUND/SPFOREGROUND
UID进程所有者的用户 ID
NAME进程名

5)查看内存信息

root@xxxx:/ # cat /proc/meminfo
MemTotal:        1048576 kB
MemFree:          305844 kB
MemAvailable:     418124 kB
...

6)查看cpu信息

root@xxxx:/ # cat /proc/cpuinfo
processor       : 0
Processor       : ARMv7 Processor rev 4 (v7l)
...

7)重启、关机、关闭、开启

shutdown、shutdown、stop、start

root@xxxx:/ # reboot
E:\Android\androidwork1012\xxx>adb shell
root@xxxx:/ #

命令行提示符是 $ 则表示没有 root 权限,是 # 则表示已 root

8)屏幕密度

root@xxxx:/ # wm density
Physical density: 160

9)屏幕分辨率 px

root@xxxx:/ # wm size
Physical size: 1280x720

10)显示屏幕参数

root@xxxx:/ # dumpsys window displays
WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
  Display: mDisplayId=0
    init=1280x720 160dpi cur=1280x720 app=1280x720 rng=720x720-1280x1280
    layoutNeeded=false
  StackBox #0
    mParent=null
    mBounds=[0,0][1280,720] mVertical=false layoutNeeded=true

init 是初始分辨率和屏幕密度

11)电池状况

root@Hi3798MV200H:/ # dumpsys battery
Current Battery Service state:
  AC powered: false
  USB powered: false
  Wireless powered: false
  status: 1
  health: 1
  present: true
  level: 0
  scale: 100
  voltage: 0
  temperature: 0
  technology:

scale 最大电量,level 当前电量

12)查看内核日志

root@Hi3798MV200H:/ # dmesg
<6>Booting Linux on physical CPU 0x0
<6>Initializing cgroup subsys cpu

adb shell 命令相关

命令功能
cat显示文件内容
cd切换目录
chmod改变文件的存取模式/访问权限
df查看磁盘空间使用情况
grep过滤输出
kill杀死指定 PID 的进程
ls列举目录内容
mount挂载目录的查看和管理
mv移动或重命名文件
ps查看正在运行的进程
rm删除文件
top查看进程的资源占用情况

关于Android adb shell命令有参考link.
ADB Usage Complete / ADB 用法大全

反射android.os.SystemProperties的get,返回结果

		/**
     * 反射 android.os.SystemProperties
     * @lxh 例如 "ro.serialno"
     * @param com
     * @return back
     */
    public String get_reflex(String com) {
        String back = null;
        try {
            Class<?> cls = Class.forName("android.os.SystemProperties");//forName(包名.类名)
            Method get = cls.getMethod("get", String.class);//获取get方法
            back = (String) get.invoke(cls, com);//设置调用get的对象和传入get的值
        } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
        Log.i("LXH","反射:"+com+"     结果输出:"+back);
        return back;
    }
I/LXH: 命令:ro.serialno     结果输出:xxx

关于反射这篇可以参考理解一下:Android 反射机制的理解

获取设备内存

Environment.MEDIA_MOUNTED等同于"mounted"

	String root_all;String root_avi;String root_end;
    String sdcard_all;String sdcard_avi;String sdcard_end;
    public void get_Environmentsize(){
        //File root = Environment.getRootDirectory();//系统内部空间
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            File sdcardDir = Environment.getExternalStorageDirectory();
            StatFs sf1 = new StatFs(sdcardDir.getPath());
            long blockSize1 = sf1.getBlockSize();
            long blockCount1 = sf1.getBlockCount();
            long availCount1 = sf1.getAvailableBlocks();
            sdcard_all=Formatter.formatFileSize(this, blockSize1*blockCount1);
            sdcard_avi= Formatter.formatFileSize(this, availCount1*blockSize1);
            sdcard_end = Formatter.formatFileSize(this, (blockCount1-availCount1)*blockSize1);
            Log.d("LXH", "getExternalStorageDirectory的block数目:"+blockCount1+",总大小:"+blockSize1*blockCount1/1024+"KB");
            Log.d("LXH", "block大小:"+blockSize1+",可用的block数目::"+availCount1+",可用大小:"+availCount1*blockSize1/1024+"KB");
            Log.i("LXH", "挂载内存总共:"+sdcard_all+"    剩余:"+sdcard_end);
            File root = Environment.getDataDirectory();//机身内存
            StatFs sf = new StatFs(root.getPath());
            long blockSize = (long)sf.getBlockSize();
            long blockCount = (long)sf.getBlockCount();
            long availCount = (long)sf.getAvailableBlocks();
            root_all = Formatter.formatFileSize(this, blockCount * blockSize);
            root_avi = Formatter.formatFileSize(this, availCount * blockSize);
            root_end = Formatter.formatFileSize(this, (blockCount-availCount) * blockSize);
            Log.i("LXH", "getDataDirectory的block数目:"+blockCount+",总大小:"+blockSize*blockCount/1024+"KB");
            Log.i("LXH", "block大小:"+blockSize+",可用的block数目:"+availCount+",可用大小:"+availCount*blockSize/1024+"KB");
            Log.i("LXH", "机身内存总共:"+root_all+"    剩余:"+root_end);
        }else{
            sdcard_all="未装载";sdcard_avi="未装载";sdcard_end="未装载";
        }
    }
    String totalRamSize;
    public void get_RamSize() {
        String usedRamSize = "0.00B";
        totalRamSize = "0.00B";//总内存
        long initial_memory = 0;
        try {
            BufferedReader localBufferedReader = new BufferedReader(new FileReader("/proc/meminfo"), 8192);
            String[] arrayOfRam = localBufferedReader.readLine().split("\\s+");
            initial_memory = (long) (Integer.valueOf(arrayOfRam[1]).intValue() * 1024);
            localBufferedReader.close();
        } catch (IOException e) {
        }
        if (initial_memory <= 1262485504) {
            initial_memory = 1073741824;
        } else if (initial_memory <= 2524971008L) {
            initial_memory = 2147483648L;
        }
        totalRamSize = Formatter.formatFileSize(this, initial_memory);
        Log.d("LXH", "总内存:" + totalRamSize);
    }
I/LXH: getExternalStorageDirectory的block数目:58360,总大小:233440KB
I/LXH: block大小:4096,可用的block数目::28358,可用大小:113432KB
I/LXH: 挂载内存总共:228MB    剩余:117MB
I/LXH: getDataDirectory的block数目:63480,总大小:253920KB
I/LXH: block大小:4096,可用的block数目:33478,可用大小:133912KB
I/LXH: 机身内存总共:248MB    剩余:117MB
I/LXH: 总内存:1.00GB

挂载的内存好像不是这样,后面再修改看看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值