Android平臺(tái)采用了整合的策略思想,包括底層Linux操作系統(tǒng)、中間層的中間件和上層的Java應(yīng)用程序。下面我把Android的特性及其架構(gòu)體系結(jié)構(gòu)總結(jié)一下。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供武定企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為武定眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
一、Android的平臺(tái)特性
Android平臺(tái)有如下特性:
1. 應(yīng)用程序框架支持組件的重用與替換。
這樣我們可以把系統(tǒng)中不喜歡的應(yīng)用程序刪除,安裝我們喜歡的應(yīng)用程序。
2. Dalvik虛擬機(jī)專門為移動(dòng)設(shè)備進(jìn)行了優(yōu)化。
Android應(yīng)用程序?qū)⒂蒍ava編寫、編譯的類文件通過DX工具轉(zhuǎn)換成一種后綴名為.dex的文件來執(zhí)行。Dalvik虛擬機(jī)是基于寄存器的,相對于Java虛擬機(jī)速度要快很多。
3. 內(nèi)部集成瀏覽器基于開源的WebKit引擎。
有了內(nèi)置的瀏覽器,這將意味著WAP應(yīng)用的時(shí)代即將結(jié)束,真正的移動(dòng)互聯(lián)網(wǎng)時(shí)代已經(jīng)來臨,手機(jī)就是一臺(tái)“小電腦”,可以在網(wǎng)上隨意遨游。
4. 優(yōu)化的圖形庫包括2D和3D圖形庫,3D圖形庫基于OpenGL ES 1.0。
強(qiáng)大的圖形庫給游戲開發(fā)帶來福音。在3G最為重要的的應(yīng)用莫過于手機(jī)上網(wǎng)和手機(jī)游戲。
5. SQLite用作結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)。
6. 多媒體支持包括常見的音頻、視頻和靜態(tài)印象文件格式
如MPEG4、H.264、MP3、AAC、AMR、JGP、PNG、GIF。
7. GSM電話(依賴于硬件)。
8. 藍(lán)牙(Bluetooth)、EDGE、3G、WiFi(依賴于硬件)。
9. 照相機(jī)、GPS、指南針和加速度計(jì)(依賴于硬件)。
10. 豐富的開發(fā)環(huán)境包括設(shè)備模擬器、調(diào)試工具、內(nèi)存及性能分析圖表和Eclipse集成的開發(fā)環(huán)境插件。
Google提供了Android開發(fā)包SDK,其中包含了大量的類庫和開發(fā)工具,并且針對Eclipse的可視化開發(fā)插件ADT。
二、Android平臺(tái)架構(gòu)
從上圖我們可以看出,Android操作系統(tǒng)的體系結(jié)構(gòu)可分為4層,由上到下依次是應(yīng)用程序、應(yīng)用程序框架、核心類庫和Linux內(nèi)核,其中第三層還包括Android運(yùn)行時(shí)的環(huán)境。下面分別來講解各個(gè)部分。
1. 程序應(yīng)用
Android
連同一個(gè)核心應(yīng)用程序包一起發(fā)布,該應(yīng)用程序包包括E-mail客戶端、SMS短消息程序、日歷、地圖、瀏覽器、聯(lián)系人管理程序等。所有的應(yīng)用程序都是用Java編寫的。
2. 應(yīng)用程序框架
開發(fā)者完全可以訪問核心應(yīng)用程序所使用的API框架。該應(yīng)用程序框架架構(gòu)用來簡化組件軟件的重用,任何一個(gè)應(yīng)用程序都可以發(fā)布它的功能塊并且任何其他的應(yīng)用程序都可以使用其所發(fā)布的功能塊(不過得遵循框架的安全性限制)。該應(yīng)用程序重用機(jī)制使得組件可以被用戶替換。
以下所有的應(yīng)用程序都由一系列的服務(wù)和系統(tǒng)組成,包括:
1)一個(gè)可擴(kuò)展的視圖(Views)可以用來創(chuàng)建應(yīng)用程序,包括列表(lists)、網(wǎng)絡(luò)(grids)、文本框(text
boxes)、按鈕(buttons),甚至是一個(gè)可嵌入的Web瀏覽器。
2)內(nèi)容管理器(Content Providers)使得應(yīng)用程序可以訪問另一個(gè)應(yīng)用程序的數(shù)據(jù)(如聯(lián)系人數(shù)據(jù)庫),或者共享它們自己的數(shù)據(jù)。
3)一個(gè)資源管理器(Resource Manager)提供非代碼資源的訪問,如本地字符串、圖形和分層文件(layout files)。
4)一個(gè)通知管理器(Notification Manager)使得應(yīng)用程序可以在狀態(tài)欄中顯示客戶通知信息。
5)一個(gè)活動(dòng)類管理器(Activity Manager)用來管理應(yīng)用程序生命周期并提供常用的導(dǎo)航回退功能。
3. Android程序庫
Android包括一個(gè)被Android系統(tǒng)中各種不同組件所使用的C/C++集庫。該庫通過Android應(yīng)用程序框架為開發(fā)者提供服務(wù)。
以下是一些主要的核心庫:
1)系統(tǒng)C庫:一個(gè)從BSD繼承來的標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫(libc),專門為基于Embedded Linux的設(shè)備定制。
2)媒體庫:基于PacketVideo
OpenCORE;該庫支持錄放,并且可以錄制許多流行的音頻視頻格式,還有靜態(tài)映像文件包括MPEG4、H.264、MP3、AAC、JPG、PNG。
3)Surface Manager:對顯示子系統(tǒng)的管理,并且為多個(gè)應(yīng)用程序提供2D和3D圖層的無縫融合。
4)LibWebCore:一個(gè)最新的Web瀏覽器引擎,用來支持Android瀏覽器和一個(gè)可嵌入的Web視圖。
5)SGL:一個(gè)內(nèi)置的2D圖形引擎。
6)3D libraries:基于OpenGL ES 1.0 APIs實(shí)現(xiàn);該庫可以使用硬件3D加速(如果可用)或者使用高度優(yōu)化的3D軟加速。
7)FreeType:位圖(bitmap)和向量(vector)字體顯示。
8)SQLite:一個(gè)對于所以應(yīng)用程序可用、功能強(qiáng)勁的輕型關(guān)系型數(shù)據(jù)庫引擎。
4. Android運(yùn)行庫
Android包括了一個(gè)核心庫,該核心庫提供了Java編程語言核心庫的大多數(shù)功能。
每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。Dalvik是針對同時(shí)高效地運(yùn)行多個(gè)VMs實(shí)現(xiàn)的。Dalvik虛擬機(jī)執(zhí)行.dex的Dalvik可執(zhí)行文件,該格式文件針對最小內(nèi)存使用做了優(yōu)化。該虛擬機(jī)是基于寄存器的,所有的類都是經(jīng)由Java匯編器編譯,然后通過SDK中的DX工具轉(zhuǎn)化成.dex格式由虛擬機(jī)執(zhí)行。
Dalvik虛擬機(jī)依賴于Linux的一些功能,比如線程機(jī)制和底層內(nèi)存管理機(jī)制。
5. Linux內(nèi)核
Android的核心系統(tǒng)服務(wù)依賴于Linux內(nèi)核,如安全性、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)協(xié)議棧和驅(qū)動(dòng)模型。Linux內(nèi)核也同時(shí)作為硬件和軟件棧之間的硬件抽象層。
tools中有文件名為“android”的程序, 運(yùn)行它, 選擇你要下載的版本, 下載。
1.Android端代碼可以在Eclipse中開發(fā)(AndroidStudio沒有試,應(yīng)該也可以)
2.Unity3D端代碼要在Unity中開發(fā)
3.Android和Unity3D端,兩邊都需要加入一些代碼從而可以使之關(guān)聯(lián)交互。
4.將Android端代碼編譯成jar文件以插件形式放入到Unity端中
5.在Unity中將整個(gè)項(xiàng)目Build成apk文件,然后安裝到手機(jī)或模擬器里運(yùn)行
本文主要講解1,2,3。對于4,5建議大家去看雨松MOMO的Unity博客的第17篇和第18篇。
UnityPlay:
在編寫Android端和Unity3d端代碼前,有必要先了解一下可以使兩部分交互的類UnityPlay。
個(gè)人理解UnityPlay是個(gè)Unity提供給外部交互的一個(gè)接口類。
為什么是“個(gè)人理解”?這我不得不爆粗口了,TMD官網(wǎng)根本就沒有相關(guān)的API和文檔(如果大家有誰找到一定給我來一份,就當(dāng)我罵自己了)。
在關(guān)聯(lián)Android時(shí),想拿到UnityPlay以及相關(guān)類的jar包可以從下面的地址找到:Unity安裝路徑\Editor\Data\PlaybackEngines\androidplayer\bin在bin文件夾下有一個(gè)classes.jar的jar文件,它就是我們想要的。
而在bin同目錄下有一個(gè)src文件,點(diǎn)擊到最后有3個(gè)類,分別是UnityPlayerActivity.java,UnityPlayerProxyActivity.java,UnityPlayerNativeActivity.java。前兩個(gè)打開個(gè)后只有一行代碼,說的是UnityPlayerActivity和UnityPlayerProxyActivity都繼承自UnityPlayerNativeActivity。而打開UnityPlayerNativeActivity中居然有代碼,而且我估計(jì)這應(yīng)該是UnityPlayerNativeActivity的源碼。
由于關(guān)于UnityPlay的資料我只找到這么一個(gè),所以我把UnityPlayerNativeActivity中的代碼都貼出來,如果我注解有不對的地方希望大家指正。
/**
* UnityPlayerActivity,UnityPlayerProxyActivity都繼承自UnityPlayerNativeActivity
* 而UnityPlayerNativeActivity繼承自NativeActivity
* 在該類里定義了一些和ANDROID生命周期相同的回調(diào)方法,留給自定義的Activity子類重寫。
*/
public class UnityPlayerNativeActivity extends NativeActivity
{
//UnityPlayer的引用,并且我們不能改變這個(gè)引用變量的名字,它被native code所引用
protected UnityPlayer mUnityPlayer;
protected void onCreate (Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
// 設(shè)置顯示窗口參數(shù)
getWindow().takeSurface(null);
setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
getWindow().setFormat(PixelFormat.RGB_565);
// 創(chuàng)建一個(gè)UnityPlayer對象,并賦值給全局的引用變量
mUnityPlayer = new UnityPlayer(this);
//為UnityPlayer設(shè)置一些參數(shù)
if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))
getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);
boolean trueColor8888 = false;
// UnityPlayer.init()方法需要在將view附加到layout之前調(diào)用。它將會(huì)調(diào)用native code
mUnityPlayer.init(glesMode, trueColor8888);
// 從UnityPlayer中獲取到Unity的View視圖
View playerView = mUnityPlayer.getView();
// 將Unity視圖加載到根視圖上
setContentView(playerView);
// 使Unity視圖獲取焦點(diǎn)
playerView.requestFocus();
}
protected void onDestroy ()
{
// 當(dāng)Activity結(jié)束的時(shí)候調(diào)用UnityPlayer.quit()方法,它會(huì)卸載之前調(diào)用的native code
mUnityPlayer.quit();
super.onDestroy();
}
// 下面幾個(gè)方法都是ANDROID相關(guān)回調(diào)方法,確保在ANDROID執(zhí)行相應(yīng)方法時(shí)UnityPlayer也需調(diào)用相應(yīng)方法
protected void onPause()
{
super.onPause();
mUnityPlayer.pause();
}
protected void onResume()
{
super.onResume();
mUnityPlayer.resume();
}
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
mUnityPlayer.configurationChanged(newConfig);
}
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
mUnityPlayer.windowFocusChanged(hasFocus);
}
public boolean dispatchKeyEvent(KeyEvent event)
{
if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
return mUnityPlayer.onKeyMultiple(event.getKeyCode(), event.getRepeatCount(), event);
return super.dispatchKeyEvent(event);
}
}
核心類
1.1 DexClassLoader類
可以加載jar/apk/dex,可以從SD卡中加載為安裝的apk。
1.2 PathClassLoader類
只能加載已經(jīng)安裝到Android系統(tǒng)中的apk文件。
一、正文
1.1
類似于eclipse的插件化實(shí)現(xiàn), 首先定義好接口, 用戶實(shí)現(xiàn)接口功能后即可通過動(dòng)態(tài)加載的方式載入jar文件, 以實(shí)現(xiàn)具體功能。 注意 , 這里的jar包需要經(jīng)過android dx工具的處理 , 否則不能使用。