导航

golang 移动应用例子 example/basic 源码框架分析

Posted on 2016-02-02 19:51  蝈蝈俊  阅读(754)  评论(0编辑  收藏  举报

条件编译

我们在源码中可以看到2个文件: main.go 和 main_x.go 这两个包名都是 package main , 都有 main 函数。 不会冲突么?

答案是不会的,

main_x.go 文件中有个注释:

// +build !darwin,!linux,!windows

main.go 文件中注释如下:

// +build darwin linux windows
这里来标示编译适用的不同环境。只有满足条件的才会被编译进去, 所以这里有2个 main 函数,编译并不冲突。

参考:

http://blog.csdn.net/varding/article/details/12675971 

http://dave.cheney.net/2013/10/12/how-to-use-conditional-compilation-with-the-go-build-tool 

Android应用启动入口

APK文件本身是一个压缩包,直接用解压工具即可打开,但里面的文件都已被编码为二进制文件格式,不能直接看,比如程序描述文件AndroidManifest.xml,使用apktool工具可以将这些文件解码还原出来。
apktool(http://code.google.com/p/android-apktool/  现在地址是: http://ibotpeaches.github.io/Apktool/ )是一个非常著名的开源工具包,功能很强大,可以解包APK文件并重新打包,常用来汉化Android应用。

apktool 安装方法请看: http://ibotpeaches.github.io/Apktool/install/

参考: http://kenkao.iteye.com/blog/1890497

使用这个工具我们可以看到basic.apk文件的 AndroidManifest.xml 文件的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="org.golang.todo.basic" android:versionCode="1" android:versionName="1.0"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:label="Basic" android:debuggable="true">
        <activity android:name="org.golang.app.GoNativeActivity" android:label="Basic" android:configChanges="keyboardHidden|orientation">
            <meta-data android:name="android.app.lib_name" android:value="basic" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

这个就是apk文件的执行入口,而不是做服务器段开发的 main 函数入口。

这里隐含的实现了 org.golang.app.GoNativeActivity 这个Activity。

 

具体这里的逻辑被封装在 golang.org/x/mobile/app 代码中。

主要的核心代码如下:

func main() {
    app.Main(func(a app.App) {
        for e := range a.Events() {
            switch e := a.Filter(e).(type) {
            case lifecycle.Event:
                // ...
            case size.Event:
                // ...
            case paint.Event:
                // ...
            case touch.Event:
                // ...
            }
        }
    })
}

image

不同的事件随后触发不同的函数。完成这些功能。

从字面理解就可以知道这几个事件是做啥的。

lifecycle.Event  Activity 生命周期相关的几个事件;

size.Event  屏幕尺寸变化相关事件

paint.Event  绘画屏幕的事件

touch.Event 触屏或者鼠标左键点击和移动事件