GoMobile Android 开发

14,382 阅读2分钟
原文链接: songhang.club

GoMobile现为google实验项目,尚未提供用户最终版。支持ios & android双平台,支持全部用go来写app (all-Go app),
(all-Go app目前仅支持OPEN GL绘制界面),支持java、Object-C互调 (go libraries).

github: github.com/golang/mobi…

wiki: github.com/golang/go/w…

gobind: godoc.org/golang.org/…

GoMobile配置

默认Go环境已配置完成, Go环境配置不再赘述。

自动安装

$ go get golang.org/x/mobile/cmd/gomobile

坑:需科学上网,可能会校验证书失败,笔者在公司网络未能成功下载。

手动安装

download

下载成功后改文件名为mobile, copy到$GOPATH/src/golang.org/x/

$ git clone https://github.com/golang/mobile

build

build gomobile成功后会在$GOPATH/bin目录生成gomobile可执行程序,(执行过程中可能出现权限被拒,添加对应权限即可),copy gomobile程序至/usr/local/go/bin/目录,即可执行gomobile命令。

$ go build golang.org/x/mobile/cmd/gomobile

init

初始化环境,自动下载安装依赖,需要翻墙,可能会提示权限被拒,添加对应文件权限。

$ gomobile init

config ndk

可能会提示” No android NDK path is set “错误。解决办法如下:

因gomobile init未同时下载ndk,所以需要手动下载ndk环境,然后执行

$ gomobile init -ndk ~/Library/Android/sdk/ndk-bundle/

末尾路径为ndk安装路径,针对自己安装目录选择。

All-GO APP

google demo, 源码目录: golang.org/x/mobile/example/basic

编译 Android Demo

$ gomobile build -target=android golang.org/x/mobile/example/basic

运行 Android Demo

确认adb已经识别手机

$ gomobile install golang.org/x/mobile/example/basic

安装成功后,即可打开一个随手势移动的三角形程序。

Go Libraries

google demo, 源码目录: golang.org/x/mobile/example/bind/

android目录为android studio project, hello目录为go libs源码

Go libs创建

GOPTAH中创建libs目录存放go源码 [对应demo中golang.org/x/mobile/example/bind/hello]

// 网络请求,输入url,返回responsepackage helloimport (    "fmt"   "net/http"  "io/ioutil")func Greetings(url string) string { resp, err := http.Get(url)  if err != nil {     return fmt.Sprintf("error: %s", err)    }   b, err := ioutil.ReadAll(resp.Body) resp.Body.Close()   if err != nil {     return fmt.Sprintf("error: %s", err)    }   return fmt.Sprintf("Hello, %s!", b)}

android配置

Libs Module

创建libs module[对应demo中golang.org/x/mobile/example/bind/android/hello],app module对其依赖

libs module建立go源码依赖, build文件配置如下

/* bind 插件 */plugins {    id "org.golang.mobile.bind" version "0.2.6"}gobind {    /* go libs 目录 */    pkg = "golang.org/x/mobile/example/bind/hello"    /* gopath 目录 */     GOPATH = "/Users/hangsong/go"    /* gobin 目录 */     GO = "/usr/local/go/bin"    /* gombile 目录 */     GOMOBILE = "/usr/local/go/bin/gomobile"}

App Module

build完成后,在MainActivity调用go libs代码

package org.golang.example.bind;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import hello.Hello;

public class MainActivity extends Activity {

private TextView mTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     mTextView = (TextView) findViewById(R.id.mytextview);

     // Call Go function.
     String greetings = Hello.greetings("http://baidu.com");
      mTextView.setText(greetings);
  }
}

添加联网权限,程序run起来后,将能看到网络返回信息显示.

总结

go语言已在服务端大放异彩,七牛、头条、阿里已经证明了go的先天优势,
代码简洁,格式统一,语法简练,多核心高并发,
提高开发效率的同时,兼备媲美C,C++的运行速度,势必会成为下一代经典语言!

现阶段go在移动领域仅支持OpenGl绘制界面,仍无法撼动java,Object-C地位,
但是有着google的加持,相信不久的将来在android领域会替换java,被人诟病的android响应速度,定会得到质的提升!