第二章 SDK開發環境

手機元年

西元2000年, 買了一支Nokia 3310 智障型手機(feature phone), 當時本人還不會Java, 就依樣畫葫蘆寫了第一支Java applet 程式, 在上面秀出了Thomas的字眼, 心中超澎湃激昂的.

在那年代, 大家臉紅脖子粗的相互較勁~~我是訊號是5格, 你的訊號是3格, 贏了半格都是無比光榮.

當時, 本人手機一出, 大家看到有個能顯示 “Thomas” 的程式在裏面, 頓時每個人都不敢再出聲. 這景象雖過二十幾年, 依然記憶深刻. 因當時的情形一直在這世上重複上演著 —

用嘴巴寫程式都很厲害~~~講出來嚇死人, 作出來笑死人, 出事情找不到人.

Android 開發環境

就一般人的認知, Android就僅限於App的開發, 但事實上並非如此. 一個崁入式裝置(Embedded)的開發, 從硬体線路設計(EE), 外觀機構設計(ME), 到軟体開發(SW), 缺一不可. 單就軟体開發, 又包含了Linux核心開發, Framework開發除錯, 到最後, 才是App應用程式開發.

若僅就App開發, 可以在Windows上開發, 也可以在Linux上開發, 近來在Mac上也沒問題了. 但若是要開發核心及Framework, 則只能在Linux上執行, 而且, 僅限於ubuntu系統.

近來大量的SOC廠投入Android核心設計, 雖說有的可以在Centos上開發, 但只是少數, 好像也只有一家SOC廠而以.

Android 系統開發流程

EE : 硬体設計(Electronic Engineer), 指電路版設計. 台灣製造業的EE通常沒什麼設計能力, 都是由開發商供應公版電路圖再進行修改

ME : 機構設計(Mechanic Engineer), 專門設計外觀結構

SW : 軟体設計(Software design)

Source Code 控管 : 通常使用 git or Repo
Kernel 修正 : SOC, eMMc….
HAL : GPS, Wifi, Sensor, Bluetooth, Camera…
Framework修正
Setting, UI, Launcher
App開發 : 具root權限
產測程式
CTS測試
Image 燒錄(bootloader, system image)
End user App開發 : 無root權限

Android Architecture

android_architecture

Android 系統架構與運作

Application 應用層
Application Framework : Java API
Librariey & Android Runtime 資源函式庫與執行層
Linux kernel : Linux 核心與BSP

業界所需人員 : 3G/4G Module 開發,Wifi bsp, BT , RFID, 系統整合開發(SI), Android 應用程式開發…

Dalvik & Android Runtime(ART)

android_runtime

Source code經由javac編譯成.class檔,再經由de編譯成.dex, 然後透過appbuilder產生apk檔。Apk需再經由jar 崁入Sign key,最後來交由Dalvik模擬器執行

Dalvik執行時,需透過即時編譯器轉換成機器語言,再交由SOC執行。故對較慢之SOC會形成卡卡的現像

其實系統第一次開機,即會進行優化, 把apk裏的dex取出,優化成odex檔,加速載入執行(/system/app裏即可看到)

ART為Android 4.4後開始發行測試,於安裝app時,就先預編成機器語言碼,故速度快,不會卡卡

不論是4.4或 5.0, 使用ART會造成不明的當機現像,建議還是使用傳統Dalvik

至於6.0是否有此bug, 還需驗証

HTC M7 ART被封住, 小米 NOTE(4.4)也封住

開發工具安裝

JDK安裝

下載 : Java Platform (JDK)
需點選下圖紅色點之 Accept License Agreement

java_se_download

安裝 : 一直按下一步. 注意請選用JDK8, 若使用JDK5, Layout UI無法顯示


Android Studio下載安裝

下載  : Android Studio 下載後, 一直按下一步

Path 設定
將C:\Users\登入帳號\AppData\Local\Android\sdk\platform-tools 整個路徑複制起來
於開始/電腦按右鍵/內容/進階系統設定/環境變數/點選path/編輯
將複制的路徑貼於Path環境變數中, 記得還要加上 “;”

path

測試
啟動DOS視窗 : 開始/執行/cmd, 然後打入指令 adb, 如果出現如下畫面, 即表示設定成功
adb_test

Android Studio 設定

Android Studio 的設定, 可以啟動視窗的Configure/Preferences進入. 或是在開啟專案後, 由File/Settings進入

程式碼行號顯示

進入Editor/Apperance, 勾選Show line numbers

android_setting


設定字体大小

在Editor/Color & Fonts/Font中, 需先按Save As…儲存檔案後, 才能改變Size

android_font


Ctrl+Mouse滾輪

設定可以使用Ctrl+滑鼠滾輪改變字体大小, 請由File/Setting/Editor/General, 勾選 Change font size(Zoom) with Ctrl+Mouse Wheel

android_setting_3

SDK Manager設定

為了日後針對不同版本的Android 裝置進行程式編碼, 建議下載不同的sdk-Build tools.
可直接執行 C:\Users\登入帳號\AppData\Local\Android\sdk\SDK Manager.exe
將Tools打勾, 並按下Install packages

sdk

在Android n(API n)的選項中, 有幾個注意事項
SDK Platform : 基本的Android 開發套件
Google APIs : Google API開發套件, 比SDK Platform多了Google提供的功能
System Image : 基本的系統映像檔, 供模擬器開機用
Google APIs System Image : 比基本映像檔多了Google的功能
Sources for Android SDK : 原始碼, 通常用不到, 下載又很佔空間

Intel HAXM

沒有Android手機的話, 可以使用模擬裝置. 但效能極差, 且很多東西是無法執行的. 如果電腦是Intel的CPU, 可安裝HAXM提升一點點效能. 安裝方式同上, 啟動SDK Manager, 選取Extras/Intel x86 Emulator Accelerator(HAXM installer)

經由SDK 取得HAXM後, 需要手動執行安裝, 請到C:\Users\使用者登入帳號\AppData\Local\Android\sdk\extras\intel\Hardware_Accelerated_Execution_Manager, 然後執行intelhaxm-android.exe

上述安裝過程需正確執行,  否則Android 模擬器(AVD)無法執行

手機設定

請注意, 大部份的手機在 Win7 上都需安裝驅動程式. 如果沒有安裝驅動程式的話, 就無法使用adb和手機進行連線. 若是使用 Win10, 則大部份的手機都可認得, 不需驅動程式. 

1. 啟動開發人員選項

從手機的設定/關於手機/基頻版本按10下即可啟動. 但每個廠商的啟動方式不一樣, 有的要按核心版本, 有的要按版本號碼, 請自行測試. 啟動後即會看到開發人員選項

developer

2. USB偵錯

進入開發人員選項, 將USB偵錯打開

usb

3. 安裝usb 驅動程式

可於如下網址下載萬用驅動程式
https://developer.android.com/studio/run/win-usb

請注意, 上述萬用驅動程式於安裝時, 需選擇由磁片安裝, 若不從磁片安裝的話, 就無法成功安裝

另外, 也可以由Android Studio工具列之Tools/SDK Manager, 切換到SDK Tools, 再勾選 Google USB Driver.

usb

4. 與電腦連線

將USB傳輸線插入電腦與手機連接, 然後在手機端選取–傳輸檔案(MTP)

mtp

再於電腦端的DOS模式下執行adb shell.
此時手機端會出現連線要求, 請勾選一律允許透過這台電腦進行

connection

安裝此手機之驅動程式後, 若還是找不到此手機,請手動新增如下檔案
C:\Users\用户名\.android\adb_usb.ini,
加入0x15a2(此值需參考各家SOC廠之技術文件資料)

第一支Android App

請由Start a new Android Studio project 開始, 或由File/New/Project開始
Application name : HelloTest
Company name : 輸入自己的網址. 若沒網址, 到no-ip 申請一個吧, 這決定你日後的命運
Project Location : 慎選存放程式碼的資料夾

android_project

接下來, 選取所要適用的Android 版本, 然後一直按下一步, 直到Finish

android_setting_2

插上手機, 記得在手機上選MTP.
然後在電腦上按Shift+F10執行程式, 此時手機第一次會要求連線請求, 需核淮.
最後電腦上會出現手機型號, 按OK後,手機會詢問是否繼續安裝, 按下允許後, 即可在手機上看到你的第一支程式

 Android Virtual Device Manager

Android Studio 允許使用模擬裝置進行執行測試. 開發過程中, 雖說不建議使用AVD, 但有時為了測試其他解析度的裝置, 還是會拿來作版面UI的測試. 請由Tools/Android/AVD Manager進入設定

android_avd

按下Next後, 須選擇ABI, 請選取x86_64 image, 這會讓模擬器的效能比較好

android_abi

第一次啟動模擬器時, 會模擬開機過程, 速度比較慢.

GenyMotion

GenyMotion是一套在電腦上跑Android系統的摸擬器, 需要加裝 Oracle virtualbox(免費的). 是很多人用來追劇的神器. 有興趣的人可以自行下載試試

DDMS

Dalvik Debug Monitor Server,可以取得手機執行時的logcat, 方便偵測錯誤訊息
Tools/Android/Android Device Monitor/LogCat, 若無動作,需選下三角型/reset adb

android_debug

另一種更常用之方式, 為進入Dos Console模式下執行
adb logcat

Android API對照表

版本 名稱 API level Remark
2.2 Froyo 8 優格
2.3.3-2.3.7 Gingerbread 10 薑餅
4.03-4.04 Ice Cream Sandwich 15 冰淇淋三民治
4.1 Jelly Bean 16 雷根糖
4.2 Jelly Bean 17 雷根糖
4.3 Jelly Bean 18 雷根糖
4.4 KitKat 19 奇巧巧克力
5.0 Lollipop 21 棒棒糖
5.1 Lollipop 22 棒棒糖
6.0 Marshmallow 23 棉花糖
7.0 Nougat 24 牛軋糖
7.1 Nougat 25 牛軋糖

Min Sdk Version

Android 在發表新的版本時, 常會加入新的功能與元件. 所以一個應用程式如果使用了新版的功能, 則此App就不用在舊版的裝置上執行. 開發人員為了考慮相容性問題, 常需考慮可適用的最低版本. 要修改最低可適用版本, 請從File/Project Structure/app/Flavors 再更改MinSdk Version

android_minsdk

上述設定後, 會在Gradle Scrips下產生一個build.gradle(Module:app)的檔案, 裏面即有minSdkVersion 23這記錄. 若是直接修改這個數值, 則在儲存完後, 還要執行同步的工作. 請執行Tools/Android/Sync Project with Gradle Files

一支應用程式, 如果使用了minSdkVersion 23時, 表示這App只能適用在Android 6.0以上的裝置上. 所以當使用者使用Android 5.0的手機上Google play查詢時, 就無法查到這支App. 這是Google play的防制機制, 避免錯的手機在對的時間使用了錯的App(還蠻繞口的)

adb常用指令

adb device : 取得序號,查看是否與電腦連線
adb kill-server : 關閉adb daemon
adb start-server : 開啟adb daemon
adb logcat : 查看手機log
adb shell : 進入手機Linux shell
adb install xxx.apk : 安裝apk
adb uninstall package_name : 移除apk
查看package name : 大部份的手機是無效,因為permission denied, 由手機廠鎖定
adb shell
cd /data/data
ls

輸入字串到手機 :  adb shell input text “ANDROID”

輸入keycode 到手機 : adb shell input keyevent 54
Keycode 列表
00 ->  “KEYCODE_UNKNOWN”
01 ->  “KEYCODE_MENU”
02 ->  “KEYCODE_SOFT_RIGHT”
03 ->  “KEYCODE_HOME”
04 ->  “KEYCODE_BACK”
05 ->  “KEYCODE_CALL”
06 ->  “KEYCODE_ENDCALL”
07 ->  “KEYCODE_0”
08 ->  “KEYCODE_1”
09 ->  “KEYCODE_2”
10 ->  “KEYCODE_3”
11 ->  “KEYCODE_4”
12 -?  “KEYCODE_5”
13 ->  “KEYCODE_6”
14 ->  “KEYCODE_7”
15 ->  “KEYCODE_8”
16 ->  “KEYCODE_9”
17 ->  “KEYCODE_STAR”
18 ->  “KEYCODE_POUND”
19 ->  “KEYCODE_DPAD_UP”
20 ->  “KEYCODE_DPAD_DOWN”
21 ->  “KEYCODE_DPAD_LEFT”
22 ->  “KEYCODE_DPAD_RIGHT”
23 ->  “KEYCODE_DPAD_CENTER”
24 ->  “KEYCODE_VOLUME_UP”
25 ->  “KEYCODE_VOLUME_DOWN”
26 ->  “KEYCODE_POWER”
27 ->  “KEYCODE_CAMERA”
28 ->  “KEYCODE_CLEAR”
29 ->  “KEYCODE_A”
30 ->  “KEYCODE_B”
31 ->  “KEYCODE_C”
32 ->  “KEYCODE_D”
33 ->  “KEYCODE_E”
34 ->  “KEYCODE_F”
35 ->  “KEYCODE_G”
36 ->  “KEYCODE_H”
37 ->  “KEYCODE_I”
38 ->  “KEYCODE_J”
39 ->  “KEYCODE_K”
40 ->  “KEYCODE_L”
41 ->  “KEYCODE_M”
42 ->  “KEYCODE_N”
43 ->  “KEYCODE_O”
44 ->  “KEYCODE_P”
45 ->  “KEYCODE_Q”
46 ->  “KEYCODE_R”
47 ->  “KEYCODE_S”
48 ->  “KEYCODE_T”
49 ->  “KEYCODE_U”
50 ->  “KEYCODE_V”
51 ->  “KEYCODE_W”
52 ->  “KEYCODE_X”
53 ->  “KEYCODE_Y”
54 ->  “KEYCODE_Z”
55 ->  “KEYCODE_COMMA”
56 ->  “KEYCODE_PERIOD”
57 ->  “KEYCODE_ALT_LEFT”
58 ->  “KEYCODE_ALT_RIGHT”
59 ->  “KEYCODE_SHIFT_LEFT”
60 ->  “KEYCODE_SHIFT_RIGHT”
61 ->  “KEYCODE_TAB”
62 ->  “KEYCODE_SPACE”
63 ->  “KEYCODE_SYM”
64 ->  “KEYCODE_EXPLORER”
65 ->  “KEYCODE_ENVELOPE”
66 ->  “KEYCODE_ENTER”
67 ->  “KEYCODE_DEL”
68 ->  “KEYCODE_GRAVE”
69 ->  “KEYCODE_MINUS”
70 ->  “KEYCODE_EQUALS”
71 ->  “KEYCODE_LEFT_BRACKET”
72 ->  “KEYCODE_RIGHT_BRACKET”
73 ->  “KEYCODE_BACKSLASH”
74 ->  “KEYCODE_SEMICOLON”
75 ->  “KEYCODE_APOSTROPHE”
76 ->  “KEYCODE_SLASH”
77 ->  “KEYCODE_AT”
78 ->  “KEYCODE_NUM”
79 ->  “KEYCODE_HEADSETHOOK”
80 ->  “KEYCODE_FOCUS”
81 ->  “KEYCODE_PLUS”
82 ->  “KEYCODE_MENU”
83 ->  “KEYCODE_NOTIFICATION”
84 ->  “KEYCODE_SEARCH”
85 ->  “TAG_LAST_KEYCODE”

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *