Android(安卓)系统分析
转载:http://blog.csdn.net/innost/article/details/6041412
ANDROID搞了大概5个月了,总感觉到它的这个java封装非常的不爽。这次下载了Froyo的源码,准备好好分析下Android的运行流程。一直有个暗想--能否替换掉JAVA层?搞android最麻烦的就是老记不住它那几个文件的位置,这里将给出详细的路径,方便其他看客了解。
没有固定的顺序,不过大概就是从启动开始的一些东西吧。我的想法是对android了解越多,才越可能在此基础上做最好最完善的改动。真的很不喜欢它的java层。
一 用户空间init
我这里不分析linux启动的那第一个程序init。
init代码在/system/core/init/init.c。感兴趣的可从main函数开始分析
android的其他重要进程都是init加载init.rc配置文件来fork的。其中,最重要的init.rc位于source/system/core/rootdir下。
init.rc有它特有的语法,可google一下就知道了。
二 zygote的诞生
zygote程序是有app_process弄出来的,app_process的启动在init.rc中有对应行。
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
//第一个zygote是这个服务的名字,实际启动的程序位于system/bin下的app_process,后面是这个程序的启动参数
socket zygote stream 666
//这个表示init将创建一个unix域的socket,666是rwx的读写执行权限。
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
其中,app_process位于/frameworks/base/cmds/app_process/app_main.cpp中。
下面分析它的mian函数。
[cpp] view plain copy print ?
- intmain(intargc,constchar*constargv[])
- {
- //argc=5
- //argv=["/system/bin/app_process""-Xzygote""/system/bin""--zygote""--start-system-server"]
- //TheseareglobalvariablesinProcessState.cpp
- mArgC=argc;//全局变量
- mArgV=argv;//全局变量
- mArgLen=0;
- for(inti=0;i<argc;i++){
- mArgLen+=strlen(argv[i])+1;
- }
- mArgLen--;
- AppRuntimeruntime;//定义AppRuntime
- constchar*arg;
- constchar*argv0;
- argv0=argv[0];//argv0="/system/bin/app_process"
- //Processcommandlinearguments
- //ignoreargv[0]
- argc--;
- argv++;
- //Everythingupto'--'orfirstnon'-'arggoestothevm
- inti=runtime.addVmArguments(argc,argv);//将参数加到虚拟机,待会分析,应该是把-Xzygote加入虚拟机了
- //Nextargisparentdirectory
- if(i<argc){
- runtime.mParentDir=argv[i++];//设置父目录为/system/bin
- }
- //
- //Nextargisstartupclassnameor"--zygote"
- if(i<argc){
- arg=argv[i++];
- if(0==strcmp("--zygote",arg)){
- boolstartSystemServer=(i<argc)?
- strcmp(argv[i],"--start-system-server")==0:false;//正常情况是true
- setArgv0(argv0,"zygote");
- set_process_name("zygote");
- runtime.start("com.android.internal.os.ZygoteInit",
- startSystemServer);//启动java的zygoteInit
- }else{
- set_process_name(argv0);
- runtime.mClassName=arg;
- //Remainderofargsgetpassedtostartupclassmain()
- runtime.mArgC=argc-i;
- runtime.mArgV=argv+i;
- LOGV("Appprocessisstartingwithpid=%d,class=%s./n",
- getpid(),runtime.getClassName());
- runtime.start();
- }
- }else{
- LOG_ALWAYS_FATAL("app_process:noclassnameor--zygotesupplied.");
- fprintf(stderr,"Error:noclassnameor--zygotesupplied./n");
- app_usage();
- return10;
- }
- }
从上面代码注释可以看出,很多工作都交给了Runtime对象来处理,这个runtime对象也是在这个cpp文件中定义的。我们来看一下。
[cpp:collapse] + expand source view plain copy print ?
- classAppRuntime:publicAndroidRuntime//基类是AndroidRuntime,待会分析下是干嘛的
- {
- public:
- AppRuntime()
- :mParentDir(NULL)
- ,mClassName(NULL)
- ,mArgC(0)
- ,mArgV(NULL)
- {
- }
- #if0
- //thisappearstobeunused
- constchar*getParentDir()const
- {
- returnmParentDir;
- }
- #endif
- constchar*getClassName()const
- {
- returnmClassName;
- }
- virtualvoidonStarted()//下面几个onXXX应该是回调用的,可能是JNI回调
- {
- sp<ProcessState>proc=ProcessState::self();
- if(proc->supportsProcesses()){
- LOGV("Appprocess:startingthreadpool./n");
- proc->startThreadPool();
- }
- app_init(mClassName,mArgC,mArgV);
- if(ProcessState::self()->supportsProcesses()){
- IPCThreadState::self()->stopProcess();
- }
- }
- virtualvoidonZygoteInit()
- {
- sp<ProcessState>proc=ProcessState::self();
- if(proc->supportsProcesses()){
- LOGV("Appprocess:startingthreadpool./n");
- proc->startThreadPool();
- }
- }
- virtualvoidonExit(intcode)
- {
- if(mClassName==NULL){
- //ifzygote
- if(ProcessState::self()->supportsProcesses()){
- IPCThreadState::self()->stopProcess();
- }
- }
- AndroidRuntime::onExit(code);
- }
- constchar*mParentDir;
- constchar*mClassName;
- intmArgC;
- constchar*const*mArgV;
- };
- }
其中,基类AndroidRuntime.h在frameworks/base/include/android_runtime/AndroidRuntime.h中定义。大概看看里边都定义了些什么。
[cpp:collapse] + expand source view plain copy print ?
- namespaceandroid{
- //这个类是与java虚拟机交互的一个类。
- //估计java虚拟机由它启动了
- classAndroidRuntime
- {
- public:
- AndroidRuntime();
- virtual~AndroidRuntime();
- /**
- *Registerasetofmethodsinthespecifiedclass.
- */
- staticintregisterNativeMethods(JNIEnv*env,
- constchar*className,constJNINativeMethod*gMethods,intnumMethods);
- /**
- *CallastaticJavafunctionthattakesnoargumentsandreturnsvoid.
- */
- status_tcallStatic(constchar*className,constchar*methodName);
- /**
- *Callaclass'sstaticmainmethodwiththegivenarguments,
- */
- status_tcallMain(constchar*className,intargc,constchar*constargv[]);
- /**
- *Findaclass,withtheinputeitheroftheform
- *"package/class"or"package.class".
- */
- staticjclassfindClass(JNIEnv*env,constchar*className);
- intaddVmArguments(intargc,constchar*constargv[]);
- voidstart(constchar*classname,constboolstartSystemServer);
- voidstart();//startinandroid.util.RuntimeInit
- staticAndroidRuntime*getRuntime();
- /**
- *ThisgetscalledaftertheJavaVMhasinitialized.Overrideit
- *withthesystem'snativeentrypoint.
- */
- virtualvoidonStarted()=0;
- /**
- *ThisgetscalledaftertheJavaVMhasinitializedafteraZygote
- *fork.Overrideittoinitializethreads,etc.Uponreturn,the
- *correctstaticmainwillbeinvoked.
- */
- virtualvoidonZygoteInit(){};
- /**
- *CalledwhentheJavaapplicationexits.Thedefault
- *implementationcallsexit(code).
- */
- virtualvoidonExit(intcode);
- /**createanewthreadthatisvisiblefromJava*/
- staticvoidcreateJavaThread(constchar*name,void(*start)(void*),
- void*arg);
- /**returnapointertotheVMrunninginthisprocess*/
- staticJavaVM*getJavaVM(){returnmJavaVM;}
- /**returnapointertotheJNIEnvpointerforthisthread*/
- staticJNIEnv*getJNIEnv();
- private:
- staticintstartReg(JNIEnv*env);
- intstartVm(JavaVM**pJavaVM,JNIEnv**pEnv);
- Vector<JavaVMOption>mOptions;
- /*JNIJavaVMpointer*/
- staticJavaVM*mJavaVM;
- /*
- *Threadcreationhelpers.
- */
- staticintjavaCreateThreadEtc(
- android_thread_func_tentryFunction,
- void*userData,
- constchar*threadName,
- int32_tthreadPriority,
- size_tthreadStackSize,
- android_thread_id_t*threadId);
- staticintjavaThreadShell(void*args);
- };
- //ReturnstheUnixfiledescriptorforaParcelFileDescriptorobject
- externintgetParcelFileDescriptorFD(JNIEnv*env,jobjectobject);
- }
AndroidRuntime类主要是和java打交道,而且好像只能由framework调用才能起作用,一般我自己的jni库都不用AndroidRuntime里边定义的方便函数,虽然都是static。原因如下(必须看看它的实现文件才知道原因)
[cpp] view plain copy print ?- //看来系统有一个全局的mJavaVM
- JavaVM*AndroidRuntime::mJavaVM=NULL;
- //整个系统范围内,第一次调用构造函数的应该就是在app_process中的吧?!
- AndroidRuntime::AndroidRuntime()
- {
- SkGraphics::Init();
- //thissetsourpreferencefor16bitimagesduringdecode
- //incasethesrcisopaqueand24bit
- SkImageDecoder::SetDeviceConfig(SkBitmap::kRGB_565_Config);
- //Thiscacheissharedbetweenbrowsernativeimages,andjava"purgeable"
- //bitmaps.Thisglobalpoolisforimagesthatdonoteitherusethejava
- //heap,orarenotbackedbyashmem.SeeBitmapFactory.cppforthekey
- //javacallsite.
- SkImageRef_GlobalPool::SetRAMBudget(512*1024);
- //Thereisalsoaglobalfontcache,butitsbudgetisspecifiedincode
- //seeSkFontHost_android.cpp
- //Pre-allocateenoughspacetoholdafairnumberofoptions.
- mOptions.setCapacity(20);
- assert(gCurRuntime==NULL);//oneperprocess
- gCurRuntime=this;
- }
- //刚才那几个onXXX函数就是在这里调用的,估计是java层调用的
- staticvoidcom_android_internal_os_RuntimeInit_finishInit(JNIEnv*env,jobjectclazz)
- {
- gCurRuntime->onStarted();
- }
- staticvoidcom_android_internal_os_RuntimeInit_zygoteInit(JNIEnv*env,jobjectclazz)
- {
- gCurRuntime->onZygoteInit();
- }
- staticjintcom_android_internal_os_RuntimeInit_isComputerOn(JNIEnv*env,jobjectclazz)
- {
- return1;
- }
- staticvoidcom_android_internal_os_RuntimeInit_turnComputerOn(JNIEnv*env,jobjectclazz)
- {
- }
- staticjintcom_android_internal_os_RuntimeInit_getQwertyKeyboard(JNIEnv*env,jobjectclazz)
- {
- char*value=getenv("qwerty");
- if(value!=NULL&&strcmp(value,"true")==0){
- return1;
- }
- return0;
- }
- //略去一些
- intAndroidRuntime::addVmArguments(intargc,constchar*constargv[])
- {
- inti;
- for(i=0;i<argc;i++){
- if(argv[i][0]!='-'){
- returni;
- }
- if(argv[i][1]=='-'&&argv[i][2]==0){
- returni+1;
- }
- //此时虚拟机还没有起来,先把这些options保存起来
- JavaVMOptionopt;
- memset(&opt,0,sizeof(opt));
- opt.optionString=(char*)argv[i];
- mOptions.add(opt);
- }
- returni;
- }
该cpp位置在/frameworks/base/core/jni/AndroidRuntime.cpp中。
回到app_process的main中,此处已运到到runtime.start("com.android.internal.os.ZygoteInit", startSystemServer)这句话来了,应进去看看start到底干了什么。
说来说去,不如看代码分析。
更多相关文章
- Android(安卓)Wifi模块分析(三)
- Android中dispatchDraw分析
- Android(安卓)Chromium WebView html js 开发系列
- Android四大基本组件介绍与生命周期
- Android(安卓)Service AIDL
- Android(安卓)bluetooth介绍(四): a2dp connect流程分析
- Android调用天气预报的WebService简单例子
- android打电话发短信
- android 拨打紧急号码,通话时开启免提功能实现