Android 系统状态参数和开机服务状态

Android 系统的各个状态 可通过 

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);

2、系统已启用服务,可通过

我们知道Android使用ServiceManager服务进程来管理系统所有的服务,在系统启动时,每个服务必须注册到ServiceManager进程中,那如何查看系统运行了那些服务呢?ServiceManager提供了listServices接口来罗列出系统注册的所有服务。Android提供了dumpsys工具来dump出所有的服务信息,通过以下命令可以查看系统注册的所有服务:w plain

adb shell dump

  dropbox
  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)

...

也可以dump指定服务信息:y 

adb shell dumpsys SurfaceFlinger 

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

...

dumpsys源码分析

dumpsys工具比较简单,就是调用ServiceManager服务的listServices来查询系统注册的所有服务,并且通过checkService接口来获取服务的Binder远程代理对象,使用每个服务的dump函数来打印该服务的相关信息。
frameworks\native\cmds\dumpsys\dumpsys.cpp
[java] view plaincopy
  1. int main(int argc, charconst argv[])  
  2. {  
  3.     signal(SIGPIPE, SIG_IGN);  
  4.     //取得ServiceManager服务的远程Binder代理对象  
  5.     sp<IServiceManager> sm = defaultServiceManager();  
  6.     fflush(stdout);  
  7.     if (sm == NULL) {  
  8.         ALOGE("Unable to get default service manager!");  
  9.         aerr << "dumpsys: Unable to get default service manager!" << endl;  
  10.         return 20;  
  11.     }  
  12.     Vector<String16> services;  
  13.     Vector<String16> args;  
  14.     //如果命令行参数只有1个  
  15.     if (argc == 1) {  
  16.             //使用ServiceManager服务的Binder远程代理对象查询所有的服务  
  17.         services = sm->listServices();  
  18.         services.sort(sort_func);  
  19.         args.add(String16("-a"));  
  20.     } else {  
  21.             //添加命令行指定的服务及参数  
  22.         services.add(String16(argv[1]));  
  23.         for (int i=2; i<argc; i++) {  
  24.             args.add(String16(argv[i]));  
  25.         }  
  26.     }  
  27.     //根据服务名称查找服务对应的Binder代理对象,如果存在,打印该服务  
  28.     const size_t N = services.size();  
  29.     if (N > 1) {  
  30.         // first print a list of the current services  
  31.         aout << "Currently running services:" << endl;  
  32.         for (size_t i=0; i<N; i++) {  
  33.             sp<IBinder> service = sm->checkService(services[i]);  
  34.             if (service != NULL) {  
  35.                 aout << "  " << services[i] << endl;  
  36.             }  
  37.         }  
  38.     }  
  39.     //调用服务的dump函数打印服务相关信息  
  40.     for (size_t i=0; i<N; i++) {  
  41.         sp<IBinder> service = sm->checkService(services[i]);  
  42.         if (service != NULL) {  
  43.             if (N > 1) {  
  44.                 aout << "------------------------------------------------------------"  
  45.                         "-------------------" << endl;  
  46.                 aout << "DUMP OF SERVICE " << services[i] << ":" << endl;  
  47.             }  
  48.             int err = service->dump(STDOUT_FILENO, args);  
  49.             if (err != 0) {  
  50.                 aerr << "Error dumping service info: (" << strerror(err)  
  51.                         << ") " << services[i] << endl;  
  52.             }  
  53.         } else {  
  54.             aerr << "Can't find service: " << services[i] << endl;  
  55.         }  
  56.     }  
  57.     return 0;  
  58. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值