| plugState | String | 电池充电状态 |
| health | String | 电池健康 |
| present | String | 是否有电池 |
| technology | String | 电池技术制造 |
| temperature | String | 电池温度 |
| voltage | String | 电池电压 |
| power | String | 电池总电量 |
Cpu 实时数据采集
代码示例
CpuInternals.getInstance().getCpuSampler().start();
CpuInternals.getInstance().getCpuSampler().getCpuList();
CpuInternals.getInstance().getCpuSampler().stop();
获取蓝牙数据
代码示例
BluetoothHelper.mobGetMobBluetooth(getApplicationContext())
数据格式
{
“bluetoothAddress”:"$unknown",
“isEnabled”:“true”,
“device”:[
{
“name”:“iPhone”,
“address”:“E4:9A:79:89:C7:24”,
}
],
“phoneName”:“Honor”
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| bluetoothAddress | String | 蓝牙地址 |
| isEnabled | String | 蓝牙是否打开 |
| device | JSONArray | 连接手机的信息 |
| name | String | 蓝牙地址连接手机 |
| address | String | 蓝牙名称连接手机 |
| phoneName | String | 手机设置的名称 |
系统 Build 数据获取
代码示例
BuildHelper.mobGetBuildInfo()
数据格式
{
“board”:“STF”,
“bootloader”:“unknown”,
“brand”:“HONOR”,
“device”:“HWSTF”,
“display”:“STF-AL00 8.0.0.360(C00GT)”,
“fingerprint”:“HONOR/STF-AL00/HWSTF:8.0.0/HUAWEISTF-AL00/360(C00GT):user/release-keys”,
“hardware”:“hi3660”,
“host”:“WUH1000129106”,
“id”:“HUAWEISTF-AL00”,
“manufacturer”:“HUAWEI”,
“model”:“STF-AL00”,
“product”:“STF-AL00”,
“radio”:“21C30B323S006C000,21C30B323S006C000”,
“serial”:“8BN0217901012695”,
“tags”:“release-keys”,
“time”:“1553851883000”,
“type”:“user”,
“user”:“test”,
“osVersion”:“HONOR/STF-AL00/HWSTF:8.0.0/HUAWEISTF-AL00/358(C00GT):user/release-keys”,
“releaseVersion”:“8.0.0”,
“codeName”:"$unknown",
“incremental”:“360(C00GT)”,
“sdkInt”:“26”,
“previewSdkInt”:“0”,
“securityPatch”:“2019-04-05”
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| board | String | 主板名称 |
| bootloader | String | 系统引导程序版本号 |
| brand | String | 系统定制商 |
| device | String | 设备参数 |
| display | String | 显示屏参数 |
| fingerprint | String | 硬件名 |
| hardware | String | 内核命令行中的硬件名 |
| host | String | host |
| manufacturer | String | 硬件厂商 |
| model | String | 版本 |
| product | String | 手机厂商 |
| radio | String | 无线电固件版本字符串 |
| serial | String | 获取硬件序列号 |
| tags | String | 描述 Build 的标签 |
| time | String | time |
| type | String | type |
| user | String | user |
| osVersion | String | os 版本 |
| releaseVersion | String | 版本 |
| codeName | String | 目前开发代码名称 |
| incremental | String | 基本源代码控件用于表示构建的内部值 |
| sdkInt | String | SDK 的版本 |
| previewSdkInt | String | SDK 的预览版本 |
| securityPatch | String | 用户可见的安全补丁程序级别 |
摄像头数据获取
代码示例
CameraHelper.getCameraInfo(getApplicationContext())
数据格式
{
“cameraInfo”:[
{
“cameraFacing”:“back”,
“cameraLevel”:“limited”,
“cameraFlashInfo”:“true”,
“outputFormats”:[
“raw_sensor”,
“jpeg”,
“private”,
“yuv_420_888”,
“depth16”
]
}
]
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| cameraInfo | JSONArray | 摄像头信息 |
| cameraFacing | String | 摄像头的位置 |
| cameraLevel | String | 相机支持水平 |
| cameraFlashInfo | String | 是否有闪光灯 |
| outputFormats | JSONArray | 相机支持的格式 |
Cpu 数据获取
代码示例
CpuHelper.mobGetCpuInfo()
数据格式
{
“cpuName”:“0”,
“cpuFreq”:“1844000KHZ”,
“cpuMaxFreq”:“1844000KHZ”,
“cpuMinFreq”:“533000KHZ”,
“cpuHardware”:“hi3660”,
“cpuCores”:“8”,
“cpuTemp”:“36℃”,
“cpuAbi”:“arm64-v8a,armeabi-v7a,armeabi”
}
| 数据键 | 数据类型| 数据解释 |
| — | — | — |
| cpuName | String | CPU 名字 |
| cpuFreq | String | CPU 频率 |
| cpuMaxFreq | String | CPU 最大频率 |
| cpuMinFreq | String | CPU 最小频率 |
| cpuHardware | String | CPU 硬件名 |
| cpuCores | String | CPU 核数 |
| cpuTemp | String | CPU 温度 |
| cpuAbi | String | CPU 架构 |
调试数据获取
代码示例
DebugHelper.getDebuggingData(getApplicationContext())
数据格式
{
“isOpenDebug”:“true”,
“isDebugVersion”:“true”,
“isDebugging”:“false”,
“isReadProcStatus”:“false”,
“isAllowMockLocation”:“false”
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| isOpenDebug | String | 是否开启了调试模式 |
| isDebugVersion | String | 是否是 Debug 版本 |
| isDebugging | String | 是否正在调试 |
| isReadProcStatus | String | 读取 id 判断是否在调试 |
| isAllowMockLocation | String | 是否打开位置模拟 |
host 数据获取
代码示例
DnsHelper.mobDNS(“ip”)
模拟器数据获取
代码示例
EmulatorHelper.mobCheckEmulator(getApplicationContext())
数据格式
{
“checkBuild”:“false”,
“checkPkg”:“false”,
“checkPipes”:“false”,
“checkQEmuDriverFile”:“false”,
“checkHasLightSensorManager”:“false”,
“checkCpuInfo”:“false”
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| checkBuild | String | build |
| checkPkg | String | 包名修改 |
| checkPipes | String | 管道检测 |
| checkQEmuDriverFile | String | 驱动程序检测 |
| checkHasLightSensorManager | String | 光传感器检测 |
| checkCpuInfo | String | cpu 架构检测 |
hook 数据获取
代码示例
HookHelper.isXposedHook(getApplicationContext())
数据格式
{
“xposedInfo”:{
“checkXposedPackage”:“false”,
“checkXposedHookMethod”:“false”,
“checkXposedJars”:“false”,
“checkClassLoader”:“false”,
“checkNativeMethod”:“false”,
“checkSystem”:“false”,
“checkExecLib”:“false”,
“checkCheckman”:“false”,
“checkXposedBridge”:“false”
},
“substrateInfo”:{
“checkSubstratePackage”:“false”,
“checkSubstrateHookMethod”:“false”,
“checkSubstrateJars”:“false”
},
“fridaInfo”:{
“checkRunningProcesses”:“false”,
“checkFridaJars”:“false”
}
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| xposedInfo | JSONObject | Xposed 信息 |
| checkXposedPackage | String | 包名检测 |
| checkXposedHookMethod | String | 检测调用栈中的可疑方法 |
| checkXposedJars | String | 检测内存中可疑的 jars |
| checkClassLoader | String | 检测载入 Xposed 工具类 |
| checkNativeMethod | String | 判断系统方法调用钩子 |
| checkSystem | String | 虚拟检测 Xposed 环境 |
| checkExecLib | String | 寻找 Xposed 运行库文件 |
| checkCheckman | String | 内核查找 Xposed 链接库 |
| checkXposedBridge | String | 环境变量特征字判断 |
| substrateInfo | JSONObject | Substrate 信息 |
| checkSubstratePackage | String | 包名检测 |
| checkSubstrateHookMethod | String | 检测调用栈中的可疑方法 |
| checkSubstrateJars | String | 检测内存中可疑的 jars |
| fridaInfo | JSONObject | Frida 信息 |
| checkRunningProcesses | String | 检测进程信息 |
| checkFridaJars | String | 检测内存中可疑的 jars |
本地数据获取
代码示例
LocalHelper.mobGetMobLocal()
数据格式
{
“country”:“CN”,
“language”:“zh”
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| country | String | 当前国家 |
| language | String | 当前语言 |
内存数据获取
代码示例
MemoryHelper.getMemoryInfo(getApplicationContext())
数据格式
{
“ramMemoryTotal”:“3.90 GB”,
“ramMemoryAvailable”:“1.56 GB”,
“romMemoryAvailable”:“40.22 GB”,
“romMemoryTotal”:“56.30 GB”,
“sdCardMemoryAvailable”:“40.20 GB”,
“sdCardMemoryTotal”:“56.28 GB”
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| ramMemoryTotal | String | RAM 全部内存 |
| ramMemoryAvailable | String | RAM 可用内存 |
| romMemoryAvailable | String | ROM 可用内存 |
| romMemoryTotal | String | ROM 全部内存 |
| sdCardMemoryAvailable | String | 内存卡可用内存 |
| sdCardMemoryTotal | String | 内存卡全部内存 |
多开数据获取
代码示例
MoreOpenHelper.checkVirtual(getApplicationContext())
数据格式
{
“checkByPrivateFilePath”:“false”,
“checkByMultiApkPackageName”:“false”,
“checkByHasSameUid”:“false”
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| checkByPrivateFilePath | String | 检测私有路径 |
| checkByMultiApkPackageName | String | maps 检测 |
| checkByHasSameUid | String | ps 检测 |
网络数据获取
代码示例
NetWorkHelper.mobGetMobNetWork(getApplicationContext())
数据格式
{
“type”:“WIFI”,
“networkAvailable”:“true”,
“haveIntent”:“false”,
“isFlightMode”:“false”,
“isNFCEnabled”:“true”,
“isHotspotEnabled”:“false”,
“hotspotSSID”:"$unknown",
“hotspotPwd”:"$unknown",
“encryptionType”:"$unknown"
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| type | String | 网络类型 |
| networkAvailable | String | 网络是否可用 |
| haveIntent | String | 是否开启数据流量 |
| isFlightMode | String | 是否是飞行模式 |
| isNFCEnabled | String | NFC 功能是否开启 |
| isHotspotEnabled | String | 是否开启热点 |
| hotspotSSID | String | 热点账号 |
| hotspotPwd | String | 热点密码 |
| encryptionType | String | 热点加密类型 |
root 数据获取
代码示例
RootHelper.mobileRoot(getApplicationContext())
屏幕数据获取
代码示例
ScreenHelper.mobGetMobScreen(getApplicationContext())
数据格式
{
“densityScale”:“3.0”,
“densityDpi”:“480”,
“width”:“1080”,
“height”:“1920”,
“isScreenAuto”:“false”,
“isScreenAutoChange”:“false”,
“screenBrightness”:“114”,
“checkHideStatusBar”:“false”,
“checkHasNavigationBar”:“false”,
“getStatusBarHeight”:“72”,
“getNavigationBarHeight”:“126”
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| densityScale | String | 当前屏幕密度与标准屏幕密度的比值 |
| densityDpi | String | 屏幕密度 |
| width | String | 屏幕宽度 |
| height | String | 屏幕高度 |
| isScreenAuto | String | 亮度是否为自动调节 |
| isScreenAutoChange | String | 屏幕亮度 |
| screenBrightness | String | 屏幕是否开启自动旋转 |
| checkHideStatusBar | String | 是否隐藏状态栏 |
| checkHasNavigationBar | String | 是否显示底部导航栏 |
| getStatusBarHeight | String | 获取状态栏高度 |
| getNavigationBarHeight | String | 获取底部导航栏的高度 |
SDCard 数据获取
代码示例
SDCardHelper.mobGetSdCard()
数据格式
{
“isSDCardEnable”:“true”,
“getSDCardPath”:"/storage/emulated/0"
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| isSDCardEnable | String | SDCard 是否可用 |
| getSDCardPath | String | SDCard 的路径 |
设置数据获取
代码示例
SettingsHelper.mobGetMobSettings(getApplicationContext())
数据格式
{
“androidId”:“f573c0f6ca5178a2”
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| androidId | String | androidId |
信号数据获取
总结
开发是面向对象。我们找工作应该更多是面向面试。哪怕进大厂真的只是去宁螺丝,但你要进去得先学会面试的时候造飞机不是么?
作者13年java转Android开发,在小厂待过,也去过华为,OPPO等,去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。
这里附上上述的技术体系图相关的几十套,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含,由于篇幅有限,这里以图片的形式给大家展示一部分。

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
{
“isSDCardEnable”:“true”,
“getSDCardPath”:"/storage/emulated/0"
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| isSDCardEnable | String | SDCard 是否可用 |
| getSDCardPath | String | SDCard 的路径 |
设置数据获取
代码示例
SettingsHelper.mobGetMobSettings(getApplicationContext())
数据格式
{
“androidId”:“f573c0f6ca5178a2”
}
| 数据键 | 数据类型 | 数据解释 |
| — | — | — |
| androidId | String | androidId |
信号数据获取
总结
开发是面向对象。我们找工作应该更多是面向面试。哪怕进大厂真的只是去宁螺丝,但你要进去得先学会面试的时候造飞机不是么?
作者13年java转Android开发,在小厂待过,也去过华为,OPPO等,去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。
这里附上上述的技术体系图相关的几十套,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含,由于篇幅有限,这里以图片的形式给大家展示一部分。
[外链图片转存中…(img-clfCRgUj-1643533614526)]
[外链图片转存中…(img-s5RwS7Oq-1643533614527)]
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。