天天看點

用 Golang 開發 Android 應用(非 gomobile)(一 )—— 基本環境配置

用 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 。

  1. 下載下傳android-ndk-r16b-windows-x86_64.zip
  2. 解壓下載下傳的 android-ndk-r16b-windows-x86_64.zip 檔案
  3. 在解出的 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\ 目錄下
  4. 把 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 兩個目錄
  5. 把 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 就準備好了。

指令行環境設定和編譯

  1. 下載下傳 tools,取對應 windows 或 linux 版的 gomobile (linux 下要手動設定可執行權限),并把它的路徑同樣設定到環境變量 PATH 中
  2. 打開指令行,執行:
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
           
  1. 取gooid
go get github.com/gooid/gooid
           
  1. 測試編譯,依次執行下面的指令,最後生成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。