二、
建立
Android Eclipse
工程
請參考小生的《Android SDK 2.3與Eclipse最新版開發環境搭建(五)》,博文地址:http://blog.sina.com.cn/s/blog_573860a90100ownd.html or http://blog.csdn.net/deaboway/archive/2011/01/30/6170449.aspx
三、
工程結構詳細解析
1. 工程結構
在Eclipse的Java透視圖中,可以看到工程的Package Explorer如:
具體包括:
src
檔案夾
- 包含應用程式範例的包,即org.deaboway.test。
R.java
- Android Developer Tools 自動建立這個檔案,它提供訪問 Android 應用程式的各種資源所需的常量。後面會詳細討論 R 類與資源之間的關係。
HelloAndroidWorld.java
- 應用程式的主活動類的實現。
Referenced libraries
- 包含 android.jar,這是 Android SDK 中的 Android 運行時類的 jar 檔案。
res
檔案夾
- 包含應用程式的資源,包括:
· drawable - 表徵圖:這個檔案夾包含圖形檔案,比標和位元影像。
· layout - 布局檔案:這個檔案夾包含表示應用程式布局和視圖的 XML 檔案。
· values - 字串:這個檔案夾包含 strings.xml 檔案。這是為應用程式實現字串本地化的主要方法。
AndriodManifest.xml
- 應用程式範例的部署描述符。
default.properties
和proguard.cfg
– 從2.3版本以後,android sdk 本身包含proguard,可以通過正常的編譯方式也能實現代碼混淆,我們可以看到android-sdk-windows/tools/下面多了一個proguard檔案夾。防止反編譯工具進行反編譯,保證代碼安全。
2. 主類分析
這個應用程式範例由一個Activity(活動)組成,即HelloAndroidWorld。正如前面提到的,HelloAndroidWorld類是在HelloAndroidWorld.java 檔案中實現的。
package
org.deaboway.test;
import
android.app.Activity;
import
android.os.Bundle;
import
android.widget.TextView
;
public
class
HelloAndroidWorld extends
Activity {
/** Called when the activity is first created. */
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
// TextView textView = new TextView(this);
// textView.setText("Hello Android
World!");
// setContentView(textView);
setContentView(R.layout.main
);
}
}
在這個原始碼片段中,要注意幾點:
- HelloAndroidWorld 是一個普通的 Java 類,包含包和匯入語句。
- HelloAndroidWorld 擴充 android.app 包中的 Android 基類 Activity。
- onCreate() 方法是這個活動的進入點,它接受一個 Bundle 類型的參數。Bundle 類本質上是 map 或 hashmap 的封裝器。在這個參數中傳遞構造活動所需的元素。這裡暫時不討論這個參數。
- setContentView() 負責用 R.layout.main 參數建立主 UI。R.layout.main 是應用程式資源中主布局的標識符。
3. R.java檔案
R.java 檔案是在構建時自動建立的,所以不要手工修改它,因為所有修改都會丟失。本執行個體的R.java檔案內容如下:
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt
tool from the resource data it found. It
* should not be modified by hand.
*/
package
org.deaboway.test;
public
final
class
R {
public
static
final
class
attr {
}
public
static
final
class
drawable {
public
static
final
int
icon
=0x7f020000;
}
public
static
final
class
layout {
public
static
final
int
main
=0x7f030000;
}
public
static
final
class
string {
public
static
final
int
app_name
=0x7f040001;
public
static
final
int
hello
=0x7f040000;
}
}
R 類包含一些匿名子類,每個子類包含前面描述的各種資源的標識符。注意,這些類都是靜態。
請注意 R.layout.main 代表的元素。這個標識符代表由 main.xml 定義的布局。在活動的 onCreate 方法中可以使用這個值:setContentView(R.layout.main)。這就是在運行時把特定的活動(這裡是HelloAndroidWorld)和特定的布局(主布局)聯絡在一起的方法。
4. main.xml檔案
本應用程式範例包含一個活動和一個視圖。應用程式套件組合含一個名為 main.xml 的檔案,它代表活動的主 UI 的視覺方面。
注意,在 main.xml 中沒有指定在哪裡使用這個布局。這意味著,如果需要的話,可以在多個活動中使用它。
"1.0" encoding="utf-8"
?>
"http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
這是最簡單的布局,其中只有一個垂直的線性布局,這意味著所有元素排成一列。這裡有一個 TextView 元素,它與其他開發環境中的標籤類似。TextView 代表不可編輯的靜態文本。
注意,每個視圖元素(比如這個樣本中的 LinearLayout 和 TextView)都有屬於 Android 名稱空間的屬性。一些屬性是所有視圖元素都有的,比如 android:layout_width 和android:layout_height。這些屬性可以採用的值是:
fill_parent - 使視圖元素佔滿可用的空間。也可以認為這就是 “展開”。
wrap_content - 這個值讓 Android 把元素一個接一個地排列,不進行展開。
5. AndroidManifest.xml檔案
AndroidManifest.xml 檔案是 Android 應用程式的部署描述符。這個檔案列出應用程式中包含的所有Activity(活動)、ContentProvider(內容提供者)、BroadcastReceiver(廣播接收器)與Service(服務),以及應用程式支援的 IntentFilter。下面是這個應用程式範例的完整的 AndroidManifest.xml 檔案。
"1.0" encoding="utf-8"
?>
"http://schemas.android.com/apk/res/android"
package="org.deaboway.test"
android:versionCode="1"
android:versionName="1.0"
>
"@drawable/icon" android:label="@string/app_name"
>
".HelloAndroidWorld"
android:label="@string/app_name"
>
"android.intent.action.MAIN" />
"android.intent.category.LAUNCHER" />
- 這裡指定了源檔案中的包名。採用與 Java 源檔案和匯入語句相似的模式。 標記的實際作用是 “匯入” 這個包中的類。在這個檔案中,所有非完整類都屬於 package 屬性指定的包。
- 標記的一個屬性引用了應用程式的一個資源。請注意 drawable 標識符前面的 @ 符號。這裡的意思是,在應用程式資源的 drawable 檔案夾中尋找名為 “icon” 的資源。
- 標記包含以下屬性和值:
- android:name表示實現這個活動的 Java 類。
- android:label 是應用程式的名稱。注意,它來自一個字串資源。string.xml 檔案包含應用程式的本地化字串。
- 表示應用程式中可用的 IntentFilter。這是 Android 應用程式中最常見的 IntentFilter。這個過濾器的實際意思是,它實現 “主” 操作(也就是進入點),而且它位於 OS 的啟動器中。這意味著可以在 Android 裝置上像啟動其他應用程式一樣,從應用程式主列表中啟動它。
四、
應用程式調試
要想檢查正在啟動並執行應用程式中發生了什麼情況,就需要查看正在啟動並執行 Dalvik VM。在 Eclipse 中,選擇 Window > Open Perspective > Other。在出現的對話方塊中選擇 DDMS。這會在 Eclipse 中開啟一個新的透視圖,其中有許多有趣的視窗。
DDMS 為IDE和Emultor(or GPhone)架起來了一座橋樑。Developer可以通過DDMS看到目標機器上啟動並執行進程/線程狀態:可以讓Eclipse程式串連到開發機上運行;可以看進程的heap資訊、logcat資訊、進程分配記憶體情況;可以像目標機傳送簡訊、發送地理位置資訊以及打電話;可以像gdb一樣attach 某一個進程調試。
下面簡要介紹一下 DDMS 透視圖中提供的資源:
1. Devices
Device 中羅列了Emulator中所有的進程,選項卡右上方那一排按鈕分別為:Debug the selected process調試進程、Update Heap更新進程堆棧資訊、Dump HPROF file檢查HPROF(Heap/CPU Profiling Tool)檔案、Cause GC調用記憶體回收、更新進程Update Threads、Start Method Profiling開始方法分析、Stop Process停止某個進程,和Screen Capture抓取 Emulator目前的螢幕。當你選中某個進程,並按下調試進程按鈕時,如果eclipse中有這個進程的代碼,那就可以進行原始碼層級的調試。有點像 gdb attach。圖片抓取按鈕可以把當前android的顯示案頭抓到你的機器上,也是非常有用。
這裡可以查看到所有與DDMS連 接的終端的詳細資料,以及每個終端正在啟動並執行APP進程,每個進程最右邊相對應的是與調試器連結的連接埠。因為Android是基於Linux核心開發的操 作平台,同時也保留了Linux中特有的進程ID,它介於進程名和連接埠號碼之間。
DDMS監聽第一個終端App進程的連接埠為8600,APP進程將分配8601,如果有更多終端或者更多APP進程將按照這個順序依次類推。DDMS通過8700連接埠(”base port”)接收所有終端的指令。
2. Emulator Control
通過這個面板的一些功能可以非常容易的使測試終端類比真實手機所具備的一些互動功能,比如:電話中,根據選項類比各種不同網路情況,類比接受SMS訊息和發送虛擬位址座標用於測試GPS功能等。
Telephony Status: 通過選項類比語音品質以及訊號串連模式。
Telephony Actions: 類比電話接聽和發送SMS到測試終端。
Location Control: 類比地理座標或者類比動態路線座標變化並顯示預設的地理標識,可以通過以下3種方式:
· Manual: 手動為終端發送二維經緯座標。
· GPX: 通過GPX檔案匯入序列動態變化地理座標,從而類比行進中GPS變化的數值。
· KML: 通過KML檔案匯入獨特的地理標識,並以動態形式根據變化的地理座標顯示在測試終端。
如:在Emulator Control/Telephony Actions 中輸入如內容“Android 中文”,單擊發送後,在Android模擬器中開啟Messaging,看到下面的簡訊:
3. 檔案管理工具
顯示檔案系統資訊。File Explorer非常有用:它可以把檔案上傳到Android、或者從Android上下載檔案下來、也可以進行檔案刪除操作。選項卡右上方有上傳、下載、刪除三個按鈕。一般情況下,File Explorer會有如下三個目錄:data、sdcard、system。
· data對應手機的RAM,會存放Android OS 運行時的Cache等臨時資料(/data/dalvik-cache目錄);沒有root許可權時apk程式安裝在/data/app中(只是存放apk 檔案本身);/data/data中存放Android中所有程式(系統apk+第三方apk)的詳細目錄資訊。
· mnt是mount,掛裝的意思,mnt目錄下的 sdcard對應sd卡。
· system對應手機的ROM,OS以及系統內建apk程式等存放在這裡。
使用者應用程式部署在 /data/app 目錄中,而 Android 內建的應用程式部署在 /system/app 目錄中。
4. Threads、Heap、Allocation Tracker
Threads視圖列出當前進程的所有線程。
Heap視圖展示一些堆的狀態,在記憶體回收其間更新。當選定一個虛擬機器時, VM Heap視圖不能顯示資料,可以點擊右邊麵包上的帶有綠色的”Show heap updates”按鈕,然後在點擊”Cause GC “實施記憶體回收更新堆的狀態。
在Allocation Tracker視圖裡,我們可以跟蹤每個選中的虛擬機器的記憶體配置情況。點擊”Start Tracking”後點擊”Get Allocations “就可以看到。
例如,為了查看Garbage Collection資訊:點擊 [Start Tracking]按鈕 -> 保持程式運行一段時間後 ->點擊[Get Allocations] 按鈕,憑藉得到的Allocations資訊可以通過Line Number準確找到哪裡的代碼出現了問題。
5. LogCat
LogCat 是一個記錄檔,它記錄 VM 中發生的活動。應用程式可以通過 Log.i(tag,message); 在這個記錄檔中添加自己的日誌項,其中的 tag 和 message 都是 Java 字串。Log 類屬於android.util.Log 包。
6. Console
Android輸出的資訊,載入程式等資訊。