当前位置:   article > 正文

android记账程序源码_第一个fuchsia上c++程序

fuchsia hello-world

8cced78d4df4496a9354be6c8b97a639.png

第一个fuchsia上c++程序

linux主机上 借助于qemu把fuchsia系统跑起来了,接下来就 搞个小程序在上面跑一跑吧

在fuchsia的源码树里已经有一些示例代码了,位于fuchsia/examples/下

e3b9bff0263f52b3ded18adee1b1af96.png

最简单的当然是hello_world的, 里面有个 c++版本和rust版本的hello world

3f654e3e193e629644d27796dfb6502b.png

还真的只是hello_world

4d9ffecff4f626582bf9bec279a895da.png

我仿照这个hello_world,写个自己的小程序试试

编写代码

  • 在examples目录下 建立一个文件夹,命名为first
  • 创建一个http://first.cc文件,把简单的代码写了

f0836e7ad16119e6622f6db043e06009.png
  • 创建对应的编译gn文件, gn文件是生成ninja的配置, ninja是一套构建工具,而gn是元构建工具,生成ninja

3921267a363dc70784f5368627b916b7.png
  • 编写项目配置文件first_cpp.cmx,放到meta目录下, 官方说法是Component manifest, 作用类似android应用里的AndroidManifest.xml文件

433f27f5ba3dfa6f0616085624a9393a.png

编译应用程序

有两种方法编译应用程序,一是用fuchsia的sdk, 二是直接在源码树里编译应用

sdk的获取

可以直接下载一份sdk,但是要考虑到这个系统还在开发中,我们本地的fuchsia源码和下载的sdk不一定是完全匹配的。这时可以选择自己编译一份sdk, 用这个

  1. fx set core.x64 --args=build_sdk_archives=true
  2. fx build

参考

https://9to5google.com/2018/12/14/fuchsia-friday-sdk-download/

https://fuchsia.dev/fuchsia-src/development/sdk/download

在源码树里进行编译

首先需要将first包含进build,命令如下:

  • 在源码树下准备编译, 把工程加入到编译选项里,报错了

f25248b0639c17af64b639e0dab938dc.png


这个错误说明不能随意加一个包方法源码树里,它会检查这个包是否是在visibility list里。那如果我一定要的话,需要把first加入到visibility list里, 修改 build/BUILD.gn文件,格式是 路径+包

8f3f0219784435493ac2d2fdc75524cc.png


继续,这下成功了

da177f159c1feadc7802238242a39a7b.png
  • 编译

70f3e6a63e0d410fdcd8fb3681775d0f.png

运行

启动一个fx serve, 这个东西怎么理解呢, 它类似于 android开发的adb , PC机和android连接靠的是adb工具,adb会在PC机上运行一个server进程和android系统通信。 同理,和fuchsia系统通信就要用这个fx serve。

启动一个shell,执行如下命令:

 fx serve

这时候 阻塞在 discovery这里, 表示在等待fuchsia设备

d2756ebdca7b17ab89a1371c8b4acbdf.png

启动fuchsia, 在开一个shell窗口,执行如下命令

 fx qemu -N

这里的 -N表示启动网络, 必须要有的,不然无法fuchsia系统不会和 serve连接。

系统启动完毕后,就会发现 serve那个窗口是这样的,表示serve和qemui的fuchsia建立连接了。

f61ea83bad28e64307320c2830479282.png

这时, 再开一个shell,窗口执行fx shell, 这个就类似android里的adb shell, 能够进入到fuchsia的shell

3bbfaf2cb6e582e58db4d14f09054bc2.png

用locate命令查找下 first在哪里

用run命令执行

9e92d305196ad2b552c0a378d9ef380c.png

断点调试

fuchsia上有个叫zxdb的工具,用于调试c/c++程序。 参考 zxdb: Fuchsia native debugger

  • 另起一个shell,执行fx debug, 这个是启动了zxdb(类似gdb一样的调试器)
    fx debug
  • 把目标进程first添加到调试器的列表里, 这样当first启动时自动就attach上了。
    attach first
  • 给main函数上断点
    b main
  • 执行first
    fx shell run fuchsia-pkg://http://fuchsia.com/first_cpp#meta/first_cpp.cmx
  • 开始打断点和单步调试, 这个和gdb基本一样了

完成过程如图

112434f667fddb89f5a96ea3efb8a5f0.png

35b7299005f5ba2878d9e7323ff89620.png

参考文档来自官方的fuchsia dev fuchsia debug

打印log

在fuchsia系统里,打印log的几种模式

  • the LogSink service,用户层的log打印
  • the kernel's debuglog, 内核的log打印
  • a combination of these, routed through stdout or stderr, 直接在终端输出

显然,我需要使用的是logsink service, 参考官方文档 Syslog

第一步, 要在Component manifest里加上依赖log service。

f7097294056418fd31cd71bd22c9de8b.png

第二步, 在first的编译配置文件BUILD.gn,加上编译链接依赖(第16行)

3721c315c0b50dc5ffec53778e9b29db.png

第三步,写代码吧, 注意要加的头文件

472f8dca265b0bb029030ea592bc6d48.png

第四步, 分别是fx build编译和 fx shell run运行

a76ef84e69f048f7a8395c5d451e9ef9.png

运行结束了, 去哪里看log呢? 查下官网, 用fx log, 默认情况下log tag是manifext文件的名,这里就是first_cpp.cmx了

83b1ef6e950210e0bf6800978d1d47b9.png

小结

这个新fuchsia系统很多操作其实和linux,android有类似的地方,使用起来也还算顺手。

比如 

  • debug工具和gdb类似;
  • fx log和android的adb logcat类似;
  • 包配置文件cmx和android 的AndroidManifext.xml类似;
  • 编译链工具用gn,更简单性能更好。这个编写比android.mk简单,性能目前还不好说。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/311123
推荐阅读
相关标签
  

闽ICP备14008679号