遭遇经济寒冬加上中年危机(看我在CSDN的注册时间,就知道本人有多“少年”了^_^),所以简历看得人多,有兴趣聊聊的人少。有人会说是没转到管理的原因,哥可是10几年的管理经验!好了,还是开始正能量,既然暂时闲下来,所以打算把以前业余做的一个东西给大家分享一下。要来就来独特的(应新广告法的要求,不能用绝对字眼 ^_^),有兴趣的可以试试、玩玩。
它们之间看似没什么关系,除了他们都是 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编译环境装好,要求go1.10以上的版本。Golang 的安装网上有太多教程,此处不表。注意需安装 git ,在命令行中测试一下:
go version
git
验证一下 go 环境是否正常运行。
这里先放个表:
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\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%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 就准备好了。
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
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 编译环境的配置 更简单的配置。