Android的本質是在標準的Linux系統中加入JAVA虛擬機Dalvik,在Dalvik虛擬機上構建JAVA應用框架。所有的應用程序都基於Java應用程序框架。
Android分為四層,從上到下分別是應用層、應用框架層、系統運行層和linux核心層。
2.營造環境
構建開發環境
國內開發者最痛苦的是無法訪問android開發網站。為了更好的了解世界,程序員翻墻帶妳領略墻外的世界也是壹種技術。好了,不說廢話了。國內開發者在androiddevtools上有妳想要的所有資源,可以下載到我們的主角框架。
但是這種構造只能讀取源代碼,無法進壹步實現自己的rom。我們看到錘子的系統重新實現了早期開放rom中的框架代碼,現在看來他成功了,所以我們要搭建android系統的源代碼編譯環境。
構建源代碼編譯環境
三。開場主題
寫壹個C程序的開頭,有壹個運行入口,比如
# include & ltiostream & gt
# include & ltcmath & gt
# include & lt算法& gt
使用命名空間std
//這裏主要是應用的入口。
int main(int argc,const char * argv[]){
返回0;
}
在計算機網絡原理中,我們用socket來實現壹個服務器,不斷地回答客戶端的訪問,他的代碼實現如下:
# include & ltwinsock2.h & gt
#pragma註釋(lib," WS2_32.lib ")
# include & ltstdio.h & gt
void main()
{
WORD wVersionRequested//版本號
WSADATA wsaData
int err
wVersionRequested = MAKEWORD(2,2);//版本2.2套接字
//加載套接字庫,失敗則返回。
err = wsa startup(wVersionRequested,& ampwsa data);
如果(呃!= 0)
{
返回;
}
//判斷高低字節是否為2,如果不是2.2版本則退出。
if (LOBYTE(wsaData.wVersion)!= 2 ||
HIBYTE(wsaData.wVersion)!= 2)
{
返回;
}
//創建壹個基於TCP的流套接字(SOCK_STREAM)。
SOCKET socSrv = socket(AF_INET,SOCK_STREAM,0);
//創建//套接字地址結構
SOCKADDR _ IN addrSrv
addrSrv.sin_addr。S_un。s _ addr = htonl(in addr _ ANY);//將無符號長整型轉換為網絡字節序格。
addrSrv.sin _ family = AF _ INET//指定地址簇
addr SRV . sin _ port = htons(6000);
//指定端口號。除了sin_family參數,其他參數都是網絡字節順序,所以需要轉換。
//將套接字綁定到端口號和本地地址。
bind(socSrv,(SOCKADDR *)& amp;addrSrv,sizeof(SOCKADDR));//sizeof必須用,strlen不能。
聽(socSrv,5);
SOCKADDR _ IN addrClient//詞義這個詞用來接收客戶端套接字的結構。
int len = sizeof(SOCKADDR);//初始化參數,必須初始化,sizeof。
//循環等待接受客戶端發送的請求。
while (1)
{
//等待客戶的要求;當請求到來時,接受連接請求,
//返回與此連接對應的新套接字。
//程序此時被阻止在這裏。
SOCKET sockConn = accept(socSrv,(SOCKADDR *)& amp;addr client & amp;len);
char send buf[100];
sprintf(sendBuf,"歡迎%s來到JoyChou ",
inet _ ntoa(addr client . sin _ addr));//打印格式
//用返回的套接字與客戶端通信。
send(sockConn,sendBuf,strlen(sendBuf)+1,0);//再發送壹個字節
//接收數據
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\\n ",recvBuf);
close socket(sock conn);
}
}
他使用while無限循環來監聽客戶的請求。
首先是源代碼
公共期末課堂活動線程{
公共靜態void main(String[] args) {
samplingprofilerintegration . start();
close guard . set enabled(false);
environment . initforcurrentuser();
event logger . set reporter(new EventLoggingReporter());
security . add provider(new AndroidKeyStoreProvider());
最終文件configDir = environment . getuserconfigdirect(user handle . my userid());
trustedcertificatestore . set defaultuser directory(configDir);
process . setargv 0(" & lt;預初始化>);
looper . prepare main looper();
//可以看到已經為app開辟了壹個線程,進入了looper。
activity thread thread = new activity thread();
thread . attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread . gethandler();
}
async task . init();
if (false) {
Looper.myLooper()。setMessageLogging(新
日誌打印機(日誌。DEBUG," activity thread "));
}
looper . loop();
拋出new RuntimeException("主線程循環意外退出");
}
}
看到源代碼我很失望。沒有while循環。其實是通過其他方法實現的。
//使用循環機制進行循環並偵聽響應。
looper . prepare main looper();
looper . loop();
深入研究代碼
公共靜態void循環(){
最終Looper me = my Looper();
if (me == null) {
拋出new runtime exception(" No Looper;此線程上未調用Looper.prepare()。);
}
final message queue queue = me . mqueue;
binder . clearcallingidentity();
final long ident = binder . clearcallingidentity();
//我在這裏看到了壹個循環的監聽消息。
for(;;) {
message msg = queue . next();//可能會阻止
if (msg == null) {
//沒有消息表示消息隊列正在退出。
返回;
}
打印機日誌= me.mLogging
如果(日誌記錄!= null) {
logging . println(" & gt;& gt& gt& gt& gt分派到"+ msg.target + " " +
msg . callback+":"+msg . what);
}
msg . target . dispatch message(msg);
如果(日誌記錄!= null) {
logging . println(" & lt;& lt& lt& lt& lt完成到“+msg . target+”+msg . callback);
}
//確保在調度過程中
//線程的標識沒有損壞。
final long new ident = binder . clearcallingidentity();
如果(ident!= newIdent) {
Log.wtf(標記,“線程標識已從0x更改”
+ Long.toHexString(ident) +"到0x "
+ Long.toHexString(newIdent) +"當分派到"
+ msg.target.getClass()。getName() +" "
+msg . callback+" what = "+msg . what);
}
msg . recycle checked();
}
}