综述

Flutter从架构上来说有3部分:

  • 用Dart写的Framework层,面向开发者
  • 用Java/Kotlin写的Embdder层(For Android,iOS是OC/Swift),纯Flutter App不需要关心
  • 用C++写的Engine层,提供Dart运行环境和底层绘制能力

针对每个部分,对应的源码阅读环境不同,调试方法也不同。

对于阅读环境,最重要的是能够正确地完成调用/定义的跳转

对于调试环境,最重要的是能够设置断点,单步执行

Framework环境配置

Framework的环境设置比较简单。

源码阅读

Framework的代码在 https://github.com/flutter/flutter 下面,直接Clone下来。

亲测安装了Flutter插件的Android Studio是最好的阅读工具,直接打开./packages/flutter 目录,然后flutter pub get即可。

这一步可能报错,主要是一些的版本冲突,按照信息解决即可。

源码调试

通过Flutter Acttach按钮即可开始调试,但是如果要调试启动部分的Dart代码,用Debug而不是Run来启动程序:


Embedder环境配置

Embedder的环境稍微复杂一点。

源码阅读

Embedder的代码在engine的./shell/platform下面:

tree -L 1.├── BUILD.gn├── android├── common├── config.gni├── darwin├── embedder├── fuchsia├── glfw├── linux└── windows

用AS直接打开android目录即可,打开后会发现代码都无法解析对,这样就没法跳转了!!!

首先把根目录设置为Source类型:


这时候只剩androidx无法解析了:


发现旁边一个目录已经声明了依赖,于是按照提示,建立一个local.properties文件,指出本地sdk路径即可,然后执行Gradle命令,拉取更新:


后来查看文档,发现其实另外一个目录已经有这些依赖了,直接在工程设置页面添加一个classpath即可:

../third_party/android_embedding_dependencies/

这个目录是在engine外,buildroot下的,应该是之前gclient sync的时候就解析build.gradle拉下来的。

源码调试

如果在打开Flutter的工程,打开Andorid的Activity是解析错误的:


需要以android作为根目录单独打开,然后通过Run/Debug按钮再次启动即可:


这里单独打开工程无需担心如何集成Flutter,gradle脚本已经搞定了。

Engine环境配置

Engine的配置是最复杂的。

源码阅读

把gn工具在src/out 目录生成的compile_commands.json文件移到src/flutter目录下,然后用CLion打开这个文件就可以正确索引Engine的C++代码了。


该文件是预编译生成的索引,其他编辑器也可以支持,当然用CLion是最方便的。

源码调试

官方提供了gdb的调试方法,但是没有文档,按照代码注释的文档,也无法运行成功,一直报下面的错误:

Could not find platform independent libraries Could not find platform dependent libraries Consider setting $PYTHONHOME to [:]ImportError: No module named site

看到网上有人已经在用lldb调试了,于是也按照这个思路成功了,

首先是把Android SDK的lldb-server push到设备,建立一个信道,通过run-as绕过权限问题:

# 注意换成自己的包名adb push lldb-server /data/local/tmp/lldb-server

adb shell run-as com.example.flutter_demo \cp -F /data/local/tmp/lldb-server /data/data/com.example.flutter_demo/lldb-server

adb shell run-as com.example.flutter_demo \chmod a+x /data/data/com.example.flutter_demo/lldb-server

adb shell "run-as com.example.flutter_demo sh -c '/data/data/com.example.flutter_demo/lldb-server platform --server --listen unix-abstract:///data/data/com.example.flutter_demo/debug.socket'"

通过以上几步已经建立可以调试的通道了,然后启动lldb,attach到指定进程(通过进程id),然后添加符号表:

adb shell pidof com.example.flutter_demolldb(下面是lldb环境)(lldb) platform select remote-android(lldb) process attach -p 25382(lldb) add-dsym ~/WorkProject/flutter_source_code/src/out/android_debug_unopt_arm64/libflutter.so

之前就注意到构建目录下的这个so非常大,打包的so不过10M,这个接近300M,应该是存在大量调试信息。


这里有两个坑:

  1. lldb进去之后,进程会挂起,必须用c/continue来恢复,不然无法触发逻辑,也就无法触发断点
  2. 必须在System.loadLibrary之后才能添加符号表,否则失败,如果还是失败,就把以上流程重试一遍~

如此,便可以开始调试了,下面演示在帧刷新位置设置断点,然后触发:


总结

以上便是Flutter源码阅读/调试环境的搭建,欲善其事,先利其器,后面就要开始真刀真枪撸源码了。

参考

  • engine/flutter_gdb at master · flutter/engine
  • Debugging the engine · flutter/flutter Wiki
  • Debugging Flutter apps - Flutter
  • Debugging Flutter apps programmatically - Flutter
  • Using an OEM debugger - Flutter
  • 如何调试Android Native Framework
  • Flutter Engine C++ 源码调试初探
  • Android 调试桥 (adb)  |  Android 开发者  |  Android Developers

as工程放到源码编译_Flutter源码剖析(二):源码的阅读与调试环境配置相关推荐

  1. flutter 真机无法调试 sdk报错_Flutter源码剖析(二):源码的阅读与调试环境配置

    综述 Flutter从架构上来说有3部分: 用Dart写的Framework层,面向开发者 用Java/Kotlin写的Embdder层(For Android,iOS是OC/Swift),纯Flut ...

  2. [android源码下载索引贴】微信+二维码那都不是事......

    微信: Android 简单仿微信朋友圈布局2014/09/02 http://www.eoeandroid.com/thread-542738-1-1.html [代码片段] 高仿摇一摇效果 201 ...

  3. 直播视频app源码,Android 点击生成二维码

    直播视频app源码,Android 点击生成二维码实现的相关代码 activity.xml代码如下: <?xml version="1.0" encoding="u ...

  4. zxing 生成二维码,可设置logo、二维码颜色、白边大小

    主要是使用google的zxing 生成二维码,可设置logo.二维码前景色/后景色.白边大小.二维码大小 1.用到jar包 <dependency><groupId>com. ...

  5. asp.net 后台生成二维码及生成带logo的二维码

    asp.net 后台生成二维码及生成带logo的二维码,此处将生成二维码和带Logo的二维码写在一起的,需要自己区分一下. 直接上代码 using System; using System.Colle ...

  6. js 将微信二维码转为url,qrcodeJs解析二维码,qrcode.decode is not a function报错

    前言 工作中遇到的需求:用户上传相册中选中的图片,判断这个图片里的二维码是不是微信二维码,如果是则上传到服务器:不是,则提示用户重新上传. 百度了下,qrcode.js是一个用于生成二维码的 Java ...

  7. Android中 自定义logo二维码绘制(仿微信QQ二维码)

    自定义Logo二维码绘制(追加上一篇简单二维码绘制) 1.实现思路 2.实现(新增拍照以及相册上传logo以及分享和保存二维码) 简单绘制二维码地址: Android 实现简单绘制二维码(包含带LOG ...

  8. AR.js开发问题详解(二维码识别不出来及AR二维码如何进行训练)

    AR.js开发问题详解(二维码识别不出来及AR二维码如何进行训练) 1.      大家碰到的很多都是二维码识别不出来的情况. 原因:周围环境的光太强或太暗,遮挡了二维码的信息,摄像头识别不到全部的信 ...

  9. 实现扫描二维码和生成带logo的二维码

    欢迎来到风的博客 今天讲的是如何引用google的zxing库实现扫描二维码和生成带logo的二维码,源码库可以从github上下载[https://github.com/zxing/zxing];在 ...

最新文章

  1. 适用于Mac上的SQL Server
  2. 深度学习NN、CNN、RNN、和DNN你了解吗?
  3. 将一个数组输出到模板中来处理2
  4. 计算机视觉Computer Vision网址导航
  5. HTTP中request请求参数的设置
  6. DeepLearning:pydot安装的使用和安装
  7. presto 连接mysql,Presto等同于MySQL group_concat
  8. proxool java_Java应用中使用Proxool
  9. 通用编程_通用编程准则
  10. udf提权 udf.php,UDF提权
  11. Java序列化机制原理,java面试题,java基础笔试题,BAT
  12. Python:获取代码运行时间方法
  13. JAVA学习笔记——JAVA基础语法(二)
  14. 学python能赚钱吗-自学Python三个月能赚钱吗?
  15. 支付宝宣布刷脸支付将全面接管扫码支付
  16. Qos介绍及功能->分类标记->流量管理(令牌桶)->拥塞管理与拥塞避免
  17. python爬虫之一:爬取网页小说(魂破九天)
  18. PayPal完成对区块链公司的投资首秀
  19. 用c语言反向输出5ge字符,C语言入门:05.scanf函数
  20. C++语言基础——C++一本通:C++语言入门 1005:地球人口承载力估计

热门文章

  1. 聚类分析在用户行为中的实例_用户关注行为数据分析过程详解-描述统计+聚类...
  2. 在C ++中使用getter和setter函数创建具有X和Y轴的类Point
  3. java对数组进行排序_用Java对数组进行排序所需的最少交换
  4. 工程中多个不同类型线程池_软件工程中不同类型的设计策略
  5. ReactNative实现图集功能
  6. c++实现插入和冒泡排序
  7. 动感灯箱制作流程培训_2000多年的灯箱发展史,你知道多少?
  8. df添加一行 python_Python为输出的数据绘制表格
  9. java解析xml中文字符乱码_Eclipse读取xml中文乱码问题解决
  10. dos 改某个目录下所有文件的时间_go语言入门学习笔记(2)-DOS操作及go语言变量学习...