跳轉到內容

Android/Android SDK

來自華夏公益教科書

Android 軟體開發者工具包是您用於開發 Android 應用程式的工具。您可以從 這裡 獲取它。

GUI 和命令列之間的區別

[編輯 | 編輯原始碼]

SDK 包含一個用於 Eclipse IDE 的外掛,以及可以透過 Ant 構建指令碼呼叫的命令列工具。

大多數開發人員似乎更喜歡 GUI 工具。但是,這使得選擇不同的 IDE 或文字編輯器變得困難。此外,複雜的構建需要在構建時執行自定義指令碼,只有命令列才能提供處理此問題的靈活性。

原生程式碼

[編輯 | 編輯原始碼]

Android 應用程式不必完全用 Java 編寫。可以包含 C/C++ 程式碼並使用 原生開發工具包 (NDK) 編譯它。然後,此程式碼透過 Java 原生介面 (JNI) 與 Java 程式碼互動,Dalvik 虛擬機器包含該介面的(大部分)完整實現。

您可能希望使用 NDK 的情況

  • 從另一個平臺移植 C/C++ 程式碼。
  • Java 程式碼太慢——但請注意:“過早最佳化是萬惡之源”(各種歸因於 Donald Knuth 或 Tony Hoare)。在嘗試加速程式碼之前,請進行實際測試以確定程式碼的慢速部分:效能瓶頸通常不在您認為的地方。
  • 分配超過 Java 堆允許的 20MB 的記憶體。

不使用 NDK 的原因

  • 編譯後的程式碼最終會變得特定於架構。當然,您可以包含針對 ARM 和 MIPS 等的替代版本以涵蓋目前可能的情況,但如果 Intel 的 Atom 努力取得成功,並且未來的裝置更多地使用x86 晶片,會發生什麼?
  • 除錯很困難。您不會在 logcat 中看到一個漂亮的 Java 異常回溯,指向錯誤發生的精確原始碼行,而是會得到一個崩潰暫存器轉儲。但是,可以透過在程式碼中的戰略性位置輸出除錯訊息(見下文日誌記錄)來縮小錯誤的範圍。

更好的 JNI 膠水

[編輯 | 編輯原始碼]

Android 提供的標準 jni.h 使呼叫 JNI 例程有點麻煩。您可以透過對 jni.h 進行 JNIGlue 處理來改進這一點,它會生成更方便的static inline包裝例程。例如,您不必使用

const jclass SystemClass = (**env).FindClass(env, "java/lang/System");,而是可以使用

const jclass SystemClass = JNFindClass(env, "java/lang/System");

日誌記錄

[編輯 | 編輯原始碼]

在 Java 程式碼中,您可以使用 Log 類將訊息寫入 logcat,或者直接寫入標準 Java System.err 診斷流或 System.out 輸出流。在第一種情況下,您可以設定日誌級別和用於在訊息前面新增字首的“標記”字串;在第二種情況下,級別始終為警告 (W),標記始終為“System.err”,在最後一種情況下,級別為資訊 (I),標記為“System.out”。

在原生程式碼中,通常的 stdio 流stdoutstderr已定義,但不起作用——當然,嘗試寫入stdoutstderr不僅不會在任何地方顯示訊息,還會導致程式碼其他地方發生奇怪的崩潰。

相反,您可以使用原生日誌記錄庫。對此沒有公開文件,但例程位於 android/log.h 標頭檔案中,您可以將其包含在 C/C++ 程式碼中。同樣,在用於構建原生程式碼的 Android.mk 中,將 -llog 新增到 LOCAL_LDLIBS 變數的定義中。

以這種方式寫入 logcat 的訊息看起來像這樣:level/tag(pid): text 或者像這樣:W/System.err( 1288): test app successfully started

日誌級別在 android/log.h 中列出,訊息中出現的相應單字母程式碼為

程式碼 字元
ANDROID_LOG_UNKNOWN 訊息不
出現
ANDROID_LOG_DEFAULT
ANDROID_LOG_VERBOSE V
ANDROID_LOG_DEBUG D
ANDROID_LOG_INFO I
ANDROID_LOG_WARN W
ANDROID_LOG_ERROR E
ANDROID_LOG_FATAL F
ANDROID_LOG_SILENT S

GCC 擴充套件

[編輯 | 編輯原始碼]

NDK 附帶的 C 和 C++ 編譯器是根據 GCC 構建的,因此您可以使用通常的 GCC 功能。例如,您可以使用 C99 #include <stdbool.h> 並使用bool型別,其值是truefalse,在程式碼中的條件表示式中使用。您可以透過在Android.mk:

中新增類似這樣的行來啟用更通用的 C99 功能


LOCAL_CFLAGS += -std=c99

在 Ubuntu 上設定 Android 開發的示例

[編輯 | 編輯原始碼]


這是在 Ubuntu 18.04 LTS 中設定典型 Android 開發的演練。

然後按照 Android Studio for Linux 安裝說明進行操作(https://developer.android.com/studio/install#linux)(https://linuxize.com/post/how-to-install-android-studio-on-ubuntu-18-04/)(https://askubuntu.com/questions/634082/how-to-install-android-studio-on-ubuntu

    sudo add-apt-repository ppa:lyzardking/ubuntu-make
    sudo apt update
    sudo apt install ubuntu-make
    umake android

安裝 Android Studio 的一種方法:在 Ubuntu 18.04 中使用 Ctrl+Alt+T 開啟一個終端視窗,然後執行


然後將桌面上的快捷方式新增到 "~/.local/share/umake/android/android-studio/bin/studio.sh" 檔案。

    snap install ubuntu-make --classic
    umake android

安裝 Android Studio 的一種方法:(可惜,目前無法與 Ubuntu 18.04 配合使用)在 Ubuntu 中使用 Ctrl+Alt+T 開啟一個終端視窗,然後執行

  1. 安裝 Android Studio 的另一種方法
  2. https://developer.android.com/studio 下載“Android Studio for Linux”。
  3. ...



[FIXME: 然後呢?檢視 https://askubuntu.com/questions/634082/how-to-install-android-studio-on-ubuntu 瞭解詳細資訊。]

設定 Android 開發的示例

[編輯 | 編輯原始碼]

這是設定典型 Android 開發的演練。

IDE 將是 Eclipse,因為它非常靈活。下載最新版本(用於 Java 開發和外掛開發)。將其解壓縮到使用者選擇的目錄中,然後嘗試執行它。希望它能正常執行,例如,幸運的是,我們在安裝了 Mint 的 32 位版本時,沒有選擇 64 位版本的 Eclipse。

將編寫一個簡單的 Hello World Java 程式,以檢視 Eclipse IDE 是否有工作的 Java 編譯器。至少 Java 執行時應該可以正常工作,因為否則 Eclipse 無法執行。如果不是,請轉到 Synaptic 或 Mint 應用程式載入器,找到一個 Java 執行時,例如 2013 年的 openjdk 7。

下一步是獲取 Android SDK。在 2013 年 11 月,它是 r22 版本,位於 [1],您需要下載並解壓縮它。但是,如果您使用的是 64 位 Mint 環境,它可能無法正常工作,也許 Red Hat 環境可以。要在這種情況下使其正常工作,您需要執行模擬器並檢視它的提示。

如果它提示類似於“沒有名為 .. tools/emulator 的檔案或目錄”,那麼您可能沒有安裝 32 位環境,因此請從 Synaptic 軟體包管理器中獲取 libc 32 位環境。

如果您的使用者不是管理員,請先開啟一個終端視窗,執行 su,然後輸入管理員密碼(在安裝 Linux Mint 時建立的第一個使用者)。然後輸入 synaptic,然後安裝 libc6-i386。

繼續執行模擬器並安裝它需要的庫,例如 lib32stdc++6。

執行 ./tools/android exec,即使沒有 32 位庫,它也應該可以正常工作。這樣做是為了載入您選擇的 Android 平臺,例如 4.4 KitKat、4.3 Jelly Bean 或 2.2 Froyo,以及底部 Extras 資料夾中的最新 Android 支援包,因為這可以提供應用程式向後相容性,例如,使用 Android Froyo API 在 Android Honeycomb 應用程式中,如果您的專案中包含支援庫。您還需要至少一個 ARM 系統映像,可能還需要 Intel 系統映像,但每個映像都會延長下載時間,您很容易最終獲得 1 GB 的開發工具(或更多),僅僅是為了在 Android 上執行您的 Hello World 應用程式。

在 Eclipse 中安裝外掛,方法是執行它,並在 Windows 或 Mac OS X 中指定路徑,然後進入“幫助”選項,安裝所需的包,然後在頂部,透過單擊“新增...”按鈕新增一個新的軟體儲存庫,並將此 URL 貼上到“位置”欄位中,[2]。然後選擇 Android 開發外掛(或 ADT,簡稱),以及 NDK,如果您想在 Android 應用程式中編譯本機 C 或 C++ 程式碼。

之後,在您的 Android 專案中建立一個空白活動,並執行它。

這需要設定,方法是在 Eclipse 中點選“視窗”選單項和“Android 虛擬裝置管理器”,然後選擇一個低效能虛擬裝置,例如 Nexus One,這樣您就不會等到虛擬裝置啟動而變老。點選 AVD 管理器中的第二個選項卡,然後從左側列表中選擇 Nexus One,右側的“建立 AVD”按鈕將被啟用,然後它將使用 ARM 系統映像和任何級別的 Android API 建立一個虛擬裝置,但要小心使用“本地 OpenGL”,因為它們的 32 位庫可能無法載入,它仍然允許您建立 AVD,但它將無法工作。

之後,您可以嘗試建立一個計算器專案,但不要使用 Google 的程式設計專案,只需使用 MainActivity.xml 檔案的佈局編輯器,因為您可以將 4 個按鈕放在一個水平佈局中,複製佈局並貼上以獲得其他行。您還可以透過 Ctrl-點選來選擇多個按鈕,然後在“大綱”檢視中右鍵點選突出顯示的按鈕,選擇選單項“其他屬性...”並選擇“OnClick”,然後輸入方法名稱來接收 onClick buttonPressed。然後建立一個public在 MainActivity.java 檔案中,名為 public void buttonPressed(View v) 的方法,並透過使用按鈕的標籤來識別按鈕來處理任何按鈕點選。(首先將傳入的 v 轉換為 Button 物件)

祝您 Android 程式設計愉快,願 Google Play 商店的成功與您同在。

華夏公益教科書