——题记
遭遇经济寒冬加上中年危机(看我在CSDN的注册时间,就知道本人有多“少年”了^_^),所以简历看得人多,有兴趣聊聊的人少。有人会说是没转到管理的原因,哥可是10几年的管理经验!好了,还是开始正能量,既然暂时闲下来,所以打算把以前业余做的一个东西给大家分享一下。要来就来独特的(应新广告法的要求,不能用绝对字眼 ^_^),有兴趣的可以试试、玩玩。
计划按以下的内容更新
基本环境配置
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.abilistadb shell getprop ro.product.cpu.abi
>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\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\ 目录下
%GCC_H%-gcc -v
命令行环境设置和编译
- 下载 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
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了。
其它
- 这是个实验性的项目,不建议商用,主要用来交流学习。
- 感谢 google , 特别是 golang/mobile
- 关于配置步骤,其实可以用go写个自动配置,但我还是希望把步骤写出来,让需要的人了解所以然。
- 其实可以把 android-ndk-r16b\toolchains\toolchains%TOOLPATH%\prebuilt\windows-x86_64 移(move)到其它目录下如 ndk%TOOLPATH% 并且android-ndk-r16b可以删除了。记得修改PATH。