一.认识android的架构Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的applicationframework,所有的应用程序都是基于JAVA的applicationframework之上。android分为四个层,从高层到盯誉低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。二.搭建环境搭建开发环境对国内的开发者来说最痛苦的是无法去访问android开发网站。为了更好的认识世界,对程序员来说,会翻墙也是的一门技术,带你去领配谨略墙外的世界,好了,不废话了,国内开发者访问(androiddevtools)上面已经有了所有你要的资源,同时可以下载到我们的主角framework但是这样的搭建只能去阅读源代码,我们无法去更进一步去实现自己的rom,我们看到锤子的系统在早期的开放rom是自己从新实现了framework的代码,现在看起来他成功了,所以我们还要去搭建android系统的源码编译环境。搭建源码编译环境http://www.cnblogs.com/bluestorm/p/4419135.htmlhttps://source.android.com/source/downloading.html(这里详细的介绍了如何下载编译)三.开始主题在一开始写c程序的时候都有一个运行的入口,比如#include#include#includeusingnamespacestd;//这里的main就是应用的入口intmain(intargc,constchar*argv[]){return0;}在计算机网络原理中我们用socket实现一个服务器端,不断的接听客户端的访问,而且他的代码是这样实现的:#include#pragmacomment(lib,"WS2_32.lib")#includevoidmain(){WORDwVersionRequested;//版本号WSADATAwsaData;interr;wVersionRequested=MAKEWORD(2,2);//2.2版本的套接字//加载套接字库,如果失败返回err=WSAStartup(wVersionRequested,&wsaData);if(err!=0){return;}//判断高低字节是不是2,如果不是2.2的版本则退出if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){return;}//创建流式套接字,基于TCP(SOCK_STREAM)SOCKETsocSrv=socket(AF_INET,SOCK_STREAM,0);//Socket地址结构体的创建SOCKADDR_INaddrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsignedlong型为网络字节序格addrSrv.sin_family=AF_INET;//指定地址簇addrSrv.sin_port=htons(6000);//指定端口号,除凯卖段sin_family参数外,其它参数都是网络字节序,因此需要转换//将套接字绑定到一个端口号和本地地址上bind(socSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//必须用sizeof,strlen不行listen(socSrv,5);SOCKADDR_INaddrClient;//字义用来接收客户端Socket的结构体intlen=sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof//循环等待接受客户端发送请求while(1){//等待客户请求到来;当请求到来后,接受连接请求,//返回一个新的对应于此次连接的套接字(accept)。//此时程序在此发生阻塞SOCKETsockConn=accept(socSrv,(SOCKADDR*)&addrClient,&len);charsendBuf[100];sprintf(sendBuf,"Welcome%stoJoyChou",inet_ntoa(addrClient.sin_addr));//格式化输出//用返回的套接字和客户端进行通信send(sockConn,sendBuf,strlen(sendBuf)+1,0);//多发送一个字节//接收数据charrecvBuf[100];recv(sockConn,recvBuf,100,0);printf("%s\\n",recvBuf);closesocket(sockConn);}}他采用了一个while死循环去监听客户端的请求。在一遍啰嗦之后,主角终于闪亮的登场了。先上源代码publicfinalclassActivityThread{publicstaticvoidmain(String[]args){SamplingProfilerIntegration.start();CloseGuard.setEnabled(false);Environment.initForCurrentUser();EventLogger.setReporter(newEventLoggingReporter());Security.addProvider(newAndroidKeyStoreProvider());finalFileconfigDir=Environment.getUserConfigDirectory(UserHandle.myUserId());TrustedCertificateStore.setDefaultUserDirectory(configDir);Process.setArgV0("");Looper.prepareMainLooper();//从中可以看到为app开辟了一个线程进入了looper之中ActivityThreadthread=newActivityThread();thread.attach(false);if(sMainThreadHandler==null){sMainThreadHandler=thread.getHandler();}AsyncTask.init();if(false){Looper.myLooper().setMessageLogging(newLogPrinter(Log.DEBUG,"ActivityThread"));}Looper.loop();thrownewRuntimeException("Mainthreadloopunexpectedlyexited");}}看到源码失望了,没有一个while循环啊,其实用了他方法实现//用一个looper的机制循环监听响应Looper.prepareMainLooper();Looper.loop();进一步深入代码publicstaticvoidloop(){finalLooperme=myLooper();if(me==null){thrownewRuntimeException("NoLooper;Looper.prepare()wasn'tcalledonthisthread.");}finalMessageQueuequeue=me.mQueue;Binder.clearCallingIdentity();finallongident=Binder.clearCallingIdentity();//在这里看到了一个循环监听消息for(;;){Messagemsg=queue.next();//mightblockif(msg==null){//Nomessageindicatesthatthemessagequeueisquitting.return;}Printerlogging=me.mLogging;if(logging!=null){logging.println(">>>>>Dispatchingto"+msg.target+""+msg.callback+":"+msg.what);}msg.target.dispatchMessage(msg);if(logging!=null){logging.println("<<<<