Android应用程序启动过程源代码分析(4)
16lz
2022-07-25
Step 15. talkWithDriver 这个函数定义在frameworks/base/libs/binder/IPCThreadState.cpp文件中:
这个函数的具体作用可以参考 Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析 一文,它只要就是通过ioctl文件操作函数来和Binder驱动程序交互的了: [cpp] view plain copy
- status_tIPCThreadState::talkWithDriver(booldoReceive)
- {
- ......
- binder_write_readbwr;
- //Isthereadbufferempty?
- constboolneedRead=mIn.dataPosition()>=mIn.dataSize();
- //Wedon'twanttowriteanythingifwearestillreading
- //fromdataleftintheinputbufferandthecaller
- //hasrequestedtoreadthenextdata.
- constsize_toutAvail=(!doReceive||needRead)?mOut.dataSize():0;
- bwr.write_size=outAvail;
- bwr.write_buffer=(longunsignedint)mOut.data();
- //Thisiswhatwe'llread.
- if(doReceive&&needRead){
- bwr.read_size=mIn.dataCapacity();
- bwr.read_buffer=(longunsignedint)mIn.data();
- }else{
- bwr.read_size=0;
- }
- ......
- //Returnimmediatelyifthereisnothingtodo.
- if((bwr.write_size==0)&&(bwr.read_size==0))returnNO_ERROR;
- bwr.write_consumed=0;
- bwr.read_consumed=0;
- status_terr;
- do{
- ......
- #ifdefined(HAVE_ANDROID_OS)
- if(ioctl(mProcess->mDriverFD,BINDER_WRITE_READ,&bwr)>=0)
- err=NO_ERROR;
- else
- err=-errno;
- #else
- err=INVALID_OPERATION;
- #endif
- ......
- }
- }while(err==-EINTR);
- ....
- if(err>=NO_ERROR){
- if(bwr..write_consumed>0){
- if(bwr.write_consumed<(ssize_t)mOut.dataSize())
- mOut.remove(0,bwr.write_consumed);
- else
- mOut.setDataSize(0);
- }
- if(bwr.read_consumed>0){
- mIn.setDataSize(bwr.read_consumed);
- mIn.setDataPosition(0);
- }
- ......
- returnNO_ERROR;
- }
- returnerr;
- }
- ioctl(mProcess->mDriverFD,BINDER_WRITE_READ,&bwr)
前面我们说过,这里传进来的参数className字符串值为"android.app.ActivityThread",这里就通ClassLoader.loadClass函数将它加载到进程中: [java] view plain copy
- publicclassZygoteInit{
- ......
- staticvoidinvokeStaticMain(ClassLoaderloader,
- StringclassName,String[]argv)
- throwsZygoteInit.MethodAndArgsCaller{
- Class<?>cl;
- try{
- cl=loader.loadClass(className);
- }catch(ClassNotFoundExceptionex){
- ......
- }
- Methodm;
- try{
- m=cl.getMethod("main",newClass[]{String[].class});
- }catch(NoSuchMethodExceptionex){
- ......
- }catch(SecurityExceptionex){
- ......
- }
- intmodifiers=m.getModifiers();
- ......
- /*
- *ThisthrowgetscaughtinZygoteInit.main(),whichresponds
- *byinvokingtheexception'srun()method.Thisarrangement
- *clearsupallthestackframesthatwererequiredinsetting
- *uptheprocess.
- */
- thrownewZygoteInit.MethodAndArgsCaller(m,argv);
- }
- ......
- }
- cl=loader.loadClass(className);
- m=cl.getMethod("main",newClass[]{String[].class});
它执行MethodAndArgsCaller的run函数:
- publicclassZygoteInit{
- ......
- publicstaticvoidmain(Stringargv[]){
- try{
- ......
- }catch(MethodAndArgsCallercaller){
- caller.run();
- }catch(RuntimeExceptionex){
- ......
- }
- }
- ......
- }
这里的成员变量mMethod和mArgs都是在前面构造异常对象时传进来的,这里的mMethod就对应android.app.ActivityThread类的main函数了,于是最后就通过下面语句执行这个函数: [java] view plain copy
- publicclassZygoteInit{
- ......
- publicstaticclassMethodAndArgsCallerextendsException
- implementsRunnable{
- /**methodtocall*/
- privatefinalMethodmMethod;
- /**argumentarray*/
- privatefinalString[]mArgs;
- publicMethodAndArgsCaller(Methodmethod,String[]args){
- mMethod=method;
- mArgs=args;
- }
- publicvoidrun(){
- try{
- mMethod.invoke(null,newObject[]{mArgs});
- }catch(IllegalAccessExceptionex){
- ......
- }catch(InvocationTargetExceptionex){
- ......
- }
- }
- }
- ......
- }
- mMethod.invoke(null,newObject[]{mArgs});
从这里我们可以看出,这个函数首先会在进程中创建一个ActivityThread对象: [java] view plain copy
- publicfinalclassActivityThread{
- ......
- publicstaticfinalvoidmain(String[]args){
- SamplingProfilerIntegration.start();
- Process.setArgV0("<pre-initialized>");
- Looper.prepareMainLooper();
- if(sMainThreadHandler==null){
- sMainThreadHandler=newHandler();
- }
- ActivityThreadthread=newActivityThread();
- thread.attach(false);
- if(false){
- Looper.myLooper().setMessageLogging(new
- LogPrinter(Log.DEBUG,"ActivityThread"));
- }
- Looper.loop();
- if(Process.supportsProcesses()){
- thrownewRuntimeException("Mainthreadloopunexpectedlyexited");
- }
- thread.detach();
- Stringname=(thread.mInitialApplication!=null)
- ?thread.mInitialApplication.getPackageName()
- :"<unknown>";
- Slog.i(TAG,"Mainthreadof"+name+"isnowexiting");
- }
- ......
- }
- ActivityThreadthread=newActivityThread();
- Looper.loop();
更多相关文章
- 箭头函数的基础使用
- Python技巧匿名函数、回调函数和高阶函数
- 浅析android通过jni控制service服务程序的简易流程
- Android(安卓)bluetooth介绍(四): a2dp connect流程分析
- Android架构分析之使用自定义硬件抽象层(HAL)模块
- 2011年Android(安卓)Camera学习笔记之一
- [置顶] Android(安卓)跨进程通信Aidl的使用及注意事项
- Android执行shell命令
- Android中OpenMax的适配层