手機元年
西元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 系統架構與運作
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)
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
安裝 : 一直按下一步. 注意請選用JDK8, 若使用JDK5, Layout UI無法顯示
Android Studio下載安裝
下載 : Android Studio 下載後, 一直按下一步
Path 設定
將C:\Users\登入帳號\AppData\Local\Android\sdk\platform-tools 整個路徑複制起來
於開始/電腦按右鍵/內容/進階系統設定/環境變數/點選path/編輯
將複制的路徑貼於Path環境變數中, 記得還要加上 “;”
測試
啟動DOS視窗 : 開始/執行/cmd, 然後打入指令 adb, 如果出現如下畫面, 即表示設定成功
Android Studio 設定
Android Studio 的設定, 可以啟動視窗的Configure/Preferences進入. 或是在開啟專案後, 由File/Settings進入
程式碼行號顯示
進入Editor/Apperance, 勾選Show line numbers
設定字体大小
在Editor/Color & Fonts/Font中, 需先按Save As…儲存檔案後, 才能改變Size
Ctrl+Mouse滾輪
設定可以使用Ctrl+滑鼠滾輪改變字体大小, 請由File/Setting/Editor/General, 勾選 Change font size(Zoom) with Ctrl+Mouse Wheel
SDK Manager設定
為了日後針對不同版本的Android 裝置進行程式編碼, 建議下載不同的sdk-Build tools.
可直接執行 C:\Users\登入帳號\AppData\Local\Android\sdk\SDK Manager.exe
將Tools打勾, 並按下Install packages
在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下即可啟動. 但每個廠商的啟動方式不一樣, 有的要按核心版本, 有的要按版本號碼, 請自行測試. 啟動後即會看到開發人員選項
2. USB偵錯
進入開發人員選項, 將USB偵錯打開
3. 安裝usb 驅動程式
可於如下網址下載萬用驅動程式
https://developer.android.com/studio/run/win-usb
請注意, 上述萬用驅動程式於安裝時, 需選擇由磁片安裝, 若不從磁片安裝的話, 就無法成功安裝
另外, 也可以由Android Studio工具列之Tools/SDK Manager, 切換到SDK Tools, 再勾選 Google USB Driver.
4. 與電腦連線
將USB傳輸線插入電腦與手機連接, 然後在手機端選取–傳輸檔案(MTP)
再於電腦端的DOS模式下執行adb shell.
此時手機端會出現連線要求, 請勾選一律允許透過這台電腦進行
安裝此手機之驅動程式後, 若還是找不到此手機,請手動新增如下檔案
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 版本, 然後一直按下一步, 直到Finish
插上手機, 記得在手機上選MTP.
然後在電腦上按Shift+F10執行程式, 此時手機第一次會要求連線請求, 需核淮.
最後電腦上會出現手機型號, 按OK後,手機會詢問是否繼續安裝, 按下允許後, 即可在手機上看到你的第一支程式
Android Virtual Device Manager
Android Studio 允許使用模擬裝置進行執行測試. 開發過程中, 雖說不建議使用AVD, 但有時為了測試其他解析度的裝置, 還是會拿來作版面UI的測試. 請由Tools/Android/AVD Manager進入設定
按下Next後, 須選擇ABI, 請選取x86_64 image, 這會讓模擬器的效能比較好
第一次啟動模擬器時, 會模擬開機過程, 速度比較慢.
GenyMotion
GenyMotion是一套在電腦上跑Android系統的摸擬器, 需要加裝 Oracle virtualbox(免費的). 是很多人用來追劇的神器. 有興趣的人可以自行下載試試
DDMS
Dalvik Debug Monitor Server,可以取得手機執行時的logcat, 方便偵測錯誤訊息
Tools/Android/Android Device Monitor/LogCat, 若無動作,需選下三角型/reset adb
另一種更常用之方式, 為進入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
上述設定後, 會在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”