几种方法获取设备信息:adb、反射
使用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.sdk | SDK 版本 |
ro.build.version.release | Android 系统版本 |
ro.build.version.security_patch | Android 安全补丁程序级别 |
ro.product.model | 型号 |
ro.product.brand | 品牌 |
ro.product.name | 设备名 |
ro.product.board | 处理器型号 |
ro.product.cpu.abilist | CPU 支持的 abi 列表 |
persist.sys.isUsbOtgEnabled | 是否支持 OTG |
dalvik.vm.heapsize | 每个应用程序的内存上限 |
ro.sf.lcd_density | 屏幕密度 |
假设:当我要查看设备的dns,但是不知道具体信息可以先过滤筛选出含有dns的信息在进行输出对应想要的结果
- 过滤dns
root@xxxx:/ # getprop | grep dns
[net.change]: [net.dns1]
[net.dns1]: [172.16.100.15]
- 输出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 | 线程数 |
VSS | Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) |
RSS | Resident 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
挂载的内存好像不是这样,后面再修改看看