gomobile

1,431 阅读2分钟

gomobile 开发小结

可以使用Golang进行一部分的移动端开发满足跨平台的需求。

  • 使用场景

目前碰到了一个场景需要安卓设备要当客户端又要当服务器。在一个教室里,教学的大屏使用安卓的触摸屏。手机需要连接大屏进行一些教学操作,比如:投屏、上传文件到大屏显示。

android系统上可以使用NanoHttpd 轻量级的服务器做一些简单的HTTP请求协议。但安卓开发需要懂一点后台的技术栈,这个需要安卓有一定的学习能力,另外复杂的通信比如:WebSocket通信不支持。

后面找到gomobile这个库。可以后台人员使用golang进行独立开发调试(另外部署到linux服务器,最后跟安卓做集成)。优点是安卓开发不用碰后台这块儿的业务。

使用

  • 安装

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

  • 编译 gomobile

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

  • 初始化环境,自动下载安装依赖

gomobile init

若提示没有找到NDK,根据提示的路径把NDK包复制过去即可

  • 执行 bind 命令, 生成 aarjar
gomobile bind -target android -o ./bin/hello.aar  ./src/hello

-o xxx/xxx.aar 这里后缀必要使用 aar

注意事项

  • gomobile编译生成 aarjar时,文件包含main函数会报错
  • android中调用的方法首字母必须大写
  • gomobile不能调用sqlite数据库
  • Android默认程序是可以访问一个data的目录的,一般的在/data/user/0/<package>/files
  • 一般情况下,这个目录只有你的App可以访问,像(root, system用户)也是可以访问的
  • 需要落地的数据可以放置于这里,不过最好落地的数据加密一下
  • 如果你的担心你的App权限不足,且你是嵌入式底层App开发的话,建议使用系统签名
  • 如果使用了系统签名,需要在AndroidManifest.xml上添加android:sharedUserId="android.uid.system"才实际生效
  • 系统签名后的UID是1000,可以在程序启动之后os.Getuid() 取到

安全方面:

  • Android的JNI路径,可以通过Java层上的getApplicationInfo().nativeLibraryDir取到
  • 一般像这样子: /data/app/<package>-1/lib/arm64/
  • gomobile编译出来的jni动态库是libgojni.so

可以基于这个,计算一下自身的md5值,再拿去与服务器比对,以监测自身是否被恶意篡改