——题记

遭遇经济寒冬加上中年危机(看我在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 编译器的配置

这里先放个表:

GOARCHTOOLPATHLIBPATHGCC_HABI
armarm-linux-androideabi-4.9armarm-linux-androideabiarmeabi OR armeabi-v7a
arm64aarch64-linux-android-4.9arm64aarch64-linux-androidarm64-v8a
386x86-4.9x86i686-linux-androidx86
amd64x86_64-4.9x86_64x86_64-linux-androidx86_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 。

  1. 解压下载的 android-ndk-r16b-windows-x86_64.zip 文件

  2. 在解出的 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\ 目录下

  3. 把 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 两个目录
  4. 把 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

命令行环境设置和编译

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

其它

  • 这是个实验性的项目,不建议商用,主要用来交流学习。
  • 感谢 google , 特别是 golang/mobile
  • 关于配置步骤,其实可以用go写个自动配置,但我还是希望把步骤写出来,让需要的人了解所以然。
  • 其实可以把 android-ndk-r16b\toolchains\toolchains%TOOLPATH%\prebuilt\windows-x86_64 移(move)到其它目录下如 ndk%TOOLPATH% 并且android-ndk-r16b可以删除了。记得修改PATH。