當前位置:首頁 » 安卓系統 » android源碼框架

android源碼框架

發布時間: 2023-03-12 03:19:16

⑴ android源碼里有哪些比較好的演算法或框架推薦

Android中對於圖形界面以及多媒體的相關操作比較容易實現。而且對於大多數
手機
用戶來說,他們主要也就是根據這些方面的功能來對系統那個進行修改。我們可以通過本文介紹的Android多媒體框架的源碼解讀,來具體分析一下這方面的基本知識。
Android多媒體框架的代碼在以下目錄中:external/opencore/。這個目錄是Android多媒體框架的根目錄,其中包含的子目錄如下所示:
* android:這裡面是一個上層的庫,它基於PVPlayer和PVAuthor的SDK實現了一個為Android使用的Player和Author。
* baselibs:包含數據結構和線程安全等內容的底層庫
* codecs_v2:這是一個內容較多的庫,主要包含編解碼的實現,以及一個OpenMAX的實現
* engines:包含PVPlayer和PVAuthor引擎的實現
* extern_libs_v2:包含了khronos的OpenMAX的頭文件
* fileformats:文件格式的據具體解析(parser)類
* nodes:編解碼和文件解析的各個node類。
* oscl:操作系統兼容庫
* pvmi: 輸入輸出控制的抽象介面
* protocols:主要是與網路相關的RTSP、RTP、HTTP等協議的相關內容
* pvcommon:pvcommon庫文件的Android.mk文件,沒有源文件。
* pvplayer:pvplayer庫文件的Android.mk文件,沒有源文件。
* pvauthor:pvauthor庫文件的Android.mk文件,沒有源文件。
* tools_v2:編譯工具以及一些可注冊的模塊。
Splitter的定義與初始化
以wav的splitter為例,在fileformats目錄下有解析wav文件格式的pvwavfileparser.cpp文件,在nodes目錄下有pvmf_wavffparser_factory.cpp,pvmf_wavffparser_node.h, pvmf_wavffparser_port.h等文件。
我們由底往上看,vwavfileparser.cpp中的PV_Wav_Parser類有InitWavParser(),GetPCMData(),RetrieveFileInfo()等解析wav格式的成員函數,此類應該就是最終的解析類。我們搜索PV_Wav_Parser類被用到的地方可知,在PVMFWAVFFParserNode類中有PV_Wav_Parser的一個指針成員變數。
再搜索可知,PVMFWAVFFParserNode類是通過PVMFWAVFFParserNodeFactory的CreatePVMFWAVFFParserNode()成員函數生成的。而CreatePVMFWAVFFParserNode()函數是在PVPlayerNodeRegistry::PVPlayerNodeRegistry()類構造函數中通過PVPlayerNodeInfo類被注冊到Oscl_Vector<PVPlayerNodeInfo, OsclMemAllocator> 的vector中,在這個構造函數中,AMR,mp3等node也是同樣被注冊的。
由上可知,Android多媒體框架中對splitter的管理也是與ffmpeg等類似,都是在框架的初始化時注冊的,只不過Opencore注冊的是每個splitter的factory函數。
綜述一下splitter的定義與初始化過程:
每個splitter都在fileformats目錄下有個對應的子目錄,其下有各自的解析類。
每個splitter都在nodes目錄下有關對應的子目錄,其下有各自的統一介面的node類和node factory類。
播放引擎PVPlayerEngine類中有PVPlayerNodeRegistry iPlayerNodeRegistry成員變數。
在PVPlayerNodeRegistry的構造函數中,將 AMR, AAC, MP3等splitter的輸入與輸出類型標示和node factory類中的create node與release delete介面通過PVPlayerNodeInfo類push到Oscl_Vector<PVPlayerNodeInfo, OsclMemAllocator> iType成員變數中。
當前Splitter的匹配過程
PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType& aOutputType, Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids)函數的功能是根據輸入類型和輸出類型,在已注冊的node vector中尋找是否有匹配的node,有的話傳回其唯一識別標識PVUuid。
從QueryRegistry這個函數至底向上搜索可得到,在android中splitter的匹配過程如下:
android_media_MediaPlayer.cpp之中定義了一個JNINativeMethod(java本地調用方法)類型的數組gMethods,供java代碼中調用MultiPlayer類的setDataSource成員函數時找到對應的c++函數
1.{"setDataSource", "(Ljava/lang/String;)V", (void *)
android_media_MediaPlayer_setDataSource},
2.static void android_media_MediaPlayer_setDataSource
(JNIEnv *env, jobject thiz, jstring path)
此函數中先得到當前的MediaPlayer實例,然後調用其setDataSource函數,傳入路徑
3.status_t MediaPlayer::setDataSource(const char *url)
此函數通過調getMediaPlayerService()先得到當前的MediaPlayerService, const sp<IMediaPlayerService>& service(getMediaPlayerService());
然後新建一個IMediaPlayer變數, sp<IMediaPlayer> player(service->create(getpid(), this, fd, offset, length));
在sp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url)中
調status_t MediaPlayerService::Client::setDataSource(const char *url)函數,Client是MediaPlayerService的一個內部類。
在MediaPlayerService::Client::setDataSource中,調sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType)
生成一個繼承自MediaPlayerBase的PVPlayer實例。

⑵ android開發一般都使用什麼框架

Android開發框架介紹
編輯文檔
學分 +2
開發框架方麵包含基本的應用功能開發、數據存儲、網路訪問這三大塊:
一、應用方面
一般而言一個標準的Android程序由如下4部分組成即Activity、Broadcast Intent Receiver、Service、Content Provider: 1. Activity是最頻繁、最基本的模塊,在Android中,一個Activity就是手機上一屏,相當於一個網頁一樣,所不同的是,每個Activity運行結束了,有個返回值,類似一個函數一樣。Android系統會自動記錄從首頁到其他頁面的所有跳轉記錄並且自動將以前的Activity壓入系統堆棧,用戶可以通過編程的方式刪除歷史堆棧中的Activity Instance。
Activity類中主要是跟界面資源文件關聯起來(res/layout目錄下的xml資源,也可以不含任何界面資源),內部包含控制項的顯示設計、界面交互設計、事件的響應設計以及數據處理設計、導航設計等application設計的方方面面。 2. Broadcast Intent Receiver
Intent提供了各種不同Activity進行跳轉的機制,譬如如果從A activity跳轉到B activity,使用Intent來實現如下: Intent in = new Intent(A.this, B.class); startActivity(in);
BroadcastReceiver提供了各種不同的Android應用程序進行進行進程間通訊的機制,譬如當電話呼叫來臨時,可以通過BroadcastReceiver發布廣播消息。對於用戶而言,BroadcastReceiver是不透明的,用戶無法看到這個事件,BroadcastReceiver通過NotificationManager來通知用戶這些事件發生了,它既可以在資源AndroidManifest.xml中注冊,也可以在代碼中通過Context.registerReceiver()進行注冊,只要是注冊了,當事件來臨的時候,即時程序沒有啟動,系統也在需要的時候會自動啟動此應用程序;另外各應用程序很方便地通過Context.sendBroadcast()將自己的事情廣播給其他應用程序;
3. Service,跟Windows當中的Service完全是一個概念,用戶可以通過startService(Intent service)啟動一個Service,也可通過Context.bindService來綁定一個Service.
4. Content Provider,由於Android應用程序內部的數據都是私有的,Content Provider提供了應用程序之間數據交換的機制,一個程序可以通過實現一個ContentProvider的抽象介面將自己的數據暴露出去,並且隱蔽了具體的數據存儲實現,標準的ContentProvider提供了基本的CRUD(Create,Read,Update,Delete)的介面,並且實現了許可權機制,保護了數據交互的安全性; 一個標準的Android應用程序的工程文件包含如下幾大部分: -> Java源代碼部分(包含Activity),都在src目錄當中;
-> R.java文件,這個文件是Eclipse自動生成與維護的,開發者不需要修改,提供了Android對的資源全局索引; -> Android Library,這個是應用運行的Android庫;
-> assets目錄,這個目錄裡面主要用與放置多媒體等一些文件;
-> res目錄,放置的是資源文件,跟VC中的資源目錄基本類似,其中的drawable包含的是圖片文件,layout裡麵包含的是布局文件,values目錄裡面主要包含的是字元串(strings.xml)、顏色(colors.xml)以及數組(arrays.xml)資源;
-> AndroidManifest.xml,這個文件異常重要,是整個應用的配置文件,在這個文件中,需要聲明所有用到的Activity、Service、Receiver等。

⑶ Android源碼解析RPC系列(一)---Binder原理

看了幾天的Binder,決定有必要寫一篇博客,記錄一下學習成果,Binder是Android中比較綜合的一塊知識了,目前的理解只限於JAVA層。首先Binder是幹嘛用的?不用說,跨進程通信全靠它,操作系統的不同進程之間,數據不共享,對於每個進程來說,它都天真地以為自己獨享了整個系統,完全不知道其他進程的存在,進程之間需要通信需要某種系統機制才能完成,在Android整個系統架構中,採用了大量的C/S架構的思想,所以Binder的作用就顯得非常重要了,但是這種機制為什麼是Binder呢?在Linux中的RPC方式有管道,消息隊列,共享內存等,消息隊列和管道採用存儲-轉發方式,即數據先從發送方緩存區拷貝到內核開辟的緩存區中,然後再從內核緩存區拷貝到接收方緩存區,這樣就有兩次拷貝過程。共享內存不需要拷貝,但控制復雜,難以使用。Binder是個折中的方案,只需要拷貝一次就行了。其次Binder的安全性比較好,好在哪裡,在下還不是很清楚,基於安全性和傳輸的效率考慮,選擇了Binder。Binder的英文意思是粘結劑,Binder對象是一個可以跨進程引用的對象,它的實體位於一個進程中,這個進程一般是Server端,該對象提供了一套方法用以實現對服務的請求,而它的引用卻遍布於系統的各個進程(Client端)之中,這樣Client通過Binder的引用訪問Server,所以說,Binder就像膠水一樣,把系統各個進程粘結在一起了,廢話確實有點多。

為了從而保障了系統的安全和穩定,整個系統被劃分成內核空間和用戶空間
內核空間:獨立於普通的應用程序,可以訪問受保護的內存空間,有訪問底層硬體設備的所有許可權。
用戶空間:相對與內核空間,上層運用程序所運行的空間就是用戶空間,用戶空間訪問內核空間的唯一方式就是系統調用。一個4G的虛擬地址空間,其中3G是用戶空間,剩餘的1G是內核空間。如果一個用戶空間想與另外一個用戶空間進行通信,就需要內核模塊支持,這個運行在內核空間的,負責各個用戶進程通過Binder通信的內核模塊叫做Binder驅動,雖然叫做Binder驅動,但是和硬體並沒有什麼關系,只是實現方式和設備驅動程序是一樣的,提供了一些標准文件操作。

在寫AIDL的時候,一般情況下,我們有兩個進程,一個作為Server端提供某種服務,然後另外一個進程作為Client端,連接Server端之後,就 可以使用Server裡面定義的服務。這種思想是一種典型的C/S的思想。值得注意的是Android系統中的Binder自身也是C/S的架構,也有Server端與Client端。一個大的C/S架構中,也有一個小的C/S架構。

先籠統的說一下,在整個Binder框架中,由系列組件組成,分別是Client、Server、ServiceManager和Binder驅動程序,其中Client、Server和ServiceManager運行在用戶空間,Binder驅動程序運行內核空間。運行在用戶空間中的Client、Server和ServiceManager,是在三個不同進程中的,Server進程中中定義了服務提供給Client進程使用,並且Server中有一個Binder實體,但是Server中定義的服務並不能直接被Client使用,它需要向ServiceManager注冊,然後Client要用服務的時候,直接向ServiceManager要,ServiceManager返回一個Binder的替身(引用)給Client,這樣Client就可以調用Server中的服務了。

場景 :進程A要調用進程B裡面的一個draw方法處理圖片。

分析 :在這種場景下,進程A作為Client端,進程B做為Server端,但是A/B不在同一個進程中,怎麼來調用B進程的draw方法呢,首先進程B作為Server端創建了Binder實體,為其取一個字元形式,可讀易記的名字,並將這個Binder連同名字以數據包的形式通過Binder驅動發送給ServiceManager,也就是向ServiceManager注冊的過程,告訴ServiceManager,我是進程B,擁有圖像處理的功能,ServiceManager從數據包中取出名字和引用以一個注冊表的形式保留了Server進程的注冊信息。為什麼是以數據包的形式呢,因為這是兩個進程,直接傳遞對象是不行滴,只能是一些描述信息。現在Client端進程A聯系ServiceManager,說現在我需要進程B中圖像處理的功能,ServiceManager從注冊表中查到了這個Binder實體,但是呢,它並不是直接把這個Binder實體直接給Client,而是給了一個Binder實體的代理,或者說是引用,Client通過Binder的引用訪問Server。分析到現在,有個關鍵的問題需要說一下,ServiceManager是一個進程,Server是另一個進程,Server向ServiceManager注冊Binder必然會涉及進程間通信。當前實現的是進程間通信卻又要用到進程間通信,這就好象蛋可以孵出雞前提卻是要找只雞來孵蛋,確實是這樣的,ServiceManager中預先有了一個自己的Binder對象(實體),就是那隻雞,然後Server有個Binder對象的引用,就是那個蛋,Server需要通過這個Binder的引用來實現Binder的注冊。雞就一隻,蛋有很多,ServiceManager進程的Binder對象(實體)僅有一個,其他進程所擁有的全部都是它的代理。同樣一個Server端Binder實體也應該只有一個,對應所有Client端全部都是它的代理。

我們再次理解一下Binder是什麼?在Binder通信模型的四個角色裡面;他們的代表都是「Binder」,一個Binder對象就代表了所有,包括了Server,Client,ServiceManager,這樣,對於Binder通信的使用者而言,不用關心實現的細節。對Server來說,Binder指的是Binder實體,或者說是本地對象,對於Client來說,Binder指的是Binder代理對象,也就是Binder的引用。對於Binder驅動而言,在Binder對象進行跨進程傳遞的時候,Binder驅動會自動完成這兩種類型的轉換。

簡單的總結一下,通過上面一大段的分析,一個Server在使用的時候需要經歷三個階段

1、定義一個AIDL文件
Game.aidl

GameManager .aidl

2、定義遠端服務Service
在遠程服務中的onBind方法,實現AIDL介面的具體方法,並且返回Binder對象

3、本地創建連接對象

以上就是一個遠端服務的一般套路,如果是在兩個進程中,就可以進程通信了,現在我們分析一下,這個通信的流程。重點是GameManager這個編譯生成的類。

從類的關系來看,首先介面GameManager 繼承 IInterface ,IInterface是一個介面,在GameManager內部有一個內部類Stub,Stub繼承了Binder,(Binder實現了IBinder),並且實現了GameManager介面,在Stub中還有一個內部類Proxy,Proxy也實現了GameManager介面,一個整體的結構是這樣的

現在的問題是,Stub是什麼?Proxy又是什麼?在上面說了在Binder通信模型的四個角色裡面;他們的代表都是「Binder」,一個Binder對象就代表了所有,包括了Server,Clinet,ServiceManager,為了兩個進程的通信,系統給予的內核支持是Binder,在抽象一點的說,Binder是系統開辟的一塊內存空間,兩個進程往這塊空間裡面讀寫數據就行了,Stub從Binder中讀數據,Proxy向Binder中寫數據,達到進程間通信的目的。首先我們分析Stub。

Stub 類繼承了Binder ,說明了Stub有了跨進程傳輸的能力,實現了GameManager介面,說明它有了根據游戲ID查詢一個游戲的能力。我們在bind一個Service之後,在onServiceConnecttion的回調裡面,就是通過asInterface方法拿到一個遠程的service的。

asInterface調用queryLocalInterface。

mDescriptor,mOwner其實是Binder的成員變數,Stub繼承了Binder,在構造函數的時候,對著兩個變數賦的值。

如果客戶端和服務端是在一個進程中,那麼其實queryLocalInterface獲取的就是Stub對象,如果不在一個進程queryLocalInterface查詢的對象肯定為null,因為不同進程有不同虛擬機,肯定查不到mOwner對象的,所以這時候其實是返回的Proxy對象了。拿到Stub對象後,通常在onServiceConnected中,就把這個對象轉換成我們多定義AIDL介面。

比如我們這里會轉換成GameManager,有了GameManager對象,就可以調用後querryGameById方法了。如果是一個進程,那直接調用的是自己的querryGameById方法,如果不是一個進程,那調用了就是代理的querryGameById方法了。

看到其中關鍵的一行是

mRemote就是一個IBinder對象,相對於Stub,Proxy 是組合關系(HAS-A),內部有一個IBinder對象mRemote,Stub是繼承關系(IS-A),直接實現了IBinder介面。

transact是個native方法,最終還會回掉JAVA層的onTransact方法。

onTransact根據調用號(每個AIDL函數都有一個編號,在跨進程的時候,不會傳遞函數,而是傳遞編號指明調用哪個函數)調用相關函數;在這個例子裡面,調用了Binder本地對象的querryGameById方法;這個方法將結果返回給驅動,驅動喚醒掛起的Client進程裡面的線程並將結果返回。於是一次跨進程調用就完成了。

***Please accept mybest wishes for your happiness and success ! ***

⑷ Android TV 焦點原理源碼解析

相信很多剛接觸AndroidTV開發的開發者,都會被各種焦點問題給折磨的不行。不管是學技術還是學習其他知識,都要學習和理解其中原理,碰到問題我們才能得心應手。下面就來探一探Android的焦點分發的過程。

Android焦點事件的分發是從ViewRootImpl的processKeyEvent開始的,源碼如下:

源碼比較長,下面我就慢慢來講解一下具體的每一個細節。

dispatchKeyEvent方法返回true代表焦點事件被消費了。

ViewGroup的dispatchKeyEvent()方法的源碼如下:

(2)ViewGroup的dispatchKeyEvent執行流程

(3)下面再來瞧瞧view的dispatchKeyEvent方法的具體的執行過程

驚奇的發現執行了onKeyListener中的onKey方法,如果onKey方法返回true,那麼dispatchKeyEvent方法也會返回true

可以得出結論:如果想要修改ViewGroup焦點事件的分發,可以這么干:

注意:實際開發中,理論上所有焦點問題都可以通過給dispatchKeyEvent方法增加監聽來來攔截來控制。

(1)dispatchKeyEvent方法返回false後,先得到按鍵的方向direction值,這個值是一個int類型參數。這個direction值是後面來進行焦點查找的。

(2)接著會調用DecorView的findFocus()方法一層一層往下查找已經獲取焦點的子View。
ViewGroup的findFocus方法如下:

View的findFocus方法

說明:判斷view是否獲取焦點的isFocused()方法, (mPrivateFlags & PFLAG_FOCUSED) != 0 和view 的isFocused()方法是一致的。

其中isFocused()方法的作用是判斷view是否已經獲取焦點,如果viewGroup已經獲取到了焦點,那麼返回本身即可,否則通過mFocused的findFocus()方法來找焦點。mFocused其實就是ViewGroup中獲取焦點的子view,如果mView不是ViewGourp的話,findFocus其實就是判斷本身是否已經獲取焦點,如果已經獲取焦點了,返回本身。

(3)回到processKeyEvent方法中,如果findFocus方法返回的mFocused不為空,說明找到了當前獲取焦點的view(mFocused),接著focusSearch會把direction(遙控器按鍵按下的方向)作為參數,找到特定方向下一個將要獲取焦點的view,最後如果該view不為空,那麼就讓該view獲取焦點。

(4)focusSearch方法的具體實現。

focusSearch方法的源碼如下:

可以看出focusSearch其實是一層一層地網上調用父View的focusSearch方法,直到當前view是根布局(isRootNamespace()方法),通過注釋可以知道focusSearch最終會調用DecorView的focusSearch方法。而DecorView的focusSearch方法找到的焦點view是通過FocusFinder來找到的。

(5)FocusFinder是什麼?

它其實是一個實現 根據給定的按鍵方向,通過當前的獲取焦點的View,查找下一個獲取焦點的view這樣演算法的類。焦點沒有被攔截的情況下,Android框架焦點的查找最終都是通過FocusFinder類來實現的。

(6)FocusFinder是如何通過findNextFocus方法尋找焦點的。

下面就來看看FocusFinder類是如何通過findNextFocus來找焦點的。一層一層往下看,後面會執行findNextUserSpecifiedFocus()方法,這個方法會執行focused(即當前獲取焦點的View)的findUserSetNextFocus方法,如果該方法返回的View不為空,且isFocusable = true && isInTouchMode() = true的話,FocusFinder找到的焦點就是findNextUserSpecifiedFocus()返回的View。

(7)findNextFocus會優先根據XML里設置的下一個將獲取焦點的View ID值來尋找將要獲取焦點的View。

看看View的findUserSetNextFocus方法內部都幹了些什麼,OMG不就是通過我們xml布局裡設置的nextFocusLeft,nextFocusRight的viewId來找焦點嗎,如果按下Left鍵,那麼便會通過nextFocusLeft值里的View Id值去找下一個獲取焦點的View。

可以得出以下結論:

1. 如果一個View在XML布局中設置了focusable = true && isInTouchMode = true,那麼這個View會優先獲取焦點。

2. 通過設置nextFocusLeft,nextFocusRight,nextFocusUp,nextFocusDown值可以控制View的下一個焦點。

Android焦點的原理實現就這些。總結一下:

為了方便同志們學習,我這做了張導圖,方便大家理解~

⑸ 怎樣搭建一個android開發框架

搭建Android開發環境
准備工作:下載Eclipse、JDK、Android SDK、ADT插件
下載地址:Eclipse:http://www.eclipse.org/downloads/
JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk7u9-downloads-1859576.html
Android SDK:http://developer.android.com/sdk/index.html
ADT:http://developer.android.com/tools/sdk/eclipse-adt.html
1、安裝和配置JAVA開發環境:
①把准備好的Eclipse和JDK安裝到本機上(最好安裝在全英文路徑下),並給JDK配置環境變數,其中JDK的變數值為JDK安裝路徑的根目錄,如我的為:D:\Program Files\Java\jdk1.7.0_02;
②打開命令提示符(cmd),輸入java -version命令,顯示如下圖則說明JAVA環境變數已經配置好了。
2、安裝ADT插件:
①打開已安裝好的Eclipse,選擇菜單欄上的「Help」->在彈出的下拉框中單擊選擇「Install new software...」;
②在新打開的對話框中我們完全可以直接在"Work with"中輸入:https://dl-ssl.google.com/android/eclipse/在線安裝ADT插件,但由於Google的伺服器搭建在國外,所以通過這種方式安裝起來會比較慢,而且可能會出現人品差死活裝不上的情況,所以不推薦在線安裝。
③我推薦直接通過下載好的ADT插件壓縮包進行安裝(此種方式可以在離線環境下進行)。具體步驟是:在新打開的對話框中點擊「Add」按鈕->在打開的對話框中點擊「Archive」按鈕選擇之前已經下載好保存在本地硬碟的ADT插件壓縮包,至於上面的「Name」可以隨便取,這只是一個代號而已,沒什麼實際作用。
④在上一步中點擊「Ok」按鈕後我們會發現中間的空白處出現了兩行復選框,單擊"Select All"按鈕選中所有的復選框,這步過後一路「Next」,需要「Accept」的就選中「Accept」,直到點擊「Finish」結束,這樣ADT插件就安裝好了。整個過程需要的時間視機器性能而定。安裝好ADT插件後,Eclipse的工具欄會出現一排Android的圖標,如下圖:
3、安裝SDK:
①把下載好的Android SDK安裝到本機上(最好安裝在全英文路徑下),並為Android SDK配置環境變數。Android SDK的環境變數值為SDK安裝目錄下的platform-tools文件夾和tools文件夾子目錄路徑,如我的分別為:E:\My Studying\Android\android-sdk\platform-tools、E:\My Studying\Android\android-sdk\tools,在變數值中,兩個路徑用逗號隔開。
②打開命令提示符(cmd),分別輸入android -h和adb命令,顯示如下圖則說明Android SDK環境變數已經配置好了。
③打開Android SDK的安裝目錄,雙擊 "SDK Manager"->在打開的窗口中先選擇你需要安裝的SDK版本,其中「Status」表示該SDK包是否安裝,如我選的是「Android2.2(API 8)」(我的之前已經安裝過了,所以「Status」為「Installed」)->再點擊「Install packages...」按鈕,在彈出來的窗口中最好選「Accept All」這樣才能安裝你剛才選的所有的包->最後點「Install」按鈕就開始安裝了,整個過程會很慢,這需要你的耐心。
另外我們還可以通過在Eclipse上的工具欄中點擊下圖指示的圖標打開「SDK Manager」然後進行安裝,這樣和上面的SDK安裝方式一樣,就不累述了。
④最後再選擇Eclipes主菜單上的"Windows"->選擇"preferrnces";
⑤在彈出來的對話框中選中左邊欄的「Android」->通過右側的「Browse...」按鈕選擇SDK的安裝路徑根目錄->點擊最下方的「Ok」按鈕,這樣SDK就在Eclipse上載入成功了。
4、創建Android模擬器(AVD):
①打開Eclipse->在Eclipse的工具欄上單擊下圖指示的圖標打開「Android Virsual Device Manager」窗口;
②在「Android Virsual Device Manager」窗口單擊「New」按鈕->在彈出來的窗口中"Name"可以隨便取;「Target」指模擬器的系統版本;「SD Card」的"size"是指手機存儲卡的大小,只要你不在模擬器上裝太多的應用,一般給個二三十MB就夠了;「Skin」是指屏幕的解析度大小,其中「Built in」是一般手機常用標准屏幕解析度大小,而「Resolution」是自定義屏幕解析度大小,具體做法,可以根據自身情況選擇。->一切設置好後點擊「Create AVD」,這時一個模擬器就創建好了。如果有必要,我們可以創建多個模擬器用於測試時使用。
附:Android模擬器型號以及其對應的解析度大小:

Standard Width Height DAR Pixeis
HVGA 480 * 320 3:2 153,600
QVGA 320 * 240 4:3 76,800
WQVGA400 400 * 240 5:3 96,000
WQVGA432 432 * 240 9:5 103,680
WVGA800 800 * 480 5:3 384,000
WVGA852 854 * 480 409,920

至此為止,在Eclipse上就已經成功搭建Android開發環境了。

熱點內容
hadoop刪除文件夾 發布:2025-05-13 17:00:14 瀏覽:508
sql資料庫遠程備份 發布:2025-05-13 16:48:13 瀏覽:528
app什麼情況下找不到伺服器 發布:2025-05-12 15:46:25 瀏覽:714
php跳過if 發布:2025-05-12 15:34:29 瀏覽:467
不定時演算法 發布:2025-05-12 15:30:16 瀏覽:131
c語言延時1ms程序 發布:2025-05-12 15:01:30 瀏覽:167
動物園靈長類動物配置什麼植物 發布:2025-05-12 14:49:59 瀏覽:738
wifi密碼設置什麼好 發布:2025-05-12 14:49:17 瀏覽:150
三位數乘兩位數速演算法 發布:2025-05-12 13:05:48 瀏覽:399
暴風影音緩存在哪裡 發布:2025-05-12 12:42:03 瀏覽:545