用 Golang 開發 Android 應用 -- 基本環境配置
-
-
- ——題記
- 計劃按以下的内容更新
- 基本環境配置
-
- Golang 和 android 有什麼關系?
- 基本 go 編譯環境
- Android 的 ndk 編譯器的配置
- 指令行環境設定和編譯
- 其它
-
——題記
遭遇經濟寒冬加上中年危機(看我在CSDN的注冊時間,就知道本人有多“少年”了^_^),是以履歷看得人多,有興趣聊聊的人少。有人會說是沒轉到管理的原因,哥可是10幾年的管理經驗!好了,還是開始正能量,既然暫時閑下來,是以打算把以前業餘做的一個東西給大家分享一下。要來就來獨特的(應新廣告法的要求,不能用絕對字眼 ^_^),有興趣的可以試試、玩玩。
計劃按以下的内容更新
- 基本環境配置
- 簡單 UI
- Storage 使用
- Sensor 使用
- Audio(openAL) 使用
- Camera 使用
- OpenCV 使用
基本環境配置
Golang 和 android 有什麼關系?
它們之間看似沒什麼關系,除了他們都是 google 出品。當然 go 支援編譯成 android 的可執行檔案和動态庫,是以一般 go 在 android 中應用場景是用來寫一些運作庫,背景服務或一些工具程式等。
現在讓我們來突破一下,如果想做個簡單應用,不管是用來和朋友之間私密聊天的應用,還是用來做個随身帶的小工具應用,或利用手機攝像頭、陀螺儀等各種sensor的優勢開發一些有創造力的應用,也可以是一些腦洞大開的應用。但是不會 Android 應用開發,一看到什麼 Android 4大元件,resources,layout 等等就不想繼續。
可以不用了解這些,跟我用 go 來寫應用吧。看完這篇之後,讓你寫 android 應用變得很簡單。特别是你本身 go 語言熟悉的話。當然不熟悉也沒關系,畢竟 go 是出了名的學習成本很低的語言。
用 go 怎樣寫 Android 應用?先直接看一個簡單的示例:
package main
import (
"log"
"github.com/gooid/gooid"
"github.com/gooid/gooid/input"
)
func main() {
context := app.Callbacks{
Event: event,
}
app.SetMainCB(func(ctx *app.Context) {
ctx.Run(context)
})
for app.Loop() {
}
log.Println("done.")
}
var bWallpaper = false
func event(act *app.Activity, e *app.InputEvent) {
if mot := e.Motion(); mot != nil {
if mot.GetAction() == input.KEY_EVENT_ACTION_UP {
log.Println("event:", mot)
bWallpaper = !bWallpaper
if bWallpaper {
act.SetWindowFlags(app.FLAG_SHOW_WALLPAPER, 0)
} else {
act.SetWindowFlags(0, app.FLAG_SHOW_WALLPAPER)
}
}
}
}
這就是一個Android應用所需要的代碼,是不是很簡單,可下載下傳編譯出的apk試試。
接下來自然是要講一講怎樣配置編譯環境了,我會基于 windows 7/10 64位系統來講(用 linux 系統也是可以的,參考 windows的步驟,作相應配置就好),準備一台 android 4.4(最好是 8.1)及以上版本的手機。
基本 go 編譯環境
先把基本的go編譯環境裝好,要求go1.10以上的版本。Golang 的安裝網上有太多教程,此處不表。注意需安裝 git ,在指令行中測試一下:
go version
git
驗證一下 go 環境是否正常運作。
Android 的 ndk 編譯器的配置
這裡先放個表:
GOARCH | TOOLPATH | LIBPATH | GCC_H | ABI |
---|---|---|---|---|
arm | arm-linux-androideabi-4.9 | arm | arm-linux-androideabi | armeabi OR armeabi-v7a |
arm64 | aarch64-linux-android-4.9 | arm64 | aarch64-linux-android | arm64-v8a |
386 | x86-4.9 | x86 | i686-linux-android | x86 |
amd64 | x86_64-4.9 | x86_64 | x86_64-linux-android | x86_64 |
連接配接手機或仿真,進指令行運作
adb shell getprop ro.product.cpu.abilist
(或是
adb shell getprop ro.product.cpu.abi
)檢視輸出結果。比如 Andorid 7.0 arm 仿真執行結果如下:
>adb shell getprop ro.product.cpu.abilist
armeabi-v7a,armeabi
現在看到 ABI 支援 armeabi-v7a 和 armeabi,我們可以標明其中一個為我們要生成應用的 ABI,一般選 armeabi 或 x86 (因為 64 位的手機一般相容 32 位)。确定 ABI 之後通過上表就可得到相對應的如 TOOLPATH, GOARCH 等的值,按 Windows 的表示法以下用 %TOOLPATH% 表示相應的值,如 ABI 為 armeabi 時 %TOOLPATH% 是 arm-linux-androideabi-4.9 。
- 下載下傳android-ndk-r16b-windows-x86_64.zip
- 解壓下載下傳的 android-ndk-r16b-windows-x86_64.zip 檔案
- 在解出的 android-ndk-r16b\toolchains 目錄看到幾個 ???-4.9 的目錄,其中就包括了 android-ndk-r16b\toolchains\toolchains%TOOLPATH%\ , 把 android-ndk-r16b\sysroot 拷貝到android-ndk-r16b\toolchains\toolchains%TOOLPATH%\prebuilt\windows-x86_64\ 目錄下
- 把 android-ndk-r16b\platforms\android-%SDK_API%\arch-%LIBPATH%\usr\lib 拷貝到 android-ndk-r16b\toolchains\toolchains%TOOLPATH%\prebuilt\windows-x86_64\sysroot\usr\ 目錄下
- 如果沒有這個目錄就是上一步做錯了
- 這時android-ndk-r16b\toolchains\toolchains%TOOLPATH%\prebuilt\windows-x86_64\sysroot\usr\ 目錄下應該有 include 和 lib 兩個目錄
- 把 android-ndk-r16b\toolchains\toolchains%TOOLPATH%\prebuilt\windows-x86_64\sysroot\usr\include%GCC_H%\asm 拷貝到 android-ndk-r16b\toolchains\toolchains%TOOLPATH%\prebuilt\windows-x86_64\sysroot\usr\include\ 目錄下
把 android-ndk-r16b\toolchains\toolchains%TOOLPATH%\prebuilt\windows-x86_64\bin 的完整路徑加到環境變量PATH中
在指令行下面可以運作
%GCC_H%-gcc -v
,說明 NDK 就準備好了。
指令行環境設定和編譯
- 下載下傳 tools,取對應 windows 或 linux 版的 gomobile (linux 下要手動設定可執行權限),并把它的路徑同樣設定到環境變量 PATH 中
- 打開指令行,執行:
set GOPATH=???
set GOOS=android
set CGO_ENABLED=1
set CGO_CFLAGS=-D__ANDROID_API__=%SDK_API%
set GOARCH=%GOARCH%
set CC=%GCC_H%-gcc
- 取gooid
go get github.com/gooid/gooid
- 測試編譯,依次執行下面的指令,最後生成out\wallpapertwinkle.apk
cd %GOPATH%\src\github.com\gooid\gooid\examples\WallPaperTwinkle
go build -buildmode c-shared -o basic\lib\%ABI%\libWallPaperTwinkle.so
gomobile build -o out\wallpapertwinkle.apk basic
至此環境終于設定完成,可以開始寫你自己的APK了。
補充:關于 clang 編譯環境的配置 更簡單的配置。
其它
- 這是個實驗性的項目,不建議商用,主要用來交流學習。
- 感謝 google , 特别是 golang/mobile
- 關于配置步驟,其實可以用go寫個自動配置,但我還是希望把步驟寫出來,讓需要的人了解是以然。
- 其實可以把 android-ndk-r16b\toolchains\toolchains%TOOLPATH%\prebuilt\windows-x86_64 移(move)到其它目錄下如 ndk%TOOLPATH% 并且android-ndk-r16b可以删除了。記得修改PATH。