Android 系统的各个状态 可通过
Android系统中 setprop,getprop,watchprops命令的使用
entropy
fm
gfxinfo
hardware
input
isms
location
lock_settings
meminfo
network_management
notification
package
permission
phone
power
samplingprofiler
scheduling_policy
search
sensorservice
serial
servicediscovery
sim_manager
simphonebook
...
-------------------------------------------------------------------------------
DUMP OF SERVICE SurfaceFlinger:
Visible layers (count = 4)
Visible layers (count = 4)
+ Layer 0x41ba5008 (com.android.settings/com.android.settings.SprdUsbSettings)
Region transparentRegion (this=0x41ba51e4, count=0)
Region transparentRegionScreen (this=0x41ba503c, count=0)
Region visibleRegionScreen (this=0x41ba5018, count=0)
z= 21005, pos=(0,0), size=( 480, 854), crop=( 0, 38, 480, 854), isOp
aque=1, needsDithering=0, invalidate=0, alpha=0x00, flags=0x00000001, tr=[1.00,
0.00][0.00, 1.00]
client=0x41c14ee0, identity=7
format= 2, activeBuffer=[ 480x 854: 480, 2], transform-hint=0x00, queued-
frames=0, mRefreshPending=0
Android系统中 setprop,getprop,watchprops命令的使用
在android系统中,有一些初始化的配置文件,例如:
/init.rc
/default.prop
/system/build.prop
文件里面里面配置了开机设置的系统属性值,
这些属性值,可以通过getprop获取,setprop设置,
它的格式如下:
getprop [key]
获取指定key的配置值,如果不带参数,只是getprop则是显示系统所有的配置值。
[dalvik.vm.heapsize]: [24m]
[curlockscreen]: [1]
[ro.sf.hwrotation]: [0]
[ro.config.notification_sound]: [OnTheHunt.ogg]
[ro.config.alarm_alert]: [Alarm_Classic.ogg]
setprop [key] [value]
设置指定key的属性值,
watchprops
监听系统属性的变化,如果期间系统的属性发生变化则把变化的值显示出来
/system # watchprops
1307501833 sys.settings_system_version = '37'
1307501836 sys.settings_system_version = '38'
1307501862 persist.sys.timezone = 'Asia/Hong_Kong'
其实这三个命令都是toolbox的子命令,如果有兴趣的可以看在android源码中看到其对应的源码:
system/core/toolbox/
一般而言,我们在串口中输入getprop指令,会出现很多类似键值对的系统变量值
这些都是系统值,然而这些都是都是底层创建的变量,例如在某个驱动程序中创建,但如果在java语言中想获得这些信息中的某个变量的值,怎么办呢?
1,上一节我们讲解了,在java中如何调用linux的指令,主要通过如下代码实现:
Process process = Runtime.getRuntime().exec(com);
InputStreamReader ir = new InputStreamReader(process.getInputStream());
BufferedReader input = new BufferedReader(ir);
2,我们想getprop和setprop既然都是命令,能不能也用上面的方面尝试得到值呢 ,当然。
getprop 用法:getprop [key]
setprop用法:setprop [key] [value]
注:实际中是没有中括号的。
所以用法同上:
Process process = Runtime.getRuntime().exec("getprop ro.runtime.firstboot");
InputStreamReader ir = new InputStreamReader(process.getInputStream());
BufferedReader input = new BufferedReader(ir);
一般而言,我们在串口中输入getprop指令,会出现很多类似键值对的系统变量值
这些都是系统值,然而这些都是都是底层创建的变量,例如在某个驱动程序中创建,但如果在java语言中想获得这些信息中的某个变量的值,怎么办呢?
1,上一节我们讲解了,在java中如何调用linux的指令,主要通过如下代码实现:
Process process = Runtime.getRuntime().exec(com);
InputStreamReader ir = new InputStreamReader(process.getInputStream());
BufferedReader input = new BufferedReader(ir);
2,我们想getprop和setprop既然都是命令,能不能也用上面的方面尝试得到值呢 ,当然。
getprop 用法:getprop [key]
setprop用法:setprop [key] [value]
注:实际中是没有中括号的。
所以用法同上:
Process process = Runtime.getRuntime().exec("getprop ro.runtime.firstboot");
InputStreamReader ir = new InputStreamReader(process.getInputStream());
BufferedReader input = new BufferedReader(ir);
2、系统已启用服务,可通过
我们知道Android使用ServiceManager服务进程来管理系统所有的服务,在系统启动时,每个服务必须注册到ServiceManager进程中,那如何查看系统运行了那些服务呢?ServiceManager提供了listServices接口来罗列出系统注册的所有服务。Android提供了dumpsys工具来dump出所有的服务信息,通过以下命令可以查看系统注册的所有服务:w plain
adb shell dump
dropboxentropy
fm
gfxinfo
hardware
input
isms
location
lock_settings
meminfo
network_management
notification
package
permission
phone
power
samplingprofiler
scheduling_policy
search
sensorservice
serial
servicediscovery
sim_manager
simphonebook
...
-------------------------------------------------------------------------------
DUMP OF SERVICE SurfaceFlinger:
Visible layers (count = 4)
...
也可以dump指定服务信息:y
adb shell dumpsys SurfaceFlinger
+ Layer 0x41ba5008 (com.android.settings/com.android.settings.SprdUsbSettings)
Region transparentRegion (this=0x41ba51e4, count=0)
Region transparentRegionScreen (this=0x41ba503c, count=0)
Region visibleRegionScreen (this=0x41ba5018, count=0)
z= 21005, pos=(0,0), size=( 480, 854), crop=( 0, 38, 480, 854), isOp
aque=1, needsDithering=0, invalidate=0, alpha=0x00, flags=0x00000001, tr=[1.00,
0.00][0.00, 1.00]
client=0x41c14ee0, identity=7
format= 2, activeBuffer=[ 480x 854: 480, 2], transform-hint=0x00, queued-
frames=0, mRefreshPending=0
...
dumpsys源码分析
dumpsys工具比较简单,就是调用ServiceManager服务的listServices来查询系统注册的所有服务,并且通过checkService接口来获取服务的Binder远程代理对象,使用每个服务的dump函数来打印该服务的相关信息。
frameworks\native\cmds\dumpsys\dumpsys.cpp
- int main(int argc, char* const argv[])
- {
- signal(SIGPIPE, SIG_IGN);
- //取得ServiceManager服务的远程Binder代理对象
- sp<IServiceManager> sm = defaultServiceManager();
- fflush(stdout);
- if (sm == NULL) {
- ALOGE("Unable to get default service manager!");
- aerr << "dumpsys: Unable to get default service manager!" << endl;
- return 20;
- }
- Vector<String16> services;
- Vector<String16> args;
- //如果命令行参数只有1个
- if (argc == 1) {
- //使用ServiceManager服务的Binder远程代理对象查询所有的服务
- services = sm->listServices();
- services.sort(sort_func);
- args.add(String16("-a"));
- } else {
- //添加命令行指定的服务及参数
- services.add(String16(argv[1]));
- for (int i=2; i<argc; i++) {
- args.add(String16(argv[i]));
- }
- }
- //根据服务名称查找服务对应的Binder代理对象,如果存在,打印该服务
- const size_t N = services.size();
- if (N > 1) {
- // first print a list of the current services
- aout << "Currently running services:" << endl;
- for (size_t i=0; i<N; i++) {
- sp<IBinder> service = sm->checkService(services[i]);
- if (service != NULL) {
- aout << " " << services[i] << endl;
- }
- }
- }
- //调用服务的dump函数打印服务相关信息
- for (size_t i=0; i<N; i++) {
- sp<IBinder> service = sm->checkService(services[i]);
- if (service != NULL) {
- if (N > 1) {
- aout << "------------------------------------------------------------"
- "-------------------" << endl;
- aout << "DUMP OF SERVICE " << services[i] << ":" << endl;
- }
- int err = service->dump(STDOUT_FILENO, args);
- if (err != 0) {
- aerr << "Error dumping service info: (" << strerror(err)
- << ") " << services[i] << endl;
- }
- } else {
- aerr << "Can't find service: " << services[i] << endl;
- }
- }
- return 0;
- }