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命令, 生成aar和jar包
gomobile bind -target android -o ./bin/hello.aar ./src/hello
-o xxx/xxx.aar这里后缀必要使用aar
注意事项
gomobile编译生成aar和jar时,文件包含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值,再拿去与服务器比对,以监测自身是否被恶意篡改