如何获取android 获取开机时间从系统开机开始算起的运行时间

Android--获取当前系统时间
java代码:
import java.text.SimpleDateF
SimpleDateFormat formatter = new SimpleDateFormat ("yyyy年MM月dd日
HH:mm:ss ");
Date curDate = new
Date(System.currentTimeMillis());//获取当前时间
String str = formatter.format(curDate);
以上可以获取当前的年月时分,也可以分开写(如下):
java代码:
SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd
hh:mm:ss");
String date = sDateFormat.format(new java.util.Date());
如果想获取当前的年月,则可以这样写(只获取时间或秒种一样):
java代码:
SimpleDateFormat sdf=new
SimpleDateFormat("yyyy-MM");
String date=sdf.format(new java.util.Date());
当然还有就是可以指定时区的时间(待):
df=DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL,Locale.CHINA);
System.out.println(df.format(new Date()));
如何获取Android系统时间是24小时制还是12小时制:
java代码:
ContentResolver cv = this.getContentResolver();  
  String strTimeFormat =
android.provider.Settings.System.getString(cv,
  android.provider.Settings.System.TIME_12_24);
  if(strTimeFormat.equals("24"))
  Log.i("activity","24");
取得系统日期:
java代码:
Calendar c = Calendar.getInstance();
year = c.get(Calendar.YEAR)
month = c.grt(Calendar.MONTH)
day = c.get(Calendar.DAY_OF_MONTH)
取得系统时间:
java代码:
Calendar c = Calendar.getInstance();
hour = c.get(Calendar.HOUR_OF_DAY);
minute = c.get(Calendar.MINUTE)
利用Time获取:
java代码:
Time t=new Time(); // or Time t=new Time("GMT+8"); 加上Time
Zone资料。
  t.setToNow(); // 取得系统时间。
  int year = t.
  int month = t.
  int date = t.monthD
  int hour = t. // 0-23
  int minute = t.
  int second = t.
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。& Android系统启动过程全解析
Android系统启动过程全解析
&&&&&& Android系统是一款基于Linux的移动操作系统,那么Android是如何启动起来的呢?本文就详细阐述Android系统的启动过程。&&&&&& 从内核之上,我们首先应该从文件系统的init开始,因为 init 是内核进入文件系统后第一个运行的程序,通常我们可以在linux的命令行中指定内核第一个调用谁,如果没指定那么内核将会到/sbin/、/bin/ 等目录下查找默认的init,如果没有找到那么就报告出错。&&&&&& init.c位置:system/core/init/init.c。&&&&&& 在init.c的main函数里面完成以下步骤:&&&&&&&1、创建设备节点。&&&&&& 2、初始化log系统。&&&&&&&3、解析init.rc文件,解析函数在同一目录的parser.c里面实现。&&&&&& 4、初始化属性服务器,在同一目录下的property_service.c里面实现。&&&&&& 。。。。&&&&&& 最后、进入loop等待事件到来。&&&&&& init.rc的解析过程&&&&&& init.rc是一个初始化脚本,路径(不确定):device/renesas/emev/init.rc&&&&&& 在init.c的main函数里面,调用parser.c的parse_config_file(&/init.rc&);执行解析过程。&&&&&&&先读取文件内容到data里面,再调用parse_config(fn, data);进行解析。&&&&&& init.rc包含Android初始化语言的四大类声明:行为类(Actions)、命令类(Commands)、服务类(Services)、选项类(Options),解析完会形成两个列表service_list 和action_list。&&&&&& 其中有一个很重要的服务就是zygote,在init.rc里面的片段:
service&zygote&/system/bin/app_process&-Xzygote&/system/bin&--zygote&--start-system-server &&
&&&&socket&zygote&stream&666&&
&&&&onrestart&write&/sys/android_power/request_state&wake &&
&&&&onrestart&write&/sys/power/state&on &&
&&&&onrestart&restart&media&&&&&&&& 这是脚本中的格式:
service&&name&&&pathname&&[&&argument&&]* &&
&option& &&
&option& &&
...&&&&&&&&&zygote对应的可执行文件为app_process,android2.2中它的源代码位置:framework/base/cmds/app_process。&&&&&&&app_main.cpp的main函数,它先调用AndroidRuntime::addVmArguments将它的参数&-Xzygote /system/bin&传给AndroidRuntime作为启动JavaVM用。接着如果定位余下的参数,如果有&--zygote&,执行下面代码,从参数可以知道,这时候要求启动start system server,并且将com.android.internal.os.ZygoteInit装载至虚拟机。
ZygoteInit.java的main方法)。&&& &&
&&&&&&&&if&(0&==&strcmp(&--zygote&,&arg))&{&&& &&
&&&&&&&&&&&&bool&startSystemServer&=&(i&&&argc)&?&&& &&
&&&&&&&&&&&&&&&&&&&&strcmp(argv[i],&&--start-system-server&)&==&0&:&false;&&& &&
&&&&&&&&&&&&setArgv0(argv0,&&zygote&);&&& &&
&&&&&&&&&&&&set_process_name(&zygote&);&&& &&
&&&&&&&&&&&&runtime.start(&com.android.internal.os.ZygoteInit&,&&& &&
&&&&&&&&&&&&&&&&startSystemServer);&&& &&
&&&&&&&&}&&&&&&&&&& 否则不启动system server:
set_process_name(argv0);&&& &&
runtime.mClassName&=&&&& &&
runtime.mArgC&=&argc-i;&&& &&
runtime.mArgV&=&argv+i;&&& &&
LOGV(&App&process&is&starting&with&pid=%d,&class=%s.\n&,&&& &&
&&&&&getpid(),&runtime.getClassName());&&& &&
runtime.start();&&&&&&&&&runtime是AppRuntime对象,继承自AndroidRuntime,在AndroitRuntime.app里的start()函数如下,默认装载的是RuntimeInit进程,不启动system server。
void&AndroidRuntime::start()&&& &&
&&&&start(&com.android.internal.os.RuntimeInit&,&&& &&
&&&&&&&&false&);&&& &&
}&&&&&&&&& 在AndroidRuntime.cpp的start方法内,先启动虚拟机,在定位执行className类的main方法(如果才存在的话)。
void&AndroidRuntime::start(const&char*&className,&const&bool&startSystemServer)&&& &&
&&&&LOGD(&\n&&&&&&&&&&&&&&&AndroidRuntime&START&&&&&&&&&&&&&&&\n&);&&& &&
&&&&if&(startVm(&mJavaVM,&&env)&!=&0)&&& &&
&&&&&&&&goto&&&& &&
&&&&startClass&=&env-&FindClass(slashClassName);&&& &&
&&&&if&(startClass&==&NULL)&{&&& &&
&&&&&&&&LOGE(&JavaVM&unable&to&locate&class&'%s'\n&,&slashClassName);&&& &&
&&&&&&&&&& &&
&&&&}&else&{&&& &&
&&&&&&&&startMeth&=&env-&GetStaticMethodID(startClass,&&main&,&&& &&
&&&&&&&&&&&&&([Ljava/lang/S)V&);&&& &&
&&&&&&&&if&(startMeth&==&NULL)&{&&& &&
&&&&&&&&&&&&LOGE(&JavaVM&unable&to&find&main()&in&'%s'\n&,&className);&&& &&
&&&&&&&&&&&&&& &&
&&&&&&&&}&else&{&&& &&
&&&&&&&&&&&&env-&CallStaticVoidMethod(startClass,&startMeth,&strArray);&&& &&
&&&&&&&&}&&& &&
&&&&}&&& &&
}&&&&&&&&&& 先看怎么启动虚拟机的,在startVm方法内,先将一些系统参数选项,包括虚拟机相关的属性,保存到一个JavaVMOption的实例内,比如虚拟机的堆大小,是否check jni,JNI版本信息,最后将这些参数传给JNI_CreateJavaVM,创建JAVA虚拟机实例。
jint&JNI_GetDefaultJavaVMInitArgs(void*);&&& &&
jint&JNI_CreateJavaVM(JavaVM**,&JNIEnv**,&void*);&&& &&
jint&JNI_GetCreatedJavaVMs(JavaVM**,&jsize,&jsize*);&&&&&&&&&& 在JNI_CreateJavaVM中,先检查JNI的版本,为JavaVM,JNIEnv开辟空间,保存通用接口,最后解析传进来的参数,最后调用dvmStartup启动虚拟机(有些传给JNI_CreateJavaVM的参数,也直接传给了dvmStartup)。&&&&&& 这里的JNIEnv实际是JNIEnvExt强制转换过来的,JNIEnvExt是JNIEnv结构体的扩展,JNIEnExt前端与JNIEnv完全对齐,都是JNI函数指针。相当于JNIEnExt对JNIEnv进行了赋值。
pEnv&=&(JNIEnvExt*)&dvmCreateJNIEnv(NULL);&&&&&&&&& 在dvmStartup在Init.c定义,先调用setCommandLineDefaults进行一些默认的设置,比如虚拟机的默认heap大小。
static&void&setCommandLineDefaults()&&& &&
&&&&gDvm.heapSizeStart&=&2&*&1024&*&1024;&&&&&
&&&&gDvm.heapSizeMax&=&16&*&1024&*&1024;&&&&&&
&&&&gDvm.stackSize&=&kDefaultStackS&&& &&
}&&&&&&&&&& 然后调用dvmProcessOptions处理传进来的参数,比如是否执行zygote,最后,根据gDvm.zygote的值,是否申请一个新的堆,这个值在有参数-Xzygote置1。
if&(gDvm.zygote)&{&&& &&
&&&&if&(!dvmInitZygote())&&& &&
&&&&&&&&goto&&&& &&
}&else&{&&& &&
&&&&if&(!dvmInitAfterZygote())&&& &&
&&&&&&&&goto&&&& &&
}&&&&&&&& 到这里,虚拟机算是启动成功了。&&&&&&&回到AndroidRuntime.cpp的start方法,现在我们要启动ZygoteInit进程,找到ZygoteInit的main方法,调用env-&CallStaticVoidMethod(startClass, startMeth, strArray);去启动它。&&&&&& CallStaticVoidMethod在Jni.c里面有定义,但不是直接定义的,因此用CallStaticVoidMethod作为函数名直接查定义是查不到的,是这样定义的:&&&&&& CALL_STATIC(void, Void, , , false);&&&&&& 再看CALL_STATIC的宏定义:
#define&CALL_STATIC(_ctype,&_jname,&_retfail,&_retok,&_isref)&&&&&&&&&&&&&&&\&&& &&
&&&&static&_ctype&CallStatic##_jname##Method(JNIEnv*&env,&jclass&jclazz,&&&&\&&& &&
&&&&&&&&jmethodID&methodID,&...)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&UNUSED_PARAMETER(jclazz);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&JNI_ENTER();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&JValue&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&va_list&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&va_start(args,&methodID);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&dvmCallMethodV(_self,&(Method*)methodID,&NULL,&true,&&result,&args);\&&& &&
&&&&&&&&va_end(args);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&if&(_isref&&&&!dvmCheckException(_self))&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&&&&&result.l&=&addLocalReference(env,&result.l);&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&JNI_EXIT();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&return&_&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&static&_ctype&CallStatic##_jname##MethodV(JNIEnv*&env,&jclass&jclazz,&&&\&&& &&
&&&&&&&&jmethodID&methodID,&va_list&args)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&UNUSED_PARAMETER(jclazz);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&JNI_ENTER();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&JValue&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&dvmCallMethodV(_self,&(Method*)methodID,&NULL,&true,&&result,&args);\&&& &&
&&&&&&&&if&(_isref&&&&!dvmCheckException(_self))&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&&&&&result.l&=&addLocalReference(env,&result.l);&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&JNI_EXIT();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&return&_&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&static&_ctype&CallStatic##_jname##MethodA(JNIEnv*&env,&jclass&jclazz,&&&\&&& &&
&&&&&&&&jmethodID&methodID,&jvalue*&args)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&UNUSED_PARAMETER(jclazz);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&JNI_ENTER();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&JValue&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&dvmCallMethodA(_self,&(Method*)methodID,&NULL,&true,&&result,&args);\&&& &&
&&&&&&&&if&(_isref&&&&!dvmCheckException(_self))&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&&&&&result.l&=&addLocalReference(env,&result.l);&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&JNI_EXIT();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&&&&&return&_&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\&&& &&
&&&&}&&&&&&&&&& 因此CallStaticVoidMethod调用的是dvmCallMethodV方法,至于怎么样再调用到ZygoteInit的main方法,有待研究,现在直接看ZygoteInit的main方法,它的参数是这样定义的:
stringClass&=&env-&FindClass(&java/lang/String&);&&& &&
assert(stringClass&!=&NULL);&&& &&
strArray&=&env-&NewObjectArray(2,&stringClass,&NULL);&&& &&
assert(strArray&!=&NULL);&&& &&
classNameStr&=&env-&NewStringUTF(className);&&& &&
assert(classNameStr&!=&NULL);&&& &&
env-&SetObjectArrayElement(strArray,&0,&classNameStr);&&& &&
startSystemServerStr&=&env-&NewStringUTF(startSystemServer&?&&& &&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&true&&:&&false&);&&& &&
env-&SetObjectArrayElement(strArray,&1,&startSystemServerStr);&&&&&&&&& 申请一个String变量,给把类名作为第0个参数,第二个参数是&ture&或&false&,用来决定是否启动system service,在ZygoteInit的main方法会读取这个参数。
if&(argv[1].equals(&true&))&{&&& &&
&&&&startSystemServer();&&& &&
}&else&if&(!argv[1].equals(&false&))&{&&& &&
&&&&throw&new&RuntimeException(argv[0]&+&USAGE_STRING);&&& &&
}&&&&&&&& 它读取到第一个参数是&true&,所以调用startSystemServer启动system server,在startSystemServer中,调用Zygote的forkSystemServer,fork出来的子进程,就是system server了,调用事的参数如下:
String&args[]&=&{&&& &&
&&&&&--setuid=1000&,&&& &&
&&&&&--setgid=1000&,&&& &&
&&&&&--setgroups=03,06,09,02,3003&,&&& &&
&&&&&--capabilities=0104352&,&&& &&
&&&&&--runtime-init&,&&& &&
&&&&&--nice-name=system_server&,&&& &&
&&&&&com.android.server.SystemServer&,&&& &&
};&&&&&&&& 这些参数解析到一个ZygoteConnection.Arguments对象中。forkSystemServer方法实际上是JNI方法,在vm/native/dalvik_system_Zygote.c中有定义。
static&void&Dalvik_dalvik_system_Zygote_forkSystemServer(&&& &&
&&&&&&&&const&u4*&args,&JValue*&pResult)&&& &&
&&&&pid_t&&&& &&
&&&&pid&=&forkAndSpecializeCommon(args);&&& &&
&&&&if&(pid&&&0)&{&&& &&
&&&&&&&&int&&&& &&
&&&&&&&&LOGI(&System&server&process&%d&has&been&created&,&pid);&&& &&
&&&&&&&&gDvm.systemServerPid&=&&&& &&
&&&&&&&&if&(waitpid(pid,&&status,&WNOHANG)&==&pid)&{&&& &&
&&&&&&&&&&&&LOGE(&System&server&process&%d&has&died.&Restarting&Zygote!&,&pid);&&& &&
&&&&&&&&&&&&kill(getpid(),&SIGKILL);&&& &&
&&&&&&&&}&&& &&
&&&&}&&& &&
&&&&RETURN_INT(pid);&&& &&
}&&&&&&&& 具体的fork操作在forkAndSpecializeCommon里面进行,父进程检查子进程是否died。&&&&&& 在forkAndSpecializeCommon,先判断是否zygote模式,是否剩余有足够的heap空间,最后才执行fork()系统调用。&&&&&& fork之后,父进程不做操作,子进程调用dvmInitAfterZygote去为自己申请堆空间。&&&&&& 子进程返回到startSystemServer方法。
if&(pid&==&0)&{&&& &&
&&&&handleSystemServerProcess(parsedArgs);&&& &&
}&&&&&&&&& 调用handleSystemServerProcess方法,在里面先设置uid的权限,再调用RuntimeInit.zygoteInit。
RuntimeInit.zygoteInit(parsedArgs.remainingArgs);&&& &&
&&&&&&&&&&&在zygoteInit里面调用invokeStaticMain,invokeStaticMain先将com.android.server.Systemserver类的main方法取出,作为Method对象,然后和参数一起传给ZygoteInit.MethodAndArgsCaller,MethodAndArgsCaller继承自Runner,最终MethodAndArgsCaller调用Method.invode函数启动System Server。
本文发布:
本文地址:
发布:鸡啄米
&&( 0:1:36)&&( 21:40:25)&&( 23:54:46)&&( 20:59:25)&&( 21:16:10)&&( 21:21:52)&&( 23:31:31)&&( 21:53:6)
人都是由不懂到懂的,先看看这些让人迷糊的代码吧。鸡啄米 于
22:41:31 回复呵呵,很同意第一句话
完全随机文章用户名:Jhuster
文章数:169
评论数:410
访问量:1576282
注册日期:
阅读量:1297
阅读量:3317
阅读量:441828
阅读量:1128026
51CTO推荐博文
本文是系列的第七篇文章,通过上一篇文章我们大致了解了Android系统的启动过程,那么本文就从实践的角度,简单介绍一下如何统计Android系统的启动时间。这里所说的统计系统的启动时间,并不是简单地用秒表和肉眼来统计,而是通过分析系统输出的log信息来统计,这样才显得更加专业。首先了解2个概念:(1) Android是基于Linux内核的系统,因此Android的启动过程是分为两个阶段的,第一个阶段就是Linux内核的启动,第二个阶段就是Android框架的启动(包括核心服务和程序)。(2)Android的log系统是独立于Linux内核的log系统的。Linux内核通过printk打印的log信息,这些log写入到了/dev/kmsg文件中,在Shell终端可以通过dmesg命令查看这些log信息。Android框架则是通过Logger驱动打印log信息,这些log并没有归并到kmesg文件中,而是单独存储的,位于/dev/log目录下,在Shell终端可以通过logcat命令来查看。下面我们分别从两种log信息中找到如何统计系统启动时间的方法。1. &通过dmesg信息统计系统启动时间首先,我们通过dmesg命令抓取Linux内核的log信息(部分系统可能需要先执行 adb root):$ adb shell dmesg & dmesg.txtLinux内核启动完成,一般都有如下的标准输出信息:&6& [ 6.613861] Freeing init memory: 176K因此,只要我们在dmesg.txt文件中找到“Freeing init memory”这一行即可,从上面的log可以看出,Linux内核启动只用了6.613861s。那么,如何找到Android系统启动完成的标志呢?很多Android设备在系统启动完成后,会在内核log中打印如下信息:&6&[ 29.913726] init: processing action 0x96bb8 (property:sys.boot_completed=1)因此,找到“boot_completed”这一行也就得到了整个系统的启动时间了,从这一行可以看出,整个系统启动用了29.913726s。当然,并不是所有的Android设备都会打印出这条log,因此,我们一般用下面介绍的方法来专门统计Android系统的启动时间,2. &通过logcat统计系统的启动时间文章开头我们已经介绍过,Android的log系统是独立于Linux内核log系统的,通过在终端输入adb shell 进入Android系统,cd到/dev/log目录,你会发现里面有四个文件,分别是:events,main,radio,system.Android系统把Log分为了四类,不同的类别记录不同的Log信息:main - 主要的Log信息,大部分应用级别的Log信息都在这里events - 系统事件相关的Log信息radio & - 无线/电话相关的Log信息system - 低级别的系统调试Log信息默认通过logcat抓取的是main信息,如果想抓取指定类别的log信息的方法,在logcat命令后加-b参数,例如:$&adb&logcat&-d&-v&time&-b&"main"&&&&&&main.txt
$&adb&logcat&-d&-v&time&-b&"events"&&&&events.txt
$&adb&logcat&-d&-v&time&-b&"system"&&&&system.txt
$&adb&logcat&-d&-v&time&-b&"radio"&&&&&radio.txt关于Android Log系统的分类,你可以访问如下页面详细了解:&那么,如何统计Android系统的启动时间呢?我们可以重点关注events类别的log信息,通过如下命令:$ adb logcat -d -b events | grep "boot"如图所示,这是我在高通的APQ8064开发板上抓取的log信息:“boot_progress_start”代表着Android屏幕点亮,开始显示启动动画,即15.492s开始闪烁Android字样。“boot_progress_enable_screen”代表着整个系统启动结束,即用了29.986s,用这个总时间减去Linux Kernel的启动时间即可得到Android OS部分的时间。3. &小结由于本文重点关注如何统计Android系统的启动时间,因此,很多启动log文件的分析就不做详细展开了,下一篇文章将会对系统启动的log做稍微详细的分析。有任何疑问或者建议欢迎留言或者来信lujun.交流,或者关注我的新浪微博获取最新的文章和资讯。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
本文收录至博客专题:《》}

我要回帖

更多关于 android 获取系统语言 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信