古詩詞大全網 - 個性簽名 - 如何構建android開發環境

如何構建android開發環境

1.了解android的架構

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();

}

}