OPhone OMS平臺開發環境常見問題解答

Android是Google公司於2007年11月5日宣佈的基於Linux平臺的開源手機操作系統的名稱。而OMS是基於Android爲中國移動“深度定製”的移動操作系統。如果你希望使用OMS SDK搭建環境開發應用程序,請閱讀這篇文章。這篇文章總結了很多搭建開發環境的常見問題,例如如何連接OMS SDK中的模擬器,如何安裝/卸載ADT,如何創建工程,如何查找程序出錯的原因等等。
一. SDK包中的工具介紹
SDK是以zip壓縮包的形式提供的。解壓後你可以看到其中有tools目錄,包含許多實用工具,這裏簡單介紹一下。http://developer.android.com/guide/developing/tools/有更詳細的說明。
 
emulator是phone的軟件模擬器,有了它,不需要任何硬件你就可以看到平臺的UI,體驗平臺的各種特性,也可以把你的應用程序放在模擬器上進行測試。emulator可以待參數執行。例如,emulator -wipe-data可以把模擬器的設置恢復到初始狀態。emulator -sdcard SD.file可以模擬插入sd卡的情景,前提是先通過tools目錄中的mksdcard工具創建一個sd卡影像文件。emulator支持很多參數,如果想進一步瞭解可以在命令行下輸入emulator -h查看詳細的幫助。 如果希望得到手機/模擬器的屏幕截圖或log,可以使用tools目錄下的ddms工具。
aapt是個非常有用的工具,可以獲取log,安裝應用程序,複製文件等等。adb shell命令提供一個簡單的shell環境,你可以登錄到手機/模擬器上進行各種命令行操作,就像在一臺Linux電腦裏一樣。不過adb shell的功能比較簡陋,你可以安裝一個ARM版的busybox(http://benno.id.au/blog/2007/11/14/android-busybox),使用起來更加方便。OMS平臺的aapt設置方法跟Android的略有不同,下面就來介紹一下。二. 如何配置adb
Linux下如何使用adb連接到OMS的手機/模擬器?如果是用手機,在手機正常開機後,使用usb線連接手機到電腦,在手機的彈出菜單中選"調試”,再執行下面命令。如果是模擬器則要等模擬器正常啓動之後,執行後面兩條命令。
sudo ifconfig usb0 192.168.100.1 export ADBHOST=192.168.100.2 adb kill-server
adb ls /如果一切正常的話,這時可以看到adb列出類似下面的內容。
000041ed 00000000 49fffdfc .
000041ed 00000000 49fffdfc ..
000041ed 00000000 49fffdfc Linux
0000a1ff 00000012 49fffdfc bin
0000a1ff 00000012 49fffdfc usr
0000a1ff 00000012 49fffdfc lib
000043ff 0000008c 49fffe44 tmp
...
三. 怎樣配置開發環境
下面開始介紹怎麼配置開發環境。在OMS平臺上開發應用跟Android一樣需要使用java。我們推薦使用最新版的Eclipse開發環境,否則安裝ADT可能會失敗。Eclipse下載地址爲http://www.eclipse.org/downloads/.
安裝完Eclipse後,需要安裝ADT(Android Development Tools)插件。在Eclipse的Help->Software Updates...菜單中,選擇Add Site...,Location填https://dl-ssl.google.com/android/eclipse/site.xml,然後點擊OK按鈕開始安裝。如果網絡連接失敗,你可以從別的地方下載adt.zip壓縮包,然後在Add Site對話框中選擇Archive...開始安裝。OMS SDK提供了一個特殊版本的ADT,後面我會加以介紹。
安裝完ADT後,需要在Eclipse的Window->Preference中指明OMS SDK所在的目錄,也就是你把SDK zip文件解壓縮後生成的目錄。如圖所示
 
創建OMS工程的步驟跟創建Android工程的相同,網上有很多介紹,這裏就不再複述了。
如何卸載ADT呢?如果你需要卸載ADT的話,可以在eclipse/plugin目錄中查找以下文件,刪除就可以了。注意,版本號和日期可能會有變化。
com.android.ide.eclipse.adt_0.8.0.v200809220836-110569.jar com.android.ide.eclipse.common_0.8.0.v200809220836-110569.jar com.android.ide.eclipse.ddms_0.8.0.v200809220836-110569.jar com.android.ide.eclipse.editors_0.8.0.v200809220836-110569.jar   
org.eclipse.ui.views.log_1.0.0.v20080803-1700.jar
如何在你的工程中使用OMS提供的API呢?OMS平臺提供了許多特有的API,全都放在oms.jar中。你需要在Eclipse中通過Project->Properties->Add Library來添加。注意一定不要使用External JARs方式。External JARs會把jar文件編譯加入到你的apk文件裏,會導致編譯出錯。
 
如何在工程中集成.so庫文件呢?如果你的程序使用了JNI native庫文件,你需要把這些庫文件安裝到手機/模擬器的/system/lib目錄下,不然程序運行時會出現force close。OMS平臺提供了一個特殊版本的ADT,可以讓你在工程中加入native庫文件。安裝了這個版本的ADT後,在用Eclipse的File->New->Android Project菜單新建Android工程時,會有如下的對話框。
 
注意選中Use native libraries.
創建好工程後,在工程的目錄結構中會看到"nativelibs”,把你的native庫文件複製到armeabi下就可以了,見下圖。
 
          
       
四. 調試程序
好了,現在你已經寫好了你的應用程序,把它放到模擬器裏跑一下看看效果吧。在Eclipse中,點擊Run->Run菜單,Eclipse會自動編譯安裝你的應用到手機/模擬器中。應用編譯成功後會生成.apk文件,你也可以用adb install手工安裝你的apk文件。如果程序出現force close怎麼辦?下圖展示了一個應用force close時的屏幕截圖。
這時你需要使用adb logcat查看系統log。有經驗的程序員可以在log中發現很多有用信息。在嵌入式系統中,很多時候沒辦法調試程序,讀log分析問題纔是王道。這裏我給出一個程序force close時的log。注意看"Shutting down VM"前面的那句話,這個應用需要讀取Android market相關的信息,但平臺中沒有安裝Android market,這是導致應用force close的真正原因。
D/dalvikvm(  844): GC freed 13377 objects / 604304 bytes in 248ms
I/ActivityManager(  844): Starting activity: Intent { action=android.intent.action.VIEW data=market://search?q=pname:com.android.wallswitch1 }
D/AndroidRuntime( 3162): Shutting down VM
W/dalvikvm( 3162): threadid=3: thread exiting with uncaught exception (group=0x40010e28)
E/AndroidRuntime( 3162): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 3162): android.content.ActivityNotFoundException: No Activity found to handle Intent { action=android.intent.action.VIEW data=market://search?q=pname:com.android.wallswitch1 }
E/AndroidRuntime( 3162):        at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1472)
E/AndroidRuntime( 3162):        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1442)
E/AndroidRuntime( 3162):        at android.app.Activity.startActivityForResult(Activity.java:2597)
E/AndroidRuntime( 3162):        at android.app.Activity.startActivity(Activity.java:2641)
E/AndroidRuntime( 3162):        at com.android.wallswitch1.wallswitch1$5.onClick(wallswitch1.java:238)
E/AndroidRuntime( 3162):        at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:153)
E/AndroidRuntime( 3162):        at android.os.Handler.dispatchMessage(Handler.java:88)
E/AndroidRuntime( 3162):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 3162):        at android.app.ActivityThread.main(ActivityThread.java:3742)
E/AndroidRuntime( 3162):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3162):        at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime( 3162):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
E/AndroidRuntime( 3162):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497)
E/AndroidRuntime( 3162):        at dalvik.system.NativeStart.main(Native Method)
I/Process (  844): Sending signal. PID: 3162 SIG: 3
I/dalvikvm( 3162): threadid=7: reacting to signal 3
D/ActivityManager(  844): ######  [ap_panic_report] = off
I/dalvikvm( 3162): Wrote stack trace to '/local/log/traces.txt'
再來舉一個例子,你能從下面的log中看出這個應用force close的原因嗎?
I/ActivityManager(  855): Starting activity: Intent { action=android.intent.action.MAIN flags=0x10000000 comp={com.iflytek.aisound.demo/com.iflytek.aisound.demo.AisoundDemo} }
D/InputMethodManager(  923): static exitContext
D/mountd  640): USB_DETECT: msg is 'add@/kernel/uids/10067'
I/ActivityManager(  855): Start proc com.iflytek.aisound.demo for activity com.iflytek.aisound.demo/.AisoundDemo: pid=1162 uid=10067 gids={}
I/Config  855): 22222 Input configuration changed: null
D/Focus   923): Lose Window focus: "" com.db4o.servo.search.SearchBar$3@43820f78
D/DcdHomeLayout(  923): setDisplayedChild: 1
D/DcdHomeLayout(  923): scroll to (0, 0), this=com.android.borqshome.dcd.DcdHomeLayout$EntryTextLayout@43825be8
D/DcdHomeLayout(  923): height=74 m_scrollingShift=64
D/dalvikvm( 1162): Trying to load lib /sdcard/iflytek/libAisound4.so 0x43876e40
E/MediaPlayer( 1162): constructor
E/MediaPlayer( 1162): setListener
D/dalvikvm( 1162): Added shared lib /sdcard/iflytek/libAisound4.so 0x43876e40
W/dalvikvm( 1162): ERROR: Unable to find decl for native Lcom/iflytek/aisound/Data;.JNICALL Java_com_iflytek_aisound_Data_prepareData (Ljava/lang/String;I)V
D/dalvikvm( 1162): +++ not scanning '/system/lib/libwebcore.so' for 'ContrlInit' (wrong CL)
D/dalvikvm( 1162): +++ not scanning '/system/lib/libmedia_jni.so' for 'ContrlInit' (wrong CL)
D/Focus   ( 1162): Gain Window focus: "" android.widget.EditText@43880570
I/DEBUG   641): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   641): Build fingerprint: 'generic/OMS1_0/OMS1_0/:1.0/ohd-stable-114235/eng..20090115.111116:eng/test-keys'
I/DEBUG   641): pid: 1162, tid: 1169  >>> com.iflytek.aisound.demo 結束語
好了,到目前爲止我們已經知道了如何搭建平臺,啓動模擬器,創建工程,查看log分析程序出錯原因。還在等什麼呢,發揮你無窮的創造力和想象力,投入到OMS應用開發中來吧。
收藏 分享 評分
回覆 引用
訂閱 TOP
ophone
發短消息
加爲好友
ophone 當前離線
UID
1
帖子
1321
精華
13
積分
1098
威望
140 點
O幣
1860 個
閱讀權限
200
在線時間
369 小時
註冊時間
2008-11-18
最後登錄
2009-5-20
 
O8管理員
帖子
1321
O幣
1860 個
2樓
 發表於 5 天前 20:27 | 只看該作者
什麼是Dalvik虛擬機?Google於2007年底正式發佈了Android SDK, 作爲 Android系統的重要特性,Dalvik虛擬機也第一次進入了人們的視野。它對內存的高效使用,和在低速CPU上表現出的高性能,確實令人刮目相看。依賴於底層Posix兼容的操作系統,它可以簡單的完成進程隔離和線程管理。每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機實例,其代碼在虛擬機的解釋下得以執行。
很多人認爲Dalvik虛擬機是一個Java虛擬機,因爲Android的編程語言恰恰就是Java語言。但是這種說法並不準確,因爲Dalvik虛擬機並不是按照Java虛擬機的規範來實現的,兩者並不兼容;同時還要兩個明顯的不同:
 
Java虛擬機運行的是Java字節碼,而Dalvik虛擬機運行的則是其專有的文件格式DEX(Dalvik Executable)。
  
在Java SE程序中的Java類會被編譯成一個或者多個字節碼文件(.class)然後打包到JAR文件,而後Java虛擬機會從相應的CLASS文件和JAR文件中獲取相應的字節碼;Android應用雖然也是使用Java語言進行編程,但是在編譯成CLASS文件後,還會通過一個工具(dx)將應用所有的CLASS文件轉換成一個DEX文件,而後Dalvik虛擬機會從其中讀取指令和數據。Dalvik和Android系統Android作爲新一代的基於Linux的開源手機操作系統,其系統架構由下而上可以分爲以下幾部分:
 
Linux內核 本地庫 Android運行庫 應用框架
應用
 
圖表1
如圖所示,Android運行庫包括兩部分:核心庫和Dalvik虛擬機。核心庫包括了最基本的類庫,如data structure, network, Utilities, File system等的,很多實現代碼都是來自Apache Harmony項目,主要目的是保證虛擬機的類庫能夠和Java SE的類庫最大可能的兼容,從而降低應用開發者從Java SE陣營轉移到Android開發陣營的難度,增加其可用性。Dalvik虛擬機主要是完成對象生命週期的管理,堆棧的管理,線程管理,安全和異常的管理,以及垃圾回收等等重要功能。
Dalvik虛擬機的主要特徵Dalvik虛擬機非常適合在移動終端上使用,相對於在桌面系統和服務器系統運行的虛擬機而言,它不需要很快的CPU速度和大量的內存空間。根據Google的測算,64M的RAM已經能夠令系統正常運轉了。其中24M被用於底層系統的初始化和啓動,另外20M被用於高層啓動高層服務。當然,隨着系統服務的增多和應用功能的擴展,其所消耗的內存也勢必越來越大。
歸納起來,Dalvik虛擬機有如下幾個主要特徵:
專有的DEX文件格式
DEX是Dalvik虛擬機專用的文件格式,而問什麼棄用已有的字節碼文件(CLASS文件)而採用新的格式呢?
1.一個應用中會定義很多類,編譯完成後即會有很多相應的CLASS文件,CLASS文件間會有不少冗餘的信息;而DEX文件格式會把所有的CLASS文件內容整合到一個文件中。這樣,除了減少整體的文件尺寸,I/O操作,也提高了類的查找速度。
原來每個類文件中的常量池,在DEX文件中由一個常量池來管理,具體方式如下圖:
 
圖表2
圖表3
 
2.增加了新的操作碼的支持
3.文件結構儘量簡潔,使用等長的指令,藉以提高解析速度
4. 儘量擴大隻讀結構的大小,藉以提高跨進程的數據共享
如何生成DEX文件呢?Android系統和Dalvik虛擬機提供了工具(DX),在把Java源代碼編譯成CLASS文件後,使用DX工具。
 
圖表4
DEX的優化DEX文件的結構是緊湊的,然是如果我們還想要求運行時的性能有進一步提高,我們就仍然需要對DEX文件進行進一步優化。優化主要是針對以下幾個方面:
 
調整所有字段的字節序(LITTLE_ENDIAN)和對齊結構中的沒一個域 驗證DEX文件中的所有類
對一些特定的類進行優化,對方法裏的操作碼進行優化優化後的文件大小會有所增加,應該是原DEX文件的1-4倍。
優化發生的時機有兩個:對於預置應用,可以在系統編譯後,生成優化文件,以ODEX結尾。這樣在發佈時除APK文件(不包含DEX)以外,還有一個相應的ODEX文件;對於非預置應用,包含在APK文件裏的DEX文件會在運行時被優化,優化後的文件將被保存在緩存中。
基於寄存器相對於基於堆棧的虛擬機實現,基於寄存器的虛擬機實現雖然在硬件通用性上要差一些,但是它在代碼的執行效率上卻更勝一籌。一般來講,虛擬機中指令的解釋執行時間主要花在以下三個方面:
分發指令 訪問運算數
執行運算其中“分發指令”這個環節對性能的影響最大。在基於寄存器的虛擬機裏,可以更爲有效的減少冗餘指令的分發和減少內存的讀寫訪問,如:
 
圖表5
雖然Dalvik虛擬機並沒有使用目前流行的虛擬機技術,如JIT,但是根據Google的報告,這個功能的缺失並沒有另Dalvik虛擬機在性能上有所損失。我們也同時相信,Dalvik虛擬機的性能還有進一步提高的空間。
一個應用,一個虛擬機實例,一個進程每一個Android應用都運行在一個Dalvik虛擬機實例裏,而每一個虛擬機實例都是一個獨立的進程空間。虛擬機的線程機制,內存分配和管理,Mutex等等都是依賴底層操作系統而實現的。所有Android應用的線程都對應一個Linux線程,虛擬機因而可以更多的依賴操作系統的線程調度和管理機制。
不同的應用在不同的進程空間裏運行,加之對不同來源的應用都使用不同的Linux用戶來運行,可以最大程度的保護應用的安全和獨立運行。
Zygote是一個虛擬機進程,同時也是一個虛擬機實例的孵化器,每當系統要求執行一個Android應用程序,Zygote就會FORK出一個子進程來執行該應用程序。這樣做的好處顯而易見:Zygote進程是在系統啓動時產生的,它會完成虛擬機的初始化,庫的加載,預置類庫的加載和初始化等等操作,而在系統需要一個新的虛擬機實例時,Zygote通過複製自身,最快速的提供個系統。另外,對於一些只讀的系統庫,所有虛擬機實例都和Zygote共享一塊內存區域,大大節省了內存開銷。
圖表6
應用程序包(APK)被髮布到手機上後,運行前會對其中的DEX文件進行優化,優化後的文件被保存到緩存區域(優化後的格式被稱爲DEY),虛擬機會直接執行該文件。如果應用包文件不發生變化,DEY文件不會被重新生成。
 
 
圖表7
Android應用開發和Dalvik虛擬機Android應用所使用的編程語言是Java語言,和Java SE一樣,編譯時使用Sun JDK將Java源程序編程成標準的Java字節碼文件(.class文件),而後通過工具軟件DX把所有的字節碼文件轉成DEX文件(classes.dex)。最後使用Android打包工具(aapt)將DEX文件,資源文件以及AndroidManifest.xml文件(二進制格式)組合成一個應用程序包(APK)。應用程序包可以被髮布到手機上運行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章